Files
haxework/haxework/text/BitmapTextField.hx
2015-06-25 17:15:49 +03:00

169 lines
3.8 KiB
Haxe
Executable File

package haxework.text;
import haxe.Timer;
import flash.text.TextFormat;
import flash.events.Event;
import flash.display.Bitmap;
import flash.geom.Matrix;
import flash.display.BitmapData;
import flash.text.TextField;
class BitmapTextField extends TextField {
public var shadow(default, set):Bool = false;
public var stroke(default, set):Bool = false;
public var shadowColor(default, set):Int = 0x000000;
public var shadowAlpha(default, set):Float = 0.6;
private static var K_HEIGHT = 1.185;
private var bitmap:Bitmap;
private var _text:String;
private var _invalidated:Bool;
private var _invalidatedNext:Bool;
public function new() {
super();
bitmap = new Bitmap();
bitmap.smoothing = true;
visible = false;
addEventListener(Event.ADDED, onAdded);
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
addEventListener(Event.REMOVED, onRemoved);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function set_shadow(value) {
if (shadow != value) {
shadow = value;
_invalidated = true;
}
return shadow;
}
private function set_stroke(value) {
if (stroke != value) {
stroke = value;
_invalidated = true;
}
return stroke;
}
private function set_shadowColor(value) {
if (shadowColor != value) {
shadowColor = value;
_invalidated = true;
}
return shadowColor;
}
private function set_shadowAlpha(value) {
if (shadowAlpha != value) {
shadowAlpha = value;
_invalidated = true;
}
return shadowAlpha;
}
private function onAdded(_) {
parent.addChild(bitmap);
_invalidated = true;
}
private function onAddedToStage(_) {
_invalidatedNext = true;
}
private function onRemoved(_) {
if (bitmap.parent != null) {
bitmap.parent.removeChild(bitmap);
}
}
private function onEnterFrame(_) {
if (_text != text) {
_text = text;
_invalidated = true;
}
if (_invalidated) {
redraw();
}
if (_invalidatedNext) {
_invalidated = true;
_invalidatedNext = false;
}
}
private function redraw() {
var size = TextUtil.getSize(this);
//ToDo: openfl 3.0.6 -> 3.1.0
Timer.delay(function() {
bitmap.bitmapData = draw(this, size.x, size.y, shadowColor, shadowAlpha, shadow, stroke);
}, 1);
bitmap.x = x;
bitmap.y = y;
_invalidated = false;
}
public static function draw(textField:TextField, textWidth:Float, textHeight:Float, color:Int, alpha:Float, shadow:Bool, stroke:Bool):BitmapData {
textField.visible = true;
var bd = new BitmapData(Std.int(textWidth) + 6, Std.int(textHeight) + 6, true, 0x00000000);
if (shadow || stroke) {
var baseTf = textField.getTextFormat();
var tf = textField.getTextFormat();
tf.color = color;
textField.setTextFormat(tf);
textField.alpha = alpha;
//ToDo: matrix arrays
if (stroke) {
var m = new Matrix();
m.translate(1, 2);
bd.draw(textField, m);
var m = new Matrix();
m.translate(2, 1);
bd.draw(textField, m);
var m = new Matrix();
m.translate(1, 0);
bd.draw(textField, m);
var m = new Matrix();
m.translate(0, 1);
bd.draw(textField, m);
}
if (shadow) {
var m = new Matrix();
m.translate(2, 3);
bd.draw(textField, m);
var m = new Matrix();
m.translate(3, 2);
bd.draw(textField, m);
var m = new Matrix();
m.translate(1, 0);
bd.draw(textField, m);
var m = new Matrix();
m.translate(0, 1);
bd.draw(textField, m);
}
textField.alpha = 1.0;
textField.setTextFormat(baseTf);
}
var m = new Matrix();
m.translate(1, 1);
bd.draw(textField, m);
textField.visible = false;
return bd;
}
}