struct unigi_ext_type_texture { unigi_type_resolution_2d_coord width; unigi_type_resolution_2d_coord height; unigi_type_color lq_color; unigi_type_color * pixels; }; typedef struct unigi_ext_type_texture unigi_ext_type_texture; struct unigi_ext_type_rect { unigi_ext_type_2d_coord x1; unigi_ext_type_2d_coord y1; unigi_ext_type_2d_coord x2; unigi_ext_type_2d_coord y2; }; typedef struct unigi_ext_type_rect unigi_ext_type_rect; void unigi_ext_rect_dimensions( unigi_ext_type_rect bounds, unigi_ext_type_2d_coord * width, unigi_ext_type_2d_coord * height ) { *width = abs(bounds.x2 - bounds.x1); *height = abs(bounds.y2 - bounds.y1); } #define unigi_ext_texture_fixedpointdepth 8 void unigi_ext_texture_draw( unigi_ext_type_texture tex, unigi_ext_type_texture buffer, unigi_ext_type_rect texbounds, unigi_ext_type_rect bufbounds ) { unigi_ext_type_2d_coord texwidth; unigi_ext_type_2d_coord texheight; unigi_ext_type_2d_coord outwidth; unigi_ext_type_2d_coord outheight; unigi_ext_type_2d_coord x; unigi_ext_type_2d_coord y; unigi_type_resolution_1d_coord texi; unigi_type_resolution_1d_coord bufi; unigi_ext_type_2d_coord stepx; unigi_ext_type_2d_coord stepy; unigi_ext_type_2d_coord texx; unigi_ext_type_2d_coord texy; unigi_ext_rect_dimensions(texbounds, &texwidth, &texheight); unigi_ext_rect_dimensions(bufbounds, &outwidth, &outheight); // We precalculate the step through the texture to avoid division and // multiplication per pixel. We also expand the range so we can use // integers. By using 256, we are essentially adding 8 bits of "decimal // point". If you need more bits (or less), just change this to some other // power of 2. stepx = (1 << unigi_ext_texture_fixedpointdepth) * (float)texwidth / outwidth; stepy = (1 << unigi_ext_texture_fixedpointdepth) * (float)texheight / outheight; texx = (1 << unigi_ext_texture_fixedpointdepth) * texbounds.x1; texy = (1 << unigi_ext_texture_fixedpointdepth) * texbounds.y1; //log("%f,%f step %f,%f", texx, texy, stepx, stepy); // Buffer is R G B for each pixel, then across then down. If you want X, Y, // it's: 3 * (x + y * width) for(y = bufbounds.y1; y < bufbounds.y2; y++) { texx = texbounds.x1; for(x = bufbounds.x1; x < bufbounds.x2; x++) { // And then with the shift, it is log2(256), or whatever you shifted // by up there. So 512 would be 9, because 2^9 = 512 texi = (texx >> unigi_ext_texture_fixedpointdepth) + tex.width * (texy >> unigi_ext_texture_fixedpointdepth); // 'texy >> FIXEDPOINTDEPTH' could be calculated per y-iteration bufi = x + y * buffer.width; // 'y * buffer.width' could be calculated per y-iteration buffer.pixels[bufi] = tex.pixels[texi]; texx += stepx; bufi += 1; } texy += stepy; } }