UNPKG

openfl

Version:

A fast, productive library for 2D cross-platform development.

328 lines (311 loc) 15 kB
// 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;