1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | stbtt_bakedchar BCD[96] = {}; unsigned char fontBuffer[30000000] = {}; const int fontMapWidth = 3500; const int fontMapHeight = 2080; float pixelHeight = 256.0f; unsigned char fontData[fontMapWidth*fontMapHeight] = {}; // FILE *hFontFile = fopen("C:\\windows\\fonts\\times.ttf", "rb"); FILE *hFontFile = fopen("C:\\windows\\fonts\\cour.ttf", "rb"); // FILE *hFontFile = fopen("C:\\CJ_FONTS\\FFF_Tusj.ttf", "rb"); if(!hFontFile) { printf("fail open file\n"); } fread(fontBuffer, 1, sizeof(fontBuffer), hFontFile); stbtt_BakeFontBitmap(fontBuffer, 0, pixelHeight, fontData, fontMapWidth, fontMapHeight, 32, 126, BCD); fclose(hFontFile) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | textIndexRange printText(stbtt_bakedchar *BCD, GameBuffer *gameBuffer, int *index, float x, float y, float in_scale, char *text, CJ_V4f vec4)
{
float advance = 0;
float baseLineBreak = 0;
float baseLine = 0;
float result_X, result_Y, result_W, result_H;
float scale = in_scale;
int fontMapWidth = 3500;
int fontMapHeight = 2080;
textIndexRange tir = {};
tir.start = *index;
while(*text)
{
float pX = 0;
float pY = 0;
int character = *text - 32;
stbtt_aligned_quad q = {};
stbtt_GetBakedQuad(BCD, fontMapWidth, fontMapHeight, character, &pX, &pY, &q, 1);
//typedef struct
//{
// float x0,y0,s0,t0; // top-left
// float x1,y1,s1,t1; // bottom-right
//} stbtt_aligned_quad;
//
//STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above
// int char_index, // character to display
// float *xpos, float *ypos, // pointers to current position in screen pixel space
// stbtt_aligned_quad *q, // output: quad to draw
// int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier
// Call GetBakedQuad with char_index = 'character - first_char', and it
// creates the quad you need to draw and advances the current position.
//
// The coordinate system used assumes y increases downwards.
//
// Characters will extend both above and below the current position;
// see discussion of "BASELINE" above.
//
// It's inefficient; you might want to c&p it and optimize it.
if(*text == (int)' ')
{
q.x1 = 50.5f;
}
if(*index > TEXT_LAST)
{
MessageBox(0, "Need to increase number of characters (TEXT_LAST)", "MAX TEXT INDEX REACHED", MB_OK);
*text = 0;
}
// baseLineBreak sets the baseline for the textstring according to the first Character in the string
if(baseLineBreak == 0)
{
baseLine = (y - q.y0);
baseLineBreak++;
}
else
{
}
// Dont scale the X-Value or Y-Value of the first character
result_X = (x + advance);
result_Y = (baseLine + q.y0);
result_W = scale * (q.x1);
result_H = scale * (-q.y0);
gameBuffer[*index].setSolidColor(1.0f, 1.0f, 1.0f, 1.0f);
gameBuffer[*index].createRect(result_X, result_Y, result_W, result_H);
gameBuffer[*index].setTextureCoordinates(q.s0, q.t0, q.s1, q.t1);
gameBuffer[*index].setSolidColor(vec4.r, vec4.g, vec4.b, vec4.a);
advance += (scale * q.x1); // advance the x-value for the next character
*index += 1; // increases the gameBuffer Index
text++;
}
tir.end = (*index) - 1;
return tir;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /* From the documentation. */ #define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation #include "stb_truetype.h" unsigned char ttf_buffer[1<<20]; unsigned char temp_bitmap[512*512]; stbtt_bakedchar cdata[96]; // ASCII 32..126 is 95 glyphs GLuint ftex; void my_stbtt_initfont(void) { fread(ttf_buffer, 1, 1<<20, fopen("c:/windows/fonts/times.ttf", "rb")); stbtt_BakeFontBitmap(ttf_buffer,0, 32.0, temp_bitmap,512,512, 32,96, cdata); // no guarantee this fits! // can free ttf_buffer at this point glGenTextures(1, &ftex); glBindTexture(GL_TEXTURE_2D, ftex); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 512,512, 0, GL_ALPHA, GL_UNSIGNED_BYTE, temp_bitmap); // can free temp_bitmap at this point glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } void my_stbtt_print(float x, float y, char *text) { // assume orthographic projection with units = screen pixels, origin at top left glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, ftex); glBegin(GL_QUADS); while (*text) { if (*text >= 32 && *text < 128) { stbtt_aligned_quad q; stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); } ++text; } glEnd(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* Not tested, this could be totally wrong. */ while ( ... ) { float previous_x = x; float previous_y = y; stbtt_GetBakedQuad( ..., &x, &y, &q, 1 ); float x0 = previous_x + ( q.x0 - previous_x ) * scale; float x1 = previous_x + ( q.x1 - previous_x ) * scale; float y0 = previous_y + ( q.y0 - previous_y ) * scale; float y1 = previous_y + ( q.y1 - previous_y ) * scale; x = previous_x + ( x - previous_x ) * scale; y = previous_y + ( y - previous_y ) * scale; /* Draw using x0, x1, y0, y1. */ } |