openfl
Version:
A fast, productive library for 2D cross-platform development.
328 lines (311 loc) • 15 kB
JavaScript
// Class: openfl.display._internal.CanvasTextField
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../hxClasses_stub").default;
var $hxEnums = require("./../../../hxEnums_stub").default;
var $import = require("./../../../import_stub").default;
function openfl_geom_Rectangle() {return require("./../../../openfl/geom/Rectangle");}
function openfl_geom_Matrix() {return require("./../../../openfl/geom/Matrix");}
function StringTools() {return require("./../../../StringTools");}
function openfl__$Vector_VectorIterator() {return require("./../../../openfl/_Vector/VectorIterator");}
function openfl_text__$internal_TextEngine() {return require("./../../../openfl/text/_internal/TextEngine");}
function Std() {return require("./../../../Std");}
function openfl_display_BitmapData() {return require("./../../../openfl/display/BitmapData");}
function openfl_text__$internal_HTMLParser() {return require("./../../../openfl/text/_internal/HTMLParser");}
function openfl_display__$internal_CanvasBitmap() {return require("./../../../openfl/display/_internal/CanvasBitmap");}
function openfl_display__$internal_CanvasDisplayObject() {return require("./../../../openfl/display/_internal/CanvasDisplayObject");}
// Constructor
var CanvasTextField = function(){}
// Meta
CanvasTextField.__name__ = "openfl.display._internal.CanvasTextField";
CanvasTextField.__isInterface__ = false;
CanvasTextField.prototype = {
};
CanvasTextField.prototype.__class__ = CanvasTextField.prototype.constructor = $hxClasses["openfl.display._internal.CanvasTextField"] = CanvasTextField;
// Init
// Statics
CanvasTextField.render = function(textField,renderer,transform) {
var textEngine = textField.__textEngine;
var useTextBounds = !(textEngine.background || textEngine.border);
var bounds = useTextBounds ? textEngine.textBounds : textEngine.bounds;
var graphics = textField.__graphics;
var cursorOffsetX = 0.0;
if(textField.__dirty) {
textField.__updateLayout();
if(graphics.__bounds == null) {
graphics.__bounds = new (openfl_geom_Rectangle().default)();
}
if(textField.get_text().length == 0) {
var boundsWidth = textEngine.bounds.width - 4;
var align = textField.get_defaultTextFormat().align;
cursorOffsetX = align == "left" ? 0 : align == "right" ? boundsWidth : boundsWidth / 2;
switch(align) {
case "center":
cursorOffsetX += textField.get_defaultTextFormat().leftMargin / 2;
cursorOffsetX -= textField.get_defaultTextFormat().rightMargin / 2;
cursorOffsetX += textField.get_defaultTextFormat().indent / 2;
cursorOffsetX += textField.get_defaultTextFormat().blockIndent / 2;
break;
case "end":
break;
case "justify":
cursorOffsetX += textField.get_defaultTextFormat().leftMargin;
cursorOffsetX += textField.get_defaultTextFormat().indent;
cursorOffsetX += textField.get_defaultTextFormat().blockIndent;
break;
case "left":
cursorOffsetX += textField.get_defaultTextFormat().leftMargin;
cursorOffsetX += textField.get_defaultTextFormat().indent;
cursorOffsetX += textField.get_defaultTextFormat().blockIndent;
break;
case "right":
cursorOffsetX -= textField.get_defaultTextFormat().rightMargin;
break;
case "start":
break;
}
if(useTextBounds) {
bounds.y = textEngine.bounds.y;
bounds.x = cursorOffsetX;
}
}
graphics.__bounds.copyFrom(bounds);
}
var pixelRatio = renderer.__pixelRatio;
graphics.__update(renderer.__worldTransform,pixelRatio);
if(textField.__dirty || graphics.__softwareDirty) {
var width = Math.round(graphics.__width * pixelRatio);
var height = Math.round(graphics.__height * pixelRatio);
if((textEngine.text == null || textEngine.text == "") && !textEngine.background && !textEngine.border && !textEngine.__hasFocus && (textEngine.type != "input" || !textEngine.selectable) || (textEngine.width <= 0 || textEngine.height <= 0) && textEngine.autoSize != "none") {
textField.__graphics.__canvas = null;
textField.__graphics.__context = null;
textField.__graphics.__bitmap = null;
textField.__graphics.__softwareDirty = false;
textField.__graphics.set___dirty(false);
textField.__dirty = false;
} else {
if(textField.__graphics.__canvas == null) {
textField.__graphics.__canvas = window.document.createElement("canvas");
textField.__graphics.__context = textField.__graphics.__canvas.getContext("2d");
}
CanvasTextField.context = graphics.__context;
graphics.__canvas.width = width;
graphics.__canvas.height = height;
if(renderer.__isDOM) {
graphics.__canvas.style.width = Math.round(width / pixelRatio) + "px";
graphics.__canvas.style.height = Math.round(height / pixelRatio) + "px";
}
var matrix = (openfl_geom_Matrix().default).__pool.get();
matrix.scale(pixelRatio,pixelRatio);
matrix.concat(graphics.__renderTransform);
CanvasTextField.context.setTransform(matrix.a,matrix.b,matrix.c,matrix.d,matrix.tx,matrix.ty);
(openfl_geom_Matrix().default).__pool.release(matrix);
if(CanvasTextField.clearRect == null) {
CanvasTextField.clearRect = (typeof navigator !== 'undefined' && typeof navigator['isCocoonJS'] !== 'undefined');
}
if(CanvasTextField.clearRect) {
CanvasTextField.context.clearRect(0,0,graphics.__canvas.width,graphics.__canvas.height);
}
if(textEngine.text != null && textEngine.text != "" || textEngine.__hasFocus) {
var text = textEngine.text;
if(!renderer.__allowSmoothing || textEngine.antiAliasType == "advanced" && textEngine.sharpness == 400) {
graphics.__context.imageSmoothingEnabled = false;
} else {
graphics.__context.imageSmoothingEnabled = true;
}
if(textEngine.border || textEngine.background) {
CanvasTextField.context.rect(0.5,0.5,bounds.width - 1,bounds.height - 1);
if(textEngine.background) {
var tmp = (StringTools().default).hex(textEngine.backgroundColor & 16777215,6);
CanvasTextField.context.fillStyle = "#" + tmp;
CanvasTextField.context.fill();
}
if(textEngine.border) {
CanvasTextField.context.lineWidth = 1;
var tmp1 = (StringTools().default).hex(textEngine.borderColor & 16777215,6);
CanvasTextField.context.strokeStyle = "#" + tmp1;
CanvasTextField.context.stroke();
}
}
CanvasTextField.context.textBaseline = "alphabetic";
CanvasTextField.context.textAlign = "start";
var scrollX = -textField.get_scrollH();
var scrollY = 0.0;
var _g = 0;
var _g1 = textField.get_scrollV() - 1;
while(_g < _g1) {
var i = _g++;
scrollY -= textEngine.lineHeights[i];
}
var advance;
var group = new (openfl__$Vector_VectorIterator().default)(textEngine.layoutGroups);
while(group.hasNext()) {
var group1 = group.next();
if(group1.lineIndex < textField.get_scrollV() - 1) {
continue;
}
if(group1.lineIndex > textEngine.get_bottomScrollV() - 1) {
break;
}
var color = "#" + (StringTools().default).hex(group1.format.color & 16777215,6);
CanvasTextField.context.font = (openfl_text__$internal_TextEngine().default).getFont(group1.format);
CanvasTextField.context.fillStyle = color;
CanvasTextField.context.fillText(text.substring(group1.startIndex,group1.endIndex),group1.offsetX + scrollX - bounds.x,group1.offsetY + group1.ascent + scrollY - bounds.y);
if(textField.__caretIndex > -1 && textEngine.selectable) {
if(textField.__selectionIndex == textField.__caretIndex) {
if(textField.__showCursor && group1.startIndex <= textField.__caretIndex && group1.endIndex >= textField.__caretIndex) {
advance = 0.0;
var _g3 = 0;
var _g4 = textField.__caretIndex - group1.startIndex;
while(_g3 < _g4) {
var i1 = _g3++;
if(group1.positions.length <= i1) {
break;
}
advance += group1.getAdvance(i1);
}
var scrollY1 = 0.0;
var _g5 = textField.get_scrollV();
var _g6 = group1.lineIndex + 1;
while(_g5 < _g6) {
var i2 = _g5++;
scrollY1 += textEngine.lineHeights[i2 - 1];
}
CanvasTextField.context.beginPath();
var tmp2 = (StringTools().default).hex(group1.format.color & 16777215,6);
CanvasTextField.context.strokeStyle = "#" + tmp2;
CanvasTextField.context.moveTo(group1.offsetX + advance - textField.get_scrollH() - bounds.x,scrollY1 + 2 - bounds.y);
CanvasTextField.context.lineWidth = 1;
CanvasTextField.context.lineTo(group1.offsetX + advance - textField.get_scrollH() - bounds.x,scrollY1 + (openfl_text__$internal_TextEngine().default).getFormatHeight(textField.get_defaultTextFormat()) - 1 - bounds.y);
CanvasTextField.context.stroke();
CanvasTextField.context.closePath();
}
} else if(group1.startIndex <= textField.__caretIndex && group1.endIndex >= textField.__caretIndex || group1.startIndex <= textField.__selectionIndex && group1.endIndex >= textField.__selectionIndex || group1.startIndex > textField.__caretIndex && group1.endIndex < textField.__selectionIndex || group1.startIndex > textField.__selectionIndex && group1.endIndex < textField.__caretIndex) {
var selectionStart = (Std().default).int(Math.min(textField.__selectionIndex,textField.__caretIndex));
var selectionEnd = (Std().default).int(Math.max(textField.__selectionIndex,textField.__caretIndex));
if(group1.startIndex > selectionStart) {
selectionStart = group1.startIndex;
}
if(group1.endIndex < selectionEnd) {
selectionEnd = group1.endIndex;
}
var end;
var start = textField.getCharBoundaries(selectionStart);
if(selectionEnd >= group1.endIndex) {
end = textField.getCharBoundaries(group1.endIndex - 1);
if(end != null) {
end.x += end.width + 2;
}
} else {
end = textField.getCharBoundaries(selectionEnd);
}
if(start != null && end != null) {
CanvasTextField.context.fillStyle = "#000000";
CanvasTextField.context.fillRect(start.x + scrollX - bounds.x,start.y + scrollY,end.x - start.x,group1.height);
CanvasTextField.context.fillStyle = "#FFFFFF";
CanvasTextField.context.fillText(text.substring(selectionStart,selectionEnd),scrollX + start.x - bounds.x,group1.offsetY + group1.ascent + scrollY);
}
}
}
if(group1.format.underline) {
CanvasTextField.context.beginPath();
CanvasTextField.context.strokeStyle = color;
CanvasTextField.context.lineWidth = 1;
var descent = Math.floor(group1.ascent * 0.185);
var x = group1.offsetX + scrollX - bounds.x;
var y = Math.ceil(group1.offsetY + scrollY + group1.ascent - bounds.y) + descent + 0.5;
CanvasTextField.context.moveTo(x,y);
CanvasTextField.context.lineTo(x + group1.width,y);
CanvasTextField.context.stroke();
CanvasTextField.context.closePath();
}
}
} else {
if(textEngine.border || textEngine.background) {
if(textEngine.border) {
CanvasTextField.context.rect(0.5,0.5,bounds.width - 1,bounds.height - 1);
} else {
CanvasTextField.context.rect(0,0,bounds.width,bounds.height);
}
if(textEngine.background) {
var tmp3 = (StringTools().default).hex(textEngine.backgroundColor & 16777215,6);
CanvasTextField.context.fillStyle = "#" + tmp3;
CanvasTextField.context.fill();
}
if(textEngine.border) {
CanvasTextField.context.lineWidth = 1;
CanvasTextField.context.lineCap = "square";
var tmp4 = (StringTools().default).hex(textEngine.borderColor & 16777215,6);
CanvasTextField.context.strokeStyle = "#" + tmp4;
CanvasTextField.context.stroke();
}
}
if(textField.__caretIndex > -1 && textEngine.selectable && textField.__showCursor) {
var scrollX1 = -textField.get_scrollH() + (useTextBounds ? 0 : cursorOffsetX);
var scrollY2 = 0.0;
var _g2 = 0;
var _g11 = textField.get_scrollV() - 1;
while(_g2 < _g11) {
var i3 = _g2++;
scrollY2 += textEngine.lineHeights[i3];
}
CanvasTextField.context.beginPath();
var tmp5 = (StringTools().default).hex(textField.get_defaultTextFormat().color & 16777215,6);
CanvasTextField.context.strokeStyle = "#" + tmp5;
CanvasTextField.context.moveTo(scrollX1 + 2.5,scrollY2 + 2.5);
CanvasTextField.context.lineWidth = 1;
CanvasTextField.context.lineTo(scrollX1 + 2.5,scrollY2 + (openfl_text__$internal_TextEngine().default).getFormatHeight(textField.get_defaultTextFormat()) - 1);
CanvasTextField.context.stroke();
CanvasTextField.context.closePath();
}
}
graphics.__bitmap = (openfl_display_BitmapData().default).fromCanvas(textField.__graphics.__canvas);
graphics.__bitmapScale = pixelRatio;
graphics.__visible = true;
textField.__dirty = false;
graphics.__softwareDirty = false;
graphics.set___dirty(false);
}
}
}
CanvasTextField.renderDrawable = function(textField,renderer) {
if(renderer.__isDOM && !textField.__renderedOnCanvasWhileOnDOM) {
textField.__renderedOnCanvasWhileOnDOM = true;
if(textField.get_type() == "input") {
textField.replaceText(0,textField.__text.length,textField.__text);
}
if(textField.__isHTML) {
textField.__updateText((openfl_text__$internal_HTMLParser().default).parse(textField.__text,textField.get_multiline(),textField.__styleSheet,textField.__textFormat,textField.__textEngine.textFormatRanges));
}
textField.__dirty = true;
textField.__layoutDirty = true;
textField.__setRenderDirty();
}
if(textField.get_mask() == null || textField.get_mask().get_width() > 0 && textField.get_mask().get_height() > 0) {
renderer.__updateCacheBitmap(textField,textField.__dirty);
if(textField.__cacheBitmap != null && !textField.__isCacheBitmapRender) {
(openfl_display__$internal_CanvasBitmap().default).render(textField.__cacheBitmap,renderer);
} else {
CanvasTextField.render(textField,renderer,textField.__worldTransform);
var smoothingEnabled = false;
if(textField.__textEngine.antiAliasType == "advanced" && textField.__textEngine.gridFitType == "pixel") {
smoothingEnabled = renderer.context.imageSmoothingEnabled;
if(smoothingEnabled) {
renderer.context.imageSmoothingEnabled = false;
}
}
(openfl_display__$internal_CanvasDisplayObject().default).render(textField,renderer);
if(smoothingEnabled) {
renderer.context.imageSmoothingEnabled = true;
}
}
}
}
CanvasTextField.renderDrawableMask = function(textField,renderer) {
(openfl_display__$internal_CanvasDisplayObject().default).renderDrawableMask(textField,renderer);
}
CanvasTextField.__meta__ = { obj : { SuppressWarnings : ["checkstyle:FieldDocComment"]}}
// Export
exports.default = CanvasTextField;