From 4308c1c4829cd0e30c9fc322dc8f12e2716afbbd Mon Sep 17 00:00:00 2001 From: George FunBook Date: Fri, 16 Feb 2024 17:49:14 -0600 Subject: [PATCH] add setCharFrame + cleanup --- flixel/graphics/frames/FlxBitmapFont.hx | 81 +++++++++++++------------ 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/flixel/graphics/frames/FlxBitmapFont.hx b/flixel/graphics/frames/FlxBitmapFont.hx index 1f6b6cc36b..4770545569 100644 --- a/flixel/graphics/frames/FlxBitmapFont.hx +++ b/flixel/graphics/frames/FlxBitmapFont.hx @@ -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) { @@ -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) { @@ -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); @@ -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) { @@ -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; @@ -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) @@ -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