[canvas] remove image draw commands, replace with rect/rounded rects + image source

This commit is contained in:
Martin Fouilleul 2023-02-24 22:59:33 +01:00
parent 1b62ec568c
commit 4333ed02b0
3 changed files with 3 additions and 95 deletions

View File

@ -79,7 +79,7 @@ int main()
mg_matrix_push((mg_mat2x3){0.707, -0.707, 200, mg_matrix_push((mg_mat2x3){0.707, -0.707, 200,
0.707, 0.707, 100}); 0.707, 0.707, 100});
mg_image_draw(image, (mp_rect){0, 0, imageSize.x/8, imageSize.y/8}); mg_image_draw_rounded(image, (mp_rect){0, 0, imageSize.x/8, imageSize.y/8}, 40.);
mg_matrix_pop(); mg_matrix_pop();

View File

@ -2197,86 +2197,6 @@ void mg_render_ellipse_stroke(mg_canvas_data* canvas, mp_rect rect, mg_attribute
mg_render_ellipse_fill_path(canvas, inner); mg_render_ellipse_fill_path(canvas, inner);
} }
void mg_render_image(mg_canvas_data* canvas, mg_image image, mp_rect srcRegion, mp_rect dstRegion, mg_attributes* attributes)
{
mg_image_data* imageData = mg_image_data_from_handle(canvas, image);
if(imageData)
{
u32 baseIndex = mg_vertices_base_index(canvas);
i32* indices = mg_reserve_indices(canvas, 6);
mg_next_shape(canvas, (mg_color){1, 1, 1, 1});
vec2 points[4] = {{dstRegion.x, dstRegion.y},
{dstRegion.x + dstRegion.w, dstRegion.y},
{dstRegion.x + dstRegion.w, dstRegion.y + dstRegion.h},
{dstRegion.x, dstRegion.y + dstRegion.h}};
vec4 cubic = {1, 1, 1, 1};
for(int i=0; i<4; i++)
{
mg_push_vertex(canvas, points[i], cubic);
}
indices[0] = baseIndex + 0;
indices[1] = baseIndex + 1;
indices[2] = baseIndex + 2;
indices[3] = baseIndex + 0;
indices[4] = baseIndex + 2;
indices[5] = baseIndex + 3;
}
//mg_render_rectangle_fill(canvas, dstRegion, attributes);
}
void mg_render_image_rounded(mg_canvas_data* canvas, mg_image image, mp_rect srcRegion, mg_rounded_rect dstRegion, mg_attributes* attributes)
{
//TODO
/*
mg_image_data* imageData = mg_image_ptr_from_handle(canvas, image);
if(!imageData)
{
return;
}
////////////////////////////////////////////////////////////////////////////////
//TODO: this does not work for rotated rectangles
////////////////////////////////////////////////////////////////////////////////
vec2 uvMin = {(imageData->rect.x + 0.5) / MG_ATLAS_SIZE, (imageData->rect.y + 0.5) / MG_ATLAS_SIZE};
vec2 uvMax = {(imageData->rect.x + imageData->rect.w - 0.5) / MG_ATLAS_SIZE, (imageData->rect.y + imageData->rect.h - 0.5) / MG_ATLAS_SIZE};
mp_rect uvRect = {uvMin.x, uvMin.y, uvMax.x - uvMin.x, uvMax.y - uvMin.y};
vec2 pMin = mg_mat2x3_mul(canvas->transform, (vec2){rect.x, rect.y});
vec2 pMax = mg_mat2x3_mul(canvas->transform, (vec2){rect.x + rect.w, rect.y + rect.h});
mp_rect pRect = {pMin.x, pMin.y, pMax.x - pMin.x, pMax.y - pMin.y};
u32 startIndex = mg_vertices_base_index(canvas);
mg_vertex_layout* layout = &canvas->backend->vertexLayout;
attributes->color = (mg_color){1, 1, 1, 1};
mg_render_rounded_rectangle_fill(canvas, rect, attributes);
u32 indexCount = mg_vertices_base_index(canvas) - startIndex;
for(int i=0; i<indexCount; i++)
{
u32 index = startIndex + i;
vec2* pos = (vec2*)(((char*)layout->posBuffer) + index*layout->posStride);
vec2* uv = (vec2*)(((char*)layout->uvBuffer) + index*layout->uvStride);
vec2 coordInBoundingSpace = {(pos->x - pRect.x)/pRect.w,
(pos->y - pRect.y)/pRect.h};
vec2 mappedUV = {uvRect.x + coordInBoundingSpace.x * uvRect.w,
uvRect.y + coordInBoundingSpace.y * uvRect.h};
*uv = mappedUV;
}
*/
}
//------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------
//NOTE(martin): fonts //NOTE(martin): fonts
//------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------
@ -3076,16 +2996,6 @@ void mg_flush_commands(int primitiveCount, mg_primitive* primitives, mg_path_elt
mg_clip_stack_pop(canvas); mg_clip_stack_pop(canvas);
} break; } break;
case MG_CMD_IMAGE_DRAW:
{
mg_render_image(canvas, primitive->attributes.image, primitive->srcRegion, primitive->rect, &primitive->attributes);
} break;
case MG_CMD_ROUNDED_IMAGE_DRAW:
{
mg_render_image_rounded(canvas, primitive->attributes.image, primitive->srcRegion, primitive->roundedRect, &primitive->attributes);
} break;
} }
} }
exit_command_loop: ; exit_command_loop: ;
@ -3853,7 +3763,7 @@ MP_API void mg_image_draw_region(mg_image image, mp_rect srcRegion, mp_rect dstR
mg_canvas_data* canvas = __mgCurrentCanvas; mg_canvas_data* canvas = __mgCurrentCanvas;
if(canvas) if(canvas)
{ {
mg_primitive primitive = {.cmd = MG_CMD_IMAGE_DRAW, mg_primitive primitive = {.cmd = MG_CMD_RECT_FILL,
.srcRegion = srcRegion, .srcRegion = srcRegion,
.rect = dstRegion, .rect = dstRegion,
.attributes = canvas->attributes}; .attributes = canvas->attributes};
@ -3868,7 +3778,7 @@ MP_API void mg_image_draw_region_rounded(mg_image image, mp_rect srcRegion, mp_r
mg_canvas_data* canvas = __mgCurrentCanvas; mg_canvas_data* canvas = __mgCurrentCanvas;
if(canvas) if(canvas)
{ {
mg_primitive primitive = {.cmd = MG_CMD_ROUNDED_IMAGE_DRAW, mg_primitive primitive = {.cmd = MG_CMD_ROUND_RECT_FILL,
.srcRegion = srcRegion, .srcRegion = srcRegion,
.roundedRect = {dstRegion.x, dstRegion.y, dstRegion.w, dstRegion.h, roundness}, .roundedRect = {dstRegion.x, dstRegion.y, dstRegion.w, dstRegion.h, roundness},
.attributes = canvas->attributes}; .attributes = canvas->attributes};

View File

@ -113,8 +113,6 @@ typedef enum { MG_CMD_CLEAR = 0,
MG_CMD_MATRIX_POP, MG_CMD_MATRIX_POP,
MG_CMD_CLIP_PUSH, MG_CMD_CLIP_PUSH,
MG_CMD_CLIP_POP, MG_CMD_CLIP_POP,
MG_CMD_IMAGE_DRAW,
MG_CMD_ROUNDED_IMAGE_DRAW,
} mg_primitive_cmd; } mg_primitive_cmd;
typedef struct mg_primitive typedef struct mg_primitive