mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-07 19:05:54 +08:00
improve nanovg
This commit is contained in:
parent
c6dba8a594
commit
94ba8dd455
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
2025/04/30
|
||||
* 完善 mem_allocator_fixed_block(感谢兆坤提供补丁)。
|
||||
* 修复OpenGL下vg写字无法水平或者垂直翻转的问题(感谢智明提供补丁)
|
||||
|
||||
2025/04/29
|
||||
* 优化nanovg_plus_gl (感谢智明提供补丁)
|
||||
|
Loading…
x
Reference in New Issue
Block a user