__
This commit is contained in:
parent
9213a1d5dd
commit
1ae4ff72d3
@ -111,6 +111,7 @@ namespace RenderD7
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#define I2U82I(val) RenderD7::utf8_decode(RenderD7::IntToUtf8(val).c_str())
|
||||||
|
|
||||||
class NFontApi
|
class NFontApi
|
||||||
{
|
{
|
||||||
@ -118,12 +119,13 @@ namespace RenderD7
|
|||||||
NFontApi();
|
NFontApi();
|
||||||
~NFontApi();
|
~NFontApi();
|
||||||
void LoadTTF(std::string path);
|
void LoadTTF(std::string path);
|
||||||
std::vector<unsigned char> GetGlyphBitmap(int glyph);
|
unsigned char* GetGlyphBitmap(char glyph);
|
||||||
std::string GetStatus(){ return status; }
|
std::string GetStatus(){ return status; }
|
||||||
float GetScale() {return scale; }
|
float GetScale() {return scale; }
|
||||||
int GetGlyphWidth(int glyph);
|
int GetGlyphWidth(char glyph);
|
||||||
int GetGlyphHeight(int glyph);
|
int GetGlyphHeight(char glyph);
|
||||||
int GetLineHeight(){ return l_h; }
|
int GetLineHeight(){ return l_h; }
|
||||||
|
int GetBaseHeight(){ return height; }
|
||||||
private:
|
private:
|
||||||
std::string status;
|
std::string status;
|
||||||
|
|
||||||
@ -138,7 +140,9 @@ namespace RenderD7
|
|||||||
int h;
|
int h;
|
||||||
|
|
||||||
int x0,y0,x1,y1;
|
int x0,y0,x1,y1;
|
||||||
int ascent,baseline, decent;
|
int ascent,baseline,decent,linegap;
|
||||||
|
|
||||||
|
int linespace;
|
||||||
|
|
||||||
stbtt_fontinfo font;
|
stbtt_fontinfo font;
|
||||||
};
|
};
|
||||||
|
@ -288,19 +288,20 @@ struct BMP {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned fill_region(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint8_t B, uint8_t G, uint8_t R, uint8_t A) {
|
unsigned fill_region(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint8_t B, uint8_t G, uint8_t R, uint8_t A) {
|
||||||
if (x0 + w > (uint32_t)bmp_info_header.width || y0 + h > (uint32_t)bmp_info_header.height) {
|
|
||||||
return 59;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t channels = bmp_info_header.bit_count / 8;
|
uint32_t channels = bmp_info_header.bit_count / 8;
|
||||||
for (uint32_t y = y0; y < y0 + h; ++y) {
|
for (uint32_t y = y0; y < y0 + h; ++y) {
|
||||||
for (uint32_t x = x0; x < x0 + w; ++x) {
|
for (uint32_t x = x0; x < x0 + w; ++x) {
|
||||||
|
/*if (x + w > (uint32_t)bmp_info_header.width || y + h > (uint32_t)bmp_info_header.height) {
|
||||||
|
//
|
||||||
|
}*/
|
||||||
|
//else{
|
||||||
data[channels * (y * bmp_info_header.width + x) + 0] = B;
|
data[channels * (y * bmp_info_header.width + x) + 0] = B;
|
||||||
data[channels * (y * bmp_info_header.width + x) + 1] = G;
|
data[channels * (y * bmp_info_header.width + x) + 1] = G;
|
||||||
data[channels * (y * bmp_info_header.width + x) + 2] = R;
|
data[channels * (y * bmp_info_header.width + x) + 2] = R;
|
||||||
if (channels == 4) {
|
if (channels == 4) {
|
||||||
data[channels * (y * bmp_info_header.width + x) + 3] = A;
|
data[channels * (y * bmp_info_header.width + x) + 3] = A;
|
||||||
}
|
}
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -348,15 +348,16 @@ void RenderD7::BitmapPrinter::DrawDebugChar(u32 posX, u32 posY, int t_size, u32
|
|||||||
|
|
||||||
void RenderD7::BitmapPrinter::DrawChar(int posX, int posY, float t_size, u32 color, char character, RenderD7::NFontApi font)
|
void RenderD7::BitmapPrinter::DrawChar(int posX, int posY, float t_size, u32 color, char character, RenderD7::NFontApi font)
|
||||||
{
|
{
|
||||||
for(int y = 0; y < font.GetGlyphHeight(RenderD7::utf8_decode(RenderD7::IntToUtf8((int)character).c_str())); y++)
|
for(int y = 0; y < font.GetGlyphHeight(character); y++)
|
||||||
{
|
{
|
||||||
char charPos = (char)font.GetGlyphBitmap(RenderD7::utf8_decode(RenderD7::IntToUtf8((int)character).c_str()))[character * font.GetGlyphHeight(RenderD7::utf8_decode(RenderD7::IntToUtf8((int)character).c_str())) + y];
|
for(int x = 0; x < font.GetGlyphWidth(character); x++)
|
||||||
|
{
|
||||||
for(int x = 0; x < font.GetGlyphWidth(RenderD7::utf8_decode(RenderD7::IntToUtf8((int)character).c_str())); x++)
|
if(((font.GetGlyphBitmap(character)[font.GetGlyphHeight(character) + y] >> (font.GetGlyphWidth(character - 1) - x)) & 1) == 1)
|
||||||
if(((charPos >> (font.GetGlyphWidth(RenderD7::utf8_decode(RenderD7::IntToUtf8((int)character).c_str()) - 1) - x)) & 1) == 1)
|
|
||||||
{
|
{
|
||||||
DrawPixel(posX + x + 1, posY + y + 1, UNPACK_BGRA(color));
|
DrawPixel(posX + x + 1, posY + y + 1, UNPACK_BGRA(color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -420,14 +421,14 @@ void RenderD7::BitmapPrinter::DrawText(int x, int y, float t_size, u32 color, st
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
//Make sure we never get out of the screen
|
//Make sure we never get out of the screen
|
||||||
if(line_i >= (((u32)this->bitmap.bmp_info_header.width) - (u32)x) / (u32)(font.GetGlyphWidth(RenderD7::utf8_decode(&text[i]))*t_size))
|
if(line_i >= (((u32)this->bitmap.bmp_info_header.width) - (u32)x) / (u32)(font.GetGlyphWidth(text[i])))
|
||||||
{
|
{
|
||||||
y += (SPACING_Y*t_size);
|
y += (SPACING_Y*t_size);
|
||||||
line_i = 1; //Little offset so we know the same text continues
|
line_i = 1; //Little offset so we know the same text continues
|
||||||
if(text[i] == ' ') break; //Spaces at the start look weird
|
if(text[i] == ' ') break; //Spaces at the start look weird
|
||||||
}
|
}
|
||||||
|
|
||||||
this->DrawChar(x + line_i * (font.GetGlyphWidth(RenderD7::utf8_decode(&text[i])*t_size)), y, t_size, color, text[i], font);
|
this->DrawChar(x + line_i * (font.GetGlyphWidth(text[i])), y, t_size, color, text[i], font);
|
||||||
|
|
||||||
line_i++;
|
line_i++;
|
||||||
break;
|
break;
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation
|
#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation
|
||||||
#include <renderd7/external/stb_truetype.h>
|
#include <renderd7/external/stb_truetype.h>
|
||||||
|
|
||||||
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
|
#include <renderd7/external/stb_image_write.h>
|
||||||
|
|
||||||
RenderD7::NFontApi::NFontApi()
|
RenderD7::NFontApi::NFontApi()
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -32,38 +35,41 @@ void RenderD7::NFontApi::LoadTTF(std::string path)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
status+="success!\n";
|
status+="success!\n";
|
||||||
|
b_h = 128;
|
||||||
|
b_w = 512;
|
||||||
l_h = 24; /* line height */
|
l_h = 24; /* line height */
|
||||||
scale = stbtt_ScaleForPixelHeight(&font, l_h);
|
scale = stbtt_ScaleForPixelHeight(&font, l_h);
|
||||||
|
|
||||||
stbtt_GetFontVMetrics(&font, &ascent,&decent,0);
|
stbtt_GetFontVMetrics(&font, &ascent,&decent,&linegap);
|
||||||
|
linespace = scale * (ascent - decent + linegap);
|
||||||
|
|
||||||
baseline = (int) (ascent*scale);
|
baseline = (int) (ascent*scale);
|
||||||
height = (int) ((ascent - decent)*scale);
|
height = (int) ((ascent - decent)*scale);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<unsigned char> RenderD7::NFontApi::GetGlyphBitmap(int glyph)
|
unsigned char* RenderD7::NFontApi::GetGlyphBitmap(char glyph)
|
||||||
{
|
{
|
||||||
stbtt_GetGlyphBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
//stbtt_GetGlyphBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
||||||
|
stbtt_GetCodepointBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
||||||
w = x1-x0;
|
w = x1-x0;
|
||||||
h = y1-y0;
|
h = y1-y0;
|
||||||
|
|
||||||
std::vector<unsigned char> bitmap;
|
unsigned char* bitmap;
|
||||||
bitmap.resize(h*w);
|
bitmap = stbtt_GetCodepointBitmap(&font, scale, scale, glyph, &w, &h, 0, 0);
|
||||||
stbtt_MakeGlyphBitmap(&font, bitmap.data(), w, h, w, scale, scale, glyph);
|
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RenderD7::NFontApi::GetGlyphHeight(int glyph)
|
int RenderD7::NFontApi::GetGlyphHeight(char glyph)
|
||||||
{
|
{
|
||||||
stbtt_GetGlyphBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
stbtt_GetCodepointBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
||||||
w = x1-x0;
|
w = x1-x0;
|
||||||
h = y1-y0;
|
h = y1-y0;
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RenderD7::NFontApi::GetGlyphWidth(int glyph)
|
int RenderD7::NFontApi::GetGlyphWidth(char glyph)
|
||||||
{
|
{
|
||||||
stbtt_GetGlyphBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
stbtt_GetCodepointBitmapBox(&font, glyph, scale, scale, &x0, &y0, &x1, &y1);
|
||||||
w = x1-x0;
|
w = x1-x0;
|
||||||
h = y1-y0;
|
h = y1-y0;
|
||||||
return w;
|
return w;
|
||||||
|
Loading…
Reference in New Issue
Block a user