| - name: 2d.text.draw.fill.basic |
| desc: fillText draws filled text |
| manual: |
| testing: |
| - 2d.text.draw |
| - 2d.text.draw.fill |
| code: | |
| ctx.fillStyle = '#000'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.strokeStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('PASS', 5, 35); |
| expected: &passfill | |
| size 100 50 |
| cr.set_source_rgb(0, 0, 0) |
| cr.rectangle(0, 0, 100, 50) |
| cr.fill() |
| cr.set_source_rgb(0, 1, 0) |
| cr.select_font_face("Arial") |
| cr.set_font_size(35) |
| cr.translate(5, 35) |
| cr.text_path("PASS") |
| cr.fill() |
| |
| - name: 2d.text.draw.fill.unaffected |
| desc: fillText does not start a new path or subpath |
| testing: |
| - 2d.text.draw.fill |
| code: | |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| |
| ctx.moveTo(0, 0); |
| ctx.lineTo(100, 0); |
| |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('FAIL', 5, 35); |
| |
| ctx.lineTo(100, 50); |
| ctx.lineTo(0, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fill(); |
| |
| @assert pixel 50,25 == 0,255,0,255; |
| @assert pixel 5,45 == 0,255,0,255; |
| expected: green |
| |
| - name: 2d.text.draw.fill.rtl |
| desc: fillText respects Right-To-Left Override characters |
| manual: |
| testing: |
| - 2d.text.draw |
| code: | |
| ctx.fillStyle = '#000'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.strokeStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('\u202eFAIL \xa0 \xa0 SSAP', 5, 35); |
| expected: *passfill |
| - name: 2d.text.draw.fill.maxWidth.large |
| desc: fillText handles maxWidth correctly |
| manual: |
| testing: |
| - 2d.text.draw.maxwidth |
| code: | |
| ctx.fillStyle = '#000'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('PASS', 5, 35, 200); |
| expected: *passfill |
| - name: 2d.text.draw.fill.maxWidth.small |
| desc: fillText handles maxWidth correctly |
| testing: |
| - 2d.text.draw.maxwidth |
| code: | |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('fail fail fail fail fail', -100, 35, 90); |
| _assertGreen(ctx, 100, 50); |
| expected: green |
| |
| - name: 2d.text.draw.fill.maxWidth.zero |
| desc: fillText handles maxWidth correctly |
| testing: |
| - 2d.text.draw.maxwidth |
| code: | |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('fail fail fail fail fail', 5, 35, 0); |
| _assertGreen(ctx, 100, 50); |
| expected: green |
| |
| - name: 2d.text.draw.fill.maxWidth.negative |
| desc: fillText handles maxWidth correctly |
| testing: |
| - 2d.text.draw.maxwidth |
| code: | |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('fail fail fail fail fail', 5, 35, -1); |
| _assertGreen(ctx, 100, 50); |
| expected: green |
| |
| - name: 2d.text.draw.fill.maxWidth.NaN |
| desc: fillText handles maxWidth correctly |
| testing: |
| - 2d.text.draw.maxwidth |
| code: | |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.fillText('fail fail fail fail fail', 5, 35, NaN); |
| _assertGreen(ctx, 100, 50); |
| expected: green |
| |
| - name: 2d.text.draw.stroke.basic |
| desc: strokeText draws stroked text |
| manual: |
| testing: |
| - 2d.text.draw |
| - 2d.text.draw.stroke |
| code: | |
| ctx.fillStyle = '#000'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.strokeStyle = '#0f0'; |
| ctx.fillStyle = '#f00'; |
| ctx.lineWidth = 1; |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.strokeText('PASS', 5, 35); |
| expected: | |
| size 100 50 |
| cr.set_source_rgb(0, 0, 0) |
| cr.rectangle(0, 0, 100, 50) |
| cr.fill() |
| cr.set_source_rgb(0, 1, 0) |
| cr.select_font_face("Arial") |
| cr.set_font_size(35) |
| cr.set_line_width(1) |
| cr.translate(5, 35) |
| cr.text_path("PASS") |
| cr.stroke() |
| |
| - name: 2d.text.draw.stroke.unaffected |
| desc: strokeText does not start a new path or subpath |
| testing: |
| - 2d.text.draw.stroke |
| code: | |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| |
| ctx.moveTo(0, 0); |
| ctx.lineTo(100, 0); |
| |
| ctx.font = '35px Arial, sans-serif'; |
| ctx.strokeStyle = '#f00'; |
| ctx.strokeText('FAIL', 5, 35); |
| |
| ctx.lineTo(100, 50); |
| ctx.lineTo(0, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fill(); |
| |
| @assert pixel 50,25 == 0,255,0,255; |
| @assert pixel 5,45 == 0,255,0,255; |
| expected: green |
| |
| - name: 2d.text.draw.kern.consistent |
| desc: Stroked and filled text should have exactly the same kerning so it overlaps |
| manual: |
| testing: |
| - 2d.text.draw |
| code: | |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.strokeStyle = '#0f0'; |
| ctx.lineWidth = 3; |
| ctx.font = '20px Arial, sans-serif'; |
| ctx.fillText('VAVAVAVAVAVAVA', -50, 25); |
| ctx.fillText('ToToToToToToTo', -50, 45); |
| ctx.strokeText('VAVAVAVAVAVAVA', -50, 25); |
| ctx.strokeText('ToToToToToToTo', -50, 45); |
| expected: green |
| |
| # CanvasTest is: |
| # A = (0, 0) to (1em, 0.75em) (above baseline) |
| # B = (0, 0) to (1em, -0.25em) (below baseline) |
| # C = (0, -0.25em) to (1em, 0.75em) (the em square) plus some Xs above and below |
| # D = (0, -0.25em) to (1em, 0.75em) (the em square) plus some Xs left and right |
| # E = (0, -0.25em) to (1em, 0.75em) (the em square) |
| # space = empty, 1em wide |
| # |
| # At 50px, "E" will fill the canvas vertically |
| # At 67px, "A" will fill the canvas vertically |
| # |
| # Ideographic baseline is 0.125em above alphabetic |
| # Mathematical baseline is 0.375em above alphabetic |
| # Hanging baseline is 0.500em above alphabetic |
| |
| # WebKit doesn't block onload on font loads, so we try to make it a bit more reliable |
| # by waiting with step_timeout after load before drawing |
| |
| - name: 2d.text.draw.fill.maxWidth.fontface |
| desc: fillText works on @font-face fonts |
| testing: |
| - 2d.text.draw.maxwidth |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#0f0'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#f00'; |
| ctx.fillText('EEEE', -50, 37.5, 40); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.fill.maxWidth.bound |
| desc: fillText handles maxWidth based on line size, not bounding box size |
| testing: |
| - 2d.text.draw.maxwidth |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('DD', 0, 37.5, 100); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.fontface |
| testing: |
| - 2d.text.font.fontface |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '67px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('AA', 0, 50); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.fontface.repeat |
| desc: Draw with the font immediately, then wait a bit until and draw again. (This |
| crashes some version of WebKit.) |
| testing: |
| - 2d.text.font.fontface |
| fonts: |
| - CanvasTest |
| fonthack: 0 |
| code: | |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.font = '67px CanvasTest'; |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('AA', 0, 50); |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillText('AA', 0, 50); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.fontface.notinpage |
| desc: '@font-face fonts should work even if they are not used in the page' |
| testing: |
| - 2d.text.font.fontface |
| fonts: |
| - CanvasTest |
| fonthack: 0 |
| code: | |
| ctx.font = '67px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('AA', 0, 50); |
| @assert pixel 5,5 ==~ 0,255,0,255; @moz-todo |
| @assert pixel 95,5 ==~ 0,255,0,255; @moz-todo |
| @assert pixel 25,25 ==~ 0,255,0,255; @moz-todo |
| @assert pixel 75,25 ==~ 0,255,0,255; @moz-todo |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.left |
| desc: textAlign left is the left of the first em square (not the bounding box) |
| testing: |
| - 2d.text.align.left |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'left'; |
| ctx.fillText('DD', 0, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.right |
| desc: textAlign right is the right of the last em square (not the bounding box) |
| testing: |
| - 2d.text.align.right |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'right'; |
| ctx.fillText('DD', 100, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.start.ltr |
| desc: textAlign start with ltr is the left edge |
| testing: |
| - 2d.text.align.left |
| fonts: |
| - CanvasTest |
| canvas: width="100" height="50" dir="ltr" |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'start'; |
| ctx.fillText('DD', 0, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.start.rtl |
| desc: textAlign start with rtl is the right edge |
| testing: |
| - 2d.text.align.right |
| - 2d.text.draw.direction |
| fonts: |
| - CanvasTest |
| canvas: width="100" height="50" dir="rtl" |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'start'; |
| ctx.fillText('DD', 100, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.end.ltr |
| desc: textAlign end with ltr is the right edge |
| testing: |
| - 2d.text.align.right |
| fonts: |
| - CanvasTest |
| canvas: width="100" height="50" dir="ltr" |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'end'; |
| ctx.fillText('DD', 100, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.end.rtl |
| desc: textAlign end with rtl is the left edge |
| testing: |
| - 2d.text.align.left |
| - 2d.text.draw.direction |
| fonts: |
| - CanvasTest |
| canvas: width="100" height="50" dir="rtl" |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'end'; |
| ctx.fillText('DD', 0, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.align.center |
| desc: textAlign center is the center of the em squares (not the bounding box) |
| testing: |
| - 2d.text.align.center |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.textAlign = 'center'; |
| ctx.fillText('DD', 50, 37.5); |
| @assert pixel 5,5 ==~ 0,255,0,255; |
| @assert pixel 95,5 ==~ 0,255,0,255; |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| @assert pixel 5,45 ==~ 0,255,0,255; |
| @assert pixel 95,45 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| |
| - name: 2d.text.draw.space.basic |
| desc: U+0020 is rendered the correct size (1em wide) |
| testing: |
| - 2d.text.draw.spaces |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('E EE', -100, 37.5); |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.draw.space.collapse.nonspace |
| desc: Non-space characters are not converted to U+0020 and collapsed |
| testing: |
| - 2d.text.draw.spaces |
| fonts: |
| - CanvasTest |
| code: | |
| ctx.font = '50px CanvasTest'; |
| deferTest(); |
| step_timeout(t.step_func_done(function () { |
| ctx.fillStyle = '#f00'; |
| ctx.fillRect(0, 0, 100, 50); |
| ctx.fillStyle = '#0f0'; |
| ctx.fillText('E\x0b EE', -150, 37.5); |
| @assert pixel 25,25 ==~ 0,255,0,255; |
| @assert pixel 75,25 ==~ 0,255,0,255; |
| }), 500); |
| expected: green |
| |
| - name: 2d.text.measure.width.basic |
| desc: The width of character is same as font used |
| testing: |
| - 2d.text.measure |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| @assert ctx.measureText('A').width === 50; |
| @assert ctx.measureText('AA').width === 100; |
| @assert ctx.measureText('ABCD').width === 200; |
| |
| ctx.font = '100px CanvasTest'; |
| @assert ctx.measureText('A').width === 100; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.width.empty |
| desc: The empty string has zero width |
| testing: |
| - 2d.text.measure |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| @assert ctx.measureText("").width === 0; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.advances |
| desc: Testing width advances |
| testing: |
| - 2d.text.measure.advances |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| // Some platforms may return '-0'. |
| @assert Math.abs(ctx.measureText('Hello').advances[0]) === 0; |
| // Different platforms may render text slightly different. |
| @assert ctx.measureText('Hello').advances[1] >= 36; |
| @assert ctx.measureText('Hello').advances[2] >= 58; |
| @assert ctx.measureText('Hello').advances[3] >= 70; |
| @assert ctx.measureText('Hello').advances[4] >= 80; |
| |
| var tm = ctx.measureText('Hello'); |
| @assert ctx.measureText('Hello').advances[0] === tm.advances[0]; |
| @assert ctx.measureText('Hello').advances[1] === tm.advances[1]; |
| @assert ctx.measureText('Hello').advances[2] === tm.advances[2]; |
| @assert ctx.measureText('Hello').advances[3] === tm.advances[3]; |
| @assert ctx.measureText('Hello').advances[4] === tm.advances[4]; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.actualBoundingBox |
| desc: Testing actualBoundingBox |
| testing: |
| - 2d.text.measure.actualBoundingBox |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| ctx.baseline = 'alphabetic' |
| // Different platforms may render text slightly different. |
| // Values that are nominally expected to be zero might actually vary by a pixel or so |
| // if the UA accounts for antialiasing at glyph edges, so we allow a slight deviation. |
| @assert Math.abs(ctx.measureText('A').actualBoundingBoxLeft) <= 1; |
| @assert ctx.measureText('A').actualBoundingBoxRight >= 50; |
| @assert ctx.measureText('A').actualBoundingBoxAscent >= 35; |
| @assert Math.abs(ctx.measureText('A').actualBoundingBoxDescent) <= 1; |
| |
| @assert ctx.measureText('D').actualBoundingBoxLeft >= 48; |
| @assert ctx.measureText('D').actualBoundingBoxLeft <= 52; |
| @assert ctx.measureText('D').actualBoundingBoxRight >= 75; |
| @assert ctx.measureText('D').actualBoundingBoxRight <= 80; |
| @assert ctx.measureText('D').actualBoundingBoxAscent >= 35; |
| @assert ctx.measureText('D').actualBoundingBoxAscent <= 40; |
| @assert ctx.measureText('D').actualBoundingBoxDescent >= 12; |
| @assert ctx.measureText('D').actualBoundingBoxDescent <= 15; |
| |
| @assert Math.abs(ctx.measureText('ABCD').actualBoundingBoxLeft) <= 1; |
| @assert ctx.measureText('ABCD').actualBoundingBoxRight >= 200; |
| @assert ctx.measureText('ABCD').actualBoundingBoxAscent >= 85; |
| @assert ctx.measureText('ABCD').actualBoundingBoxDescent >= 37; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.fontBoundingBox |
| desc: Testing fontBoundingBox |
| testing: |
| - 2d.text.measure.fontBoundingBox |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| @assert ctx.measureText('A').fontBoundingBoxAscent === 85; |
| @assert ctx.measureText('A').fontBoundingBoxDescent === 39; |
| |
| @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 85; |
| @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 39; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.fontBoundingBox.ahem |
| desc: Testing fontBoundingBox for font ahem |
| testing: |
| - 2d.text.measure.fontBoundingBox |
| fonts: |
| - Ahem |
| code: | |
| deferTest(); |
| var f = new FontFace("Ahem", "/fonts/Ahem.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px Ahem'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| @assert ctx.measureText('A').fontBoundingBoxAscent === 40; |
| @assert ctx.measureText('A').fontBoundingBoxDescent === 10; |
| |
| @assert ctx.measureText('ABCD').fontBoundingBoxAscent === 40; |
| @assert ctx.measureText('ABCD').fontBoundingBoxDescent === 10; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.emHeights |
| desc: Testing emHeights |
| testing: |
| - 2d.text.measure.emHeights |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| @assert ctx.measureText('A').emHeightAscent === 37.5; |
| @assert ctx.measureText('A').emHeightDescent === 12.5; |
| @assert ctx.measureText('A').emHeightDescent + ctx.measureText('A').emHeightAscent === 50; |
| |
| @assert ctx.measureText('ABCD').emHeightAscent === 37.5; |
| @assert ctx.measureText('ABCD').emHeightDescent === 12.5; |
| @assert ctx.measureText('ABCD').emHeightDescent + ctx.measureText('ABCD').emHeightAscent === 50; |
| }), 500); |
| }); |
| |
| - name: 2d.text.measure.baselines |
| desc: Testing baselines |
| testing: |
| - 2d.text.measure.baselines |
| fonts: |
| - CanvasTest |
| code: | |
| deferTest(); |
| var f = new FontFace("CanvasTest", "/fonts/CanvasTest.ttf"); |
| document.fonts.add(f); |
| document.fonts.ready.then(() => { |
| step_timeout(t.step_func_done(function () { |
| ctx.font = '50px CanvasTest'; |
| ctx.direction = 'ltr'; |
| ctx.align = 'left' |
| @assert Math.abs(ctx.measureText('A').getBaselines().alphabetic) === 0; |
| @assert ctx.measureText('A').getBaselines().ideographic === -39; |
| @assert ctx.measureText('A').getBaselines().hanging === 68; |
| |
| @assert Math.abs(ctx.measureText('ABCD').getBaselines().alphabetic) === 0; |
| @assert ctx.measureText('ABCD').getBaselines().ideographic === -39; |
| @assert ctx.measureText('ABCD').getBaselines().hanging === 68; |
| }), 500); |
| }); |
| |
| # TODO: shadows, alpha, composite, clip |