Browse Source

Apply font scaling to nvgTextBounds and nvgVertMetrics

shared-context
Mikko Mononen 11 years ago
parent
commit
56574f6eb3
2 changed files with 28 additions and 19 deletions
  1. +16
    -7
      src/nanovg.c
  2. +12
    -12
      src/nanovg_gl3.h

+ 16
- 7
src/nanovg.c View File

@@ -1575,13 +1575,18 @@ static float nvg__quantize(float a, float d)
return ((int)(a / d + 0.5f)) * d;
}

static float nvg__getFontScale(struct NVGstate* state)
{
return nvg__minf(nvg__quantize(nvg__getAverageScale(state->xform), 0.01f), 4.0f);
}

float nvgText(struct NVGcontext* ctx, float x, float y, const char* string, const char* end)
{
struct NVGstate* state = nvg__getState(ctx);
struct FONStextIter iter;
struct FONSquad q;
struct NVGvertex* verts;
float scale = nvg__minf(nvg__quantize(nvg__getAverageScale(state->xform), 0.01f), 4.0f);
float scale = nvg__getFontScale(state);
float invscale = 1.0f / scale;
int dirty[4];
int cverts = 0;
@@ -1646,11 +1651,13 @@ float nvgText(struct NVGcontext* ctx, float x, float y, const char* string, cons
float nvgTextBounds(struct NVGcontext* ctx, const char* string, const char* end, float* bounds)
{
struct NVGstate* state = nvg__getState(ctx);
float scale = nvg__getFontScale(state);

if (state->fontId == FONS_INVALID) return 0;

fonsSetSize(ctx->fs, state->fontSize);
fonsSetSpacing(ctx->fs, state->letterSpacing);
fonsSetBlur(ctx->fs, state->fontBlur);
fonsSetSize(ctx->fs, state->fontSize*scale);
fonsSetSpacing(ctx->fs, state->letterSpacing*scale);
fonsSetBlur(ctx->fs, state->fontBlur*scale);
fonsSetAlign(ctx->fs, state->textAlign);
fonsSetFont(ctx->fs, state->fontId);

@@ -1660,11 +1667,13 @@ float nvgTextBounds(struct NVGcontext* ctx, const char* string, const char* end,
void nvgVertMetrics(struct NVGcontext* ctx, float* ascender, float* descender, float* lineh)
{
struct NVGstate* state = nvg__getState(ctx);
float scale = nvg__getFontScale(state);

if (state->fontId == FONS_INVALID) return;

fonsSetSize(ctx->fs, state->fontSize);
fonsSetSpacing(ctx->fs, state->letterSpacing);
fonsSetBlur(ctx->fs, state->fontBlur);
fonsSetSize(ctx->fs, state->fontSize*scale);
fonsSetSpacing(ctx->fs, state->letterSpacing*scale);
fonsSetBlur(ctx->fs, state->fontBlur*scale);
fonsSetAlign(ctx->fs, state->textAlign);
fonsSetFont(ctx->fs, state->fontId);



+ 12
- 12
src/nanovg_gl3.h View File

@@ -38,7 +38,6 @@ void nvgDeleteGL3(struct NVGcontext* ctx);
#include "nanovg.h"

enum GLNVGuniformLoc {
GLNVG_LOC_VIEWPOS,
GLNVG_LOC_VIEWSIZE,
GLNVG_LOC_SCISSORMAT,
GLNVG_LOC_SCISSOREXT,
@@ -55,6 +54,13 @@ enum GLNVGuniformLoc {
GLNVG_MAX_LOCS
};

enum GLNVGshaderType {
NSVG_SHADER_FILLGRAD,
NSVG_SHADER_FILLIMG,
NSVG_SHADER_SIMPLE,
NSVG_SHADER_IMG
};

struct GLNVGshader {
GLuint prog;
GLuint frag;
@@ -224,7 +230,6 @@ static void glnvg__deleteShader(struct GLNVGshader* shader)

static void glnvg__getUniforms(struct GLNVGshader* shader)
{
shader->loc[GLNVG_LOC_VIEWPOS] = glGetUniformLocation(shader->prog, "viewPos");
shader->loc[GLNVG_LOC_VIEWSIZE] = glGetUniformLocation(shader->prog, "viewSize");
shader->loc[GLNVG_LOC_SCISSORMAT] = glGetUniformLocation(shader->prog, "scissorMat");
shader->loc[GLNVG_LOC_SCISSOREXT] = glGetUniformLocation(shader->prog, "scissorExt");
@@ -246,7 +251,6 @@ static int glnvg__renderCreate(void* uptr)

static const char* fillVertShader =
"#version 150 core\n"
"uniform vec2 viewPos;\n"
"uniform vec2 viewSize;\n"
"in vec2 vertex;\n"
"in vec2 tcoord;\n"
@@ -258,7 +262,7 @@ static int glnvg__renderCreate(void* uptr)
" ftcoord = tcoord;\n"
" fcolor = color;\n"
" fpos = vertex;\n"
" gl_Position = vec4(2.0*(vertex.x+viewPos.x)/viewSize.x - 1.0, 1.0 - 2.0*(vertex.y+viewPos.y)/viewSize.y, 0, 1);\n"
" gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n"
"}\n";

static const char* fillFragShader =
@@ -485,8 +489,7 @@ static int glnvg__setupPaint(struct GLNVGcontext* gl, struct NVGpaint* paint, st
tex = glnvg__findTexture(gl, paint->image);
if (tex == NULL) return 0;
glUseProgram(gl->shader.prog);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], 1);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWPOS], 0, 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], NSVG_SHADER_FILLIMG);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight);
glUniformMatrix3fv(gl->shader.loc[GLNVG_LOC_SCISSORMAT], 1, GL_FALSE, scissorMat);
glUniform2f(gl->shader.loc[GLNVG_LOC_SCISSOREXT], scissorx, scissory);
@@ -500,8 +503,7 @@ static int glnvg__setupPaint(struct GLNVGcontext* gl, struct NVGpaint* paint, st
glnvg__checkError("tex paint tex");
} else {
glUseProgram(gl->shader.prog);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], 0);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWPOS], 0, 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], NSVG_SHADER_FILLGRAD);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight);
glUniformMatrix3fv(gl->shader.loc[GLNVG_LOC_SCISSORMAT], 1, GL_FALSE, scissorMat);
glUniform2f(gl->shader.loc[GLNVG_LOC_SCISSOREXT], scissorx, scissory);
@@ -618,8 +620,7 @@ static void glnvg__renderFill(void* uptr, struct NVGpaint* paint, struct NVGscis
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

glUseProgram(gl->shader.prog);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], 2);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWPOS], 0, 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], NSVG_SHADER_SIMPLE);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight);
glnvg__checkError("fill solid loc");

@@ -739,8 +740,7 @@ static void glnvg__renderTriangles(void* uptr, struct NVGpaint* paint, struct NV
}

glUseProgram(gl->shader.prog);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], 3);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWPOS], 0, 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TYPE], NSVG_SHADER_IMG);
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight);
glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TEXTYPE], tex->type == NVG_TEXTURE_RGBA ? 0 : 1);


Loading…
Cancel
Save