mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +02:00
Fixed tab characters (‘\t’) in text to be drawn properly with love.graphics.print.
This commit is contained in:
@@ -46,7 +46,6 @@ struct GlyphMetrics
|
|||||||
int advance;
|
int advance;
|
||||||
int bearingX;
|
int bearingX;
|
||||||
int bearingY;
|
int bearingY;
|
||||||
int spacing;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ Font::Font(love::font::Rasterizer *r, const Texture::Filter &filter)
|
|||||||
, lineHeight(1)
|
, lineHeight(1)
|
||||||
, mSpacing(1)
|
, mSpacing(1)
|
||||||
, filter(filter)
|
, filter(filter)
|
||||||
|
, useSpacesAsTab(false)
|
||||||
{
|
{
|
||||||
this->filter.mipmap = Texture::FILTER_NONE;
|
this->filter.mipmap = Texture::FILTER_NONE;
|
||||||
|
|
||||||
@@ -67,13 +68,16 @@ Font::Font(love::font::Rasterizer *r, const Texture::Filter &filter)
|
|||||||
textureWidth = TEXTURE_WIDTHS[textureSizeIndex];
|
textureWidth = TEXTURE_WIDTHS[textureSizeIndex];
|
||||||
textureHeight = TEXTURE_HEIGHTS[textureSizeIndex];
|
textureHeight = TEXTURE_HEIGHTS[textureSizeIndex];
|
||||||
|
|
||||||
love::font::GlyphData *gd = 0;
|
love::font::GlyphData *gd = nullptr;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
gd = r->getGlyphData(32);
|
gd = r->getGlyphData(32); // Space character.
|
||||||
type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE;
|
type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA) ? FONT_TRUETYPE : FONT_IMAGE;
|
||||||
|
|
||||||
|
if (!r->hasGlyph(9)) // No tab character in the Rasterizer.
|
||||||
|
useSpacesAsTab = true;
|
||||||
|
|
||||||
loadVolatile();
|
loadVolatile();
|
||||||
}
|
}
|
||||||
catch (love::Exception &)
|
catch (love::Exception &)
|
||||||
@@ -172,7 +176,26 @@ void Font::createTexture()
|
|||||||
|
|
||||||
Font::Glyph *Font::addGlyph(uint32 glyph)
|
Font::Glyph *Font::addGlyph(uint32 glyph)
|
||||||
{
|
{
|
||||||
love::font::GlyphData *gd = rasterizer->getGlyphData(glyph);
|
love::font::GlyphData *gd = nullptr;
|
||||||
|
|
||||||
|
// Use spaces for the tab 'glyph'.
|
||||||
|
if (glyph == 9 && useSpacesAsTab)
|
||||||
|
{
|
||||||
|
love::font::GlyphData *spacegd = rasterizer->getGlyphData(32);
|
||||||
|
|
||||||
|
love::font::GlyphMetrics gm = {};
|
||||||
|
gm.advance = spacegd->getAdvance() * SPACES_PER_TAB;
|
||||||
|
gm.bearingX = spacegd->getBearingX();
|
||||||
|
gm.bearingY = spacegd->getBearingY();
|
||||||
|
love::font::GlyphData::Format f = spacegd->getFormat();
|
||||||
|
|
||||||
|
spacegd->release();
|
||||||
|
|
||||||
|
gd = new love::font::GlyphData(glyph, gm, f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
gd = rasterizer->getGlyphData(glyph);
|
||||||
|
|
||||||
int w = gd->getWidth();
|
int w = gd->getWidth();
|
||||||
int h = gd->getHeight();
|
int h = gd->getHeight();
|
||||||
|
|
||||||
|
|||||||
@@ -202,14 +202,19 @@ private:
|
|||||||
FontType type;
|
FontType type;
|
||||||
Texture::Filter filter;
|
Texture::Filter filter;
|
||||||
|
|
||||||
|
int textureX, textureY;
|
||||||
|
int rowHeight;
|
||||||
|
|
||||||
|
bool useSpacesAsTab;
|
||||||
|
|
||||||
static const int NUM_TEXTURE_SIZES = 7;
|
static const int NUM_TEXTURE_SIZES = 7;
|
||||||
static const int TEXTURE_WIDTHS[NUM_TEXTURE_SIZES];
|
static const int TEXTURE_WIDTHS[NUM_TEXTURE_SIZES];
|
||||||
static const int TEXTURE_HEIGHTS[NUM_TEXTURE_SIZES];
|
static const int TEXTURE_HEIGHTS[NUM_TEXTURE_SIZES];
|
||||||
|
|
||||||
static const int TEXTURE_PADDING = 1;
|
static const int TEXTURE_PADDING = 1;
|
||||||
|
|
||||||
int textureX, textureY;
|
// This will be used if the Rasterizer doesn't have a tab character itself.
|
||||||
int rowHeight;
|
static const int SPACES_PER_TAB = 4;
|
||||||
|
|
||||||
}; // Font
|
}; // Font
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user