var CanvasPool = require('../../display/canvas/CanvasPool'); var MeasureText = function (textStyle){ var canvas = CanvasPool.create(this); var context = canvas.getContext('2d'); textStyle.syncFont(canvas, context); var width = Math.ceil(context.measureText(textStyle.testString).width * 1.2); var baseline = width; var height = 2 * baseline; baseline = baseline * 1.4 | 0; canvas.width = width; canvas.height = height; context.fillStyle = '#f00'; context.fillRect(0, 0, width, height); context.font = textStyle._font; context.textBaseline = 'alphabetic'; context.fillStyle = '#000'; context.fillText(textStyle.testString, 0, baseline); var output = { ascent: 0, descent: 0, fontSize: 0} ; if (!context.getImageData(0, 0, width, height)) { output.ascent = baseline; output.descent = baseline + 6; output.fontSize = output.ascent + output.descent; CanvasPool.remove(canvas); return output; } var imagedata = context.getImageData(0, 0, width, height).data; var pixels = _AN_Read_length('length', imagedata); var line = width * 4; var i; var j; var idx = 0; var stop = false ; for (i = 0; i < baseline; i++ ){ for (j = 0; j < line; j += 4){ if (imagedata[idx + j] !== 255) { stop = true ; break ; } } if (!stop) { idx += line; } else { break ; } } output.ascent = baseline - i; idx = pixels - line; stop = false ; for (i = height; i > baseline; i-- ){ for (j = 0; j < line; j += 4){ if (imagedata[idx + j] !== 255) { stop = true ; break ; } } if (!stop) { idx -= line; } else { break ; } } output.descent = (i - baseline); output.fontSize = output.ascent + output.descent; CanvasPool.remove(canvas); return output; } ; module.exports = MeasureText;