forked from LeenkxTeam/LNXSDK
78 lines
2.2 KiB
Haxe
78 lines
2.2 KiB
Haxe
|
package kha.js;
|
||
|
|
||
|
import js.Syntax;
|
||
|
import haxe.io.Bytes;
|
||
|
import js.Browser;
|
||
|
import js.html.ImageElement;
|
||
|
import kha.Color;
|
||
|
import kha.Kravur;
|
||
|
|
||
|
@:keepInit
|
||
|
class Font implements Resource {
|
||
|
public var kravur: Kravur;
|
||
|
|
||
|
var images: Map<Int, Map<Int, ImageElement>> = new Map();
|
||
|
|
||
|
public function new(blob: Blob) {
|
||
|
this.kravur = Syntax.code("new kha_js_Font.Kravur(blob);");
|
||
|
}
|
||
|
|
||
|
public static function fromBytes(bytes: Bytes): Font {
|
||
|
return new Font(Blob.fromBytes(bytes));
|
||
|
}
|
||
|
|
||
|
public function height(fontSize: Int): Float {
|
||
|
return kravur._get(fontSize).getHeight();
|
||
|
}
|
||
|
|
||
|
public function width(fontSize: Int, str: String): Float {
|
||
|
return kravur._get(fontSize).stringWidth(str);
|
||
|
}
|
||
|
|
||
|
public function widthOfCharacters(fontSize: Int, characters: Array<Int>, start: Int, length: Int): Float {
|
||
|
return kravur._get(fontSize).charactersWidth(characters, start, length);
|
||
|
}
|
||
|
|
||
|
public function baseline(fontSize: Int): Float {
|
||
|
return kravur._get(fontSize).getBaselinePosition();
|
||
|
}
|
||
|
|
||
|
public function getImage(fontSize: Int, color: Color): ImageElement {
|
||
|
var glyphs = kha.graphics2.Graphics.fontGlyphs;
|
||
|
var imageIndex = fontSize * 10000 + glyphs.length;
|
||
|
if (!images.exists(imageIndex)) {
|
||
|
images[imageIndex] = new Map();
|
||
|
}
|
||
|
if (!images[imageIndex].exists(color.value)) {
|
||
|
var kravur = this.kravur._get(fontSize);
|
||
|
var canvas = Browser.document.createCanvasElement();
|
||
|
canvas.width = kravur.width;
|
||
|
canvas.height = kravur.height;
|
||
|
var ctx = canvas.getContext("2d");
|
||
|
ctx.fillStyle = "black";
|
||
|
ctx.fillRect(0, 0, kravur.width, kravur.height);
|
||
|
|
||
|
var imageData = ctx.getImageData(0, 0, kravur.width, kravur.height);
|
||
|
var bytes = cast(kravur.getTexture(), CanvasImage).bytes;
|
||
|
for (i in 0...bytes.length) {
|
||
|
imageData.data[i * 4 + 0] = color.Rb;
|
||
|
imageData.data[i * 4 + 1] = color.Gb;
|
||
|
imageData.data[i * 4 + 2] = color.Bb;
|
||
|
imageData.data[i * 4 + 3] = bytes.get(i);
|
||
|
}
|
||
|
ctx.putImageData(imageData, 0, 0);
|
||
|
|
||
|
var img = Browser.document.createImageElement();
|
||
|
img.src = canvas.toDataURL("image/png");
|
||
|
images[imageIndex][color.value] = img;
|
||
|
return img;
|
||
|
}
|
||
|
return images[imageIndex][color.value];
|
||
|
}
|
||
|
|
||
|
public function unload(): Void {
|
||
|
kravur = null;
|
||
|
images = null;
|
||
|
}
|
||
|
}
|