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; | ||
|  | 	} | ||
|  | } |