improve nanovg

This commit is contained in:
lixianjing 2025-04-30 17:20:41 +08:00
parent c6dba8a594
commit 94ba8dd455
4 changed files with 61 additions and 8 deletions

View File

@ -2849,6 +2849,12 @@ static void nvg__renderText(NVGcontext* ctx, NVGvertex* verts, int nverts)
ctx->textTriCount += nverts/3;
}
static inline int nvgpTrianglesIsCW(float x1, float y1, float x2, float y2, float x3, float y3) {
float ret = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
assert(ret != 0.0f);
return ret < 0.0f ? 1 : 0;
}
float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char* end)
{
NVGstate* state = nvg__getState(ctx);
@ -2900,11 +2906,21 @@ float nvgText(NVGcontext* ctx, float x, float y, const char* string, const char*
// Create triangles
if (nverts+6 <= cverts) {
nvg__vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++;
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvg__vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
if (nvgpTrianglesIsCW(c[0], c[1], c[4], c[5], c[2], c[3])) {
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvg__vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
} else {
nvg__vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
}
nvg__vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++;
nvg__vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
if (nvgpTrianglesIsCW(c[0], c[1], c[6], c[7], c[4], c[5])) {
nvg__vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
} else {
nvg__vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvg__vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
}
}
}

View File

@ -1631,6 +1631,12 @@ float nvgp_text_bounds(nvgp_context_t* ctx, float x, float y, const char* string
return state->text_width;
}
static inline int nvgp_triangles_is_cw(floatptr_t x1, floatptr_t y1, floatptr_t x2, floatptr_t y2, floatptr_t x3, floatptr_t y3) {
floatptr_t ret = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
assert(ret != 0.0f);
return ret < 0.0f ? 1 : 0;
}
float nvgp_text(nvgp_context_t* ctx, float x, float y, const char* string, const char* end) {
FONSquad q;
uint32_t nverts = 0;
@ -1688,12 +1694,24 @@ float nvgp_text(nvgp_context_t* ctx, float x, float y, const char* string, const
nvgp_transform_point(&c[6],&c[7], &state->matrix, q.x0*invscale, q.y1*invscale);
// Create triangles
if (nverts+6 <= cverts) {
// 把顶点数据改为顺时针方向,由于使用 glEnable(GL_CULL_FACE); 面剔除,如果是逆时针的话,就无法显示
nvgp_vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++;
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvgp_vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
if (nvgp_triangles_is_cw(c[0], c[1], c[4], c[5], c[2], c[3])) {
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvgp_vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
} else {
nvgp_vset(&verts[nverts], c[2], c[3], q.s1, q.t0); nverts++;
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
}
nvgp_vset(&verts[nverts], c[0], c[1], q.s0, q.t0); nverts++;
nvgp_vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
if (nvgp_triangles_is_cw(c[0], c[1], c[6], c[7], c[4], c[5])) {
nvgp_vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
} else {
nvgp_vset(&verts[nverts], c[4], c[5], q.s1, q.t1); nverts++;
nvgp_vset(&verts[nverts], c[6], c[7], q.s0, q.t1); nverts++;
}
}
}

View File

@ -386,6 +386,24 @@ static void draw_text(vgcanvas_t* vg) {
vgcanvas_fill_text(vg, text, 10, 10, 100);
log_debug("text=%s w=%f\n", text, w);
vgcanvas_restore(vg);
vgcanvas_translate(vg, w * 2, -h);
vgcanvas_fill_text(vg, text, 10, 10, 100);
vgcanvas_save(vg);
vgcanvas_scale(vg, -1, 1);
vgcanvas_fill_text(vg, text, 10, 10, 100);
vgcanvas_restore(vg);
vgcanvas_save(vg);
vgcanvas_scale(vg, 1, -1);
vgcanvas_fill_text(vg, text, 10, 10, 100);
vgcanvas_restore(vg);
vgcanvas_save(vg);
vgcanvas_scale(vg, -1, -1);
vgcanvas_fill_text(vg, text, 10, 10, 100);
vgcanvas_restore(vg);
}
static inline ret_t on_paint_text(void* ctx, event_t* e) {

View File

@ -2,6 +2,7 @@
2025/04/30
* 完善 mem_allocator_fixed_block(感谢兆坤提供补丁)。
* 修复OpenGL下vg写字无法水平或者垂直翻转的问题(感谢智明提供补丁)
2025/04/29
* 优化nanovg_plus_gl (感谢智明提供补丁)