Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Honor scale in FlxBitmapText width and height, add setCharFrame #3037

Merged
merged 2 commits into from
Feb 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 41 additions & 40 deletions flixel/graphics/frames/FlxBitmapFont.hx
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ class FlxBitmapFont extends FlxFramesCollection
throw 'Invalid font data!';
}

font.addCharFrame(char.id, frame, FlxPoint.get(char.xoffset, char.yoffset), char.xadvance);
font.addCharFrame(char.id, frame, FlxPoint.weak(char.xoffset, char.yoffset), char.xadvance);

if (char.id == SPACE_CODE)
{
Expand Down Expand Up @@ -266,24 +266,13 @@ class FlxBitmapFont extends FlxFramesCollection
var frameWidth:Int = Std.int(frame.frame.width);
var frameHeight:Int = Std.int(frame.frame.height);
var letterIdx:Int = 0;
var charCode:Int;
var numLetters:Int = letters.uLength();
var rect:FlxRect;
var offset:FlxPoint;
var xAdvance:Int;

var cy:Int = 0;
var cx:Int;

var gx:Int;
var gy:Int;
var gw:Int;
var gh:Int;

while (cy < frameHeight && letterIdx < numLetters)
{
var rowHeight:Int = 0;
cx = 0;
var cx = 0;

while (cx < frameWidth && letterIdx < numLetters)
{
Expand All @@ -293,8 +282,8 @@ class FlxBitmapFont extends FlxFramesCollection
if (bmd.getPixel(Std.int(p.x), Std.int(p.y)) != cast globalBGColor)
{
// found non bg pixel
gx = cx;
gy = cy;
var gx = cx;
var gy = cy;

p.setTo(gx, gy);
transformPoint(p, frame);
Expand All @@ -317,15 +306,14 @@ class FlxBitmapFont extends FlxFramesCollection
transformPoint(p, frame);
}

gw = gx - cx;
gh = gy - cy;
final gw = gx - cx;
final gh = gy - cy;

charCode = letters.uCharCodeAt(letterIdx);
rect = FlxRect.get(cx, cy, gw, gh);
offset = FlxPoint.get(0, 0);
xAdvance = gw;
final charCode = letters.uCharCodeAt(letterIdx);
final rect = FlxRect.get(cx, cy, gw, gh);
final xAdvance = gw;

font.addCharFrame(charCode, rect, offset, xAdvance);
font.addCharFrame(charCode, rect, xAdvance);

if (charCode == SPACE_CODE)
{
Expand Down Expand Up @@ -404,7 +392,7 @@ class FlxBitmapFont extends FlxFramesCollection
* @param spacing Spaces between characters in the font set. Default is `null` which means no spaces.
* @return Generated bitmap font object.
*/
public static function fromMonospace(source:FlxBitmapFontGraphicAsset, ?letters:String, charSize:FlxPoint, ?region:FlxRect,
public static function fromMonospace(source:FlxBitmapFontGraphicAsset, ?letters:UnicodeString, charSize:FlxPoint, ?region:FlxRect,
?spacing:FlxPoint):FlxBitmapFont
{
var graphic:FlxGraphic = null;
Expand Down Expand Up @@ -453,20 +441,17 @@ class FlxBitmapFont extends FlxFramesCollection
font.fontName = graphic.key;
font.lineHeight = font.size = charHeight;

var charRect:FlxRect;
var offset:FlxPoint;
var xAdvance:Int = charWidth;
final xAdvance:Int = charWidth;
font.spaceWidth = xAdvance;
var letterIndex:Int = 0;
var numLetters:Int = letters.uLength();
var numLetters:Int = letters.length;

for (j in 0...numRows)
{
for (i in 0...numCols)
{
charRect = FlxRect.get(startX + i * spacedWidth, startY + j * spacedHeight, charWidth, charHeight);
offset = FlxPoint.get(0, 0);
font.addCharFrame(letters.uCharCodeAt(letterIndex), charRect, offset, xAdvance);
final charRect = FlxRect.get(startX + i * spacedWidth, startY + j * spacedHeight, charWidth, charHeight);
font.addCharFrame(letters.uCharCodeAt(letterIndex), charRect, xAdvance);
letterIndex++;

if (letterIndex >= numLetters)
Expand All @@ -488,24 +473,40 @@ class FlxBitmapFont extends FlxFramesCollection
* @param offset Offset before rendering this char.
* @param xAdvance How much cursor will jump after this char.
*/
function addCharFrame(charCode:Int, frame:FlxRect, offset:FlxPoint, xAdvance:Int):Void
function addCharFrame(charCode:Int, frame:FlxRect, ?offset:FlxPoint, xAdvance:Int):Void
{
var charName:String = new UnicodeBuffer().addChar(charCode).toString();
final charName:String = new UnicodeBuffer().addChar(charCode).toString();
if (frame.width == 0 || frame.height == 0 || getByName(charName) != null)
return;
var charFrame:FlxFrame = this.frame.subFrameTo(frame);

setCharFrame(charCode, frame, xAdvance, offset);
}

/**
* Sets the frame for the specified char
*
* @param charCode The char code
* @param frame The desired frame of the char
* @param xAdvance How far right the next character should be
* @param offset An optional frame offset from top left corner
*/
public function setCharFrame(charCode:Int, frame:FlxRect, xAdvance:Int, ?offset:FlxPoint):Void
{
final charName:String = new UnicodeBuffer().addChar(charCode).toString();
if (frame.width == 0 || frame.height == 0)
FlxG.log.error('Invalid frame size: $frame for char "$charName" in font "$fontName"');

final charFrame:FlxFrame = this.frame.subFrameTo(frame);

var w:Float = charFrame.sourceSize.x;
var h:Float = charFrame.sourceSize.y;
w += (offset.x > 0) ? offset.x : 0;
h += (offset.y > 0) ? offset.y : 0;
final w:Float = charFrame.sourceSize.x + (offset != null && offset.x > 0 ? offset.x : 0);
final h:Float = charFrame.sourceSize.y + (offset != null && offset.y > 0 ? offset.y : 0);
charFrame.sourceSize.set(w, h);
charFrame.offset.addPoint(offset);
if (offset != null)
charFrame.offset.addPoint(offset);//calls putWeak
charFrame.name = charName;
pushFrame(charFrame);
pushFrame(charFrame, true);
charMap.set(charCode, charFrame);
charAdvance.set(charCode, xAdvance);
offset.put();
}

function updateSourceHeight():Void
Expand Down
21 changes: 12 additions & 9 deletions flixel/text/FlxBitmapText.hx
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ class FlxBitmapText extends FlxSprite
super.updateHitbox();
}

inline function checkPendingChanges(useTiles:Bool = false):Void
function checkPendingChanges(useTiles:Bool = false):Void
{
if (FlxG.renderBlit)
{
Expand Down Expand Up @@ -1269,6 +1269,8 @@ class FlxBitmapText extends FlxSprite

function updatePixels(useTiles:Bool = false):Void
{
pendingPixelsChange = false;

var colorForFill:Int = background ? backgroundColor : FlxColor.TRANSPARENT;
var bitmap:BitmapData = null;

Expand Down Expand Up @@ -1306,12 +1308,12 @@ class FlxBitmapText extends FlxSprite
textDrawData.splice(0, textDrawData.length);
borderDrawData.splice(0, borderDrawData.length);
}

width = frameWidth;
height = frameHeight;

origin.x = frameWidth * 0.5;
origin.y = frameHeight * 0.5;
// use local var to avoid get_width and recursion
final newWidth = width = Math.abs(scale.x) * frameWidth;
final newHeight = height = Math.abs(scale.y) * frameHeight;
offset.set(-0.5 * (newWidth - frameWidth), -0.5 * (newHeight - frameHeight));
centerOrigin();
}

if (!useTiles)
Expand Down Expand Up @@ -1410,8 +1412,9 @@ class FlxBitmapText extends FlxSprite
{
dirty = true;
}

pendingPixelsChange = false;

if (pendingPixelsChange)
throw "pendingPixelsChange was changed to true while processing changed pixels";
}

function drawText(posX:Int, posY:Int, isFront:Bool = true, ?bitmap:BitmapData, useTiles:Bool = false):Void
Expand Down
Loading