Как отобразить текст в directx9 с помощью STB truetype?
Как отобразить текст с помощью библиотеки stb_truetype с помощью D3D9 в C / C++? Я посмотрел в различных форумах / сайтах и в документации библиотеки для некоторого примера в d3d9, и я не нашел никакого примера.
1 ответов
один из способов сделать это-создать текстуру D3D9, а затем загрузить в нее растровое изображение отрисованного текста. Затем вы можете использовать сгенерированную текстуру, как и любую другую текстуру.
#define STB_TRUETYPE_IMPLEMENTATION
#include "stb_truetype.h"
IDirect3DTexture9 *LoadTextureFromText(const char *text)
{
IDirect3DTexture9 *d3dTexture = 0;
/* load font file */
long size;
unsigned char* fontBuffer;
FILE* fontFile = fopen("C:\path\to\font.ttf", "rb");
fseek(fontFile, 0, SEEK_END);
size = ftell(fontFile); /* how long is the file ? */
fseek(fontFile, 0, SEEK_SET); /* reset */
fontBuffer = (unsigned char*)malloc(size);
fread(fontBuffer, size, 1, fontFile);
fclose(fontFile);
/* prepare font */
stbtt_fontinfo info;
if (!stbtt_InitFont(&info, fontBuffer, 0))
{
printf("failed\n");
}
int b_w = 512; /* bitmap width */
int b_h = 128; /* bitmap height */
int l_h = 64; /* line height */
/* create a bitmap for the phrase */
unsigned char* bitmap = (unsigned char*)calloc(b_w * b_h, sizeof(unsigned char));
/* calculate font scaling */
float scale = stbtt_ScaleForPixelHeight(&info, l_h);
int x = 0;
int ascent, descent, lineGap;
stbtt_GetFontVMetrics(&info, &ascent, &descent, &lineGap);
ascent *= scale;
descent *= scale;
int i;
for (i = 0; i < strlen(text); ++i)
{
/* get bounding box for character (may be offset to account for chars that dip above or below the line */
int c_x1, c_y1, c_x2, c_y2;
stbtt_GetCodepointBitmapBox(&info, text[i], scale, scale, &c_x1, &c_y1, &c_x2, &c_y2);
/* compute y (different characters have different heights */
int y = ascent + c_y1;
/* render character (stride and offset is important here) */
int byteOffset = x + (y * b_w);
stbtt_MakeCodepointBitmap(&info, bitmap + byteOffset, c_x2 - c_x1, c_y2 - c_y1, b_w, scale, scale, text[i]);
/* how wide is this character */
int ax;
stbtt_GetCodepointHMetrics(&info, text[i], &ax, 0);
x += ax * scale;
/* add kerning */
int kern;
kern = stbtt_GetCodepointKernAdvance(&info, text[i], text[i + 1]);
x += kern * scale;
}
//Create a D3D9 texture and load the generated image. The text bitmap is 1 channel.
D3DXCreateTexture(direct3DDevice, b_w, b_h, 1, D3DUSAGE_DYNAMIC, D3DFMT_L8, D3DPOOL_DEFAULT, (LPDIRECT3DTEXTURE9*)&d3dTexture);
D3DLOCKED_RECT rect;
d3dTexture->LockRect(0, &rect, NULL, 0);
memcpy(rect.pBits, bitmap, b_w * b_h);
d3dTexture->UnlockRect(0);
free(fontBuffer);
free(bitmap);
return d3dTexture;
}