Initial commit

This commit is contained in:
Fierelier 2024-07-31 22:05:51 +02:00
commit cf21dd85c6
3 changed files with 84 additions and 0 deletions

9
LICENSE Normal file
View File

@ -0,0 +1,9 @@
MIT License
Copyright (c) 2024
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

2
src/main.c Normal file
View File

@ -0,0 +1,2 @@
typedef int32_t unigi_ext_type_2d_coord; // Signed 2D coordinate
#include "texture.c"

73
src/texture.c Normal file
View File

@ -0,0 +1,73 @@
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;
}
}