void TextDraw( float x, float y, const char *text, int align, unsigned int col ) { if (!g_ftex) return; if (!text) return; if (align == TEXT_ALIGN_CENTER) x -= GetTextLength(g_cdata, text)/2; else if (align == TEXT_ALIGN_RIGHT) x -= GetTextLength(g_cdata, text); glColor4ub(col&0xff, (col>>8)&0xff, (col>>16)&0xff, (col>>24)&0xff); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, g_ftex); glBegin(GL_TRIANGLES); const float ox = x; while (*text) { int c = (unsigned char)*text; if (c == '\t') { unsigned int i; for (i = 0; i < 4; ++i) { if (x < g_tabStops[i]+ox) { x = g_tabStops[i]+ox; break; } } } else if (c >= 32 && c < 128) { stbtt_aligned_quad q; GetBakedQuad(g_cdata, 512,512, c-32, &x,&y,&q); glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y0); glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y1); glTexCoord2f(q.s1, q.t0); glVertex2f(q.x1, q.y0); glTexCoord2f(q.s0, q.t0); glVertex2f(q.x0, q.y0); glTexCoord2f(q.s0, q.t1); glVertex2f(q.x0, q.y1); glTexCoord2f(q.s1, q.t1); glVertex2f(q.x1, q.y1); } ++text; } glEnd(); glDisable(GL_TEXTURE_2D); }
void TTFFontAsset::GetGlyphData(int unicodeCodepoint, float* x, float* y, Rect& verts, Rect& texCoords) const { AlignedQuad q; GetBakedQuad(fontCData, textureWidth, textureHeight, unicodeCodepoint, x, y, &q); verts.topLeft.x = q.x0; verts.topLeft.y = q.y0; verts.bottomRight.x = q.x1; verts.bottomRight.y = q.y1; texCoords.topLeft.x = q.s0; texCoords.topLeft.y = q.t0; texCoords.bottomRight.x = q.s1; texCoords.bottomRight.y = q.t1; }