WebKit Bugzilla
Attachment 349684 Details for
Bug 157629
: Implement more of the canvas TextMetrics API
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-157629-20180913112137.patch (text/plain), 210.28 KB, created by
Justin Michaud
on 2018-09-13 11:21:38 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Justin Michaud
Created:
2018-09-13 11:21:38 PDT
Size:
210.28 KB
patch
obsolete
>Subversion Revision: 235896 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 5e31f28df4ba429c6a4c2f1b65a3a8d5c402fce1..528c233ec47bb0080d34f6016fcff8363561f84f 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,45 @@ >+2018-09-13 Justin Michaud <justin_michaud@apple.com> >+ >+ Implement more of the canvas TextMetrics API >+ https://bugs.webkit.org/show_bug.cgi?id=157629 >+ >+ Move canvas TextMetrics API baselines to a separate dictionary, add >+ advances. See https://github.com/whatwg/html/pull/3931 >+ >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ No new tests (OOPS!). >+ >+ * CMakeLists.txt: >+ * DerivedSources.make: >+ * Sources.txt: >+ * WebCore.xcodeproj/project.pbxproj: >+ * html/Baselines.h: Copied from Source/WebCore/html/TextMetrics.idl. >+ * html/Baselines.idl: Added. >+ * html/TextMetrics.h: >+ (WebCore::TextMetrics::advances const): >+ (WebCore::TextMetrics::setAdvances): >+ (WebCore::TextMetrics::getBaselines const): >+ (WebCore::TextMetrics::setBaselines): >+ (WebCore::TextMetrics::hangingBaseline const): Deleted. >+ (WebCore::TextMetrics::setHangingBaseline): Deleted. >+ (WebCore::TextMetrics::alphabeticBaseline const): Deleted. >+ (WebCore::TextMetrics::setAlphabeticBaseline): Deleted. >+ (WebCore::TextMetrics::ideographicBaseline const): Deleted. >+ (WebCore::TextMetrics::setIdeographicBaseline): Deleted. >+ * html/TextMetrics.idl: >+ * html/canvas/CanvasRenderingContext2D.cpp: >+ (WebCore::CanvasRenderingContext2D::measureText): >+ * html/canvas/CanvasRenderingContext2DBase.cpp: >+ (WebCore::CanvasRenderingContext2DBase::FontProxy::getAdvances const): >+ (WebCore::CanvasRenderingContext2DBase::FontProxy::getOffsetsInString const): >+ * html/canvas/CanvasRenderingContext2DBase.h: >+ * platform/graphics/FontCascade.cpp: >+ (WebCore::FontCascade::getAdvances const): >+ (WebCore::FontCascade::getOffsetsInString const): >+ * platform/graphics/FontCascade.h: >+ > 2018-09-11 Pablo Saavedra <psaavedra@igalia.com> > > playbackControlsManagerUpdateTimerFired and >diff --git a/Source/WebCore/CMakeLists.txt b/Source/WebCore/CMakeLists.txt >index d46a55cbf1be313a4e28fad4b41dec0c4d0d0413..4f40e9a6c87ca126ad3e8ef6511fce5beee7a136 100644 >--- a/Source/WebCore/CMakeLists.txt >+++ b/Source/WebCore/CMakeLists.txt >@@ -645,6 +645,7 @@ set(WebCore_NON_SVG_IDL_FILES > fileapi/FileReader.idl > fileapi/FileReaderSync.idl > >+ html/Baselines.idl > html/DOMFormData.idl > html/DOMTokenList.idl > html/DOMURL.idl >diff --git a/Source/WebCore/DerivedSources.make b/Source/WebCore/DerivedSources.make >index 5db30145aa726f5b3b0ad3accf74720c4a212641..1580b31a8f0049ceb3a8ead44b4e7c7bceae6740 100644 >--- a/Source/WebCore/DerivedSources.make >+++ b/Source/WebCore/DerivedSources.make >@@ -648,6 +648,7 @@ JS_BINDING_IDLS = \ > $(WebCore)/html/OffscreenCanvas.idl \ > $(WebCore)/html/RadioNodeList.idl \ > $(WebCore)/html/TextMetrics.idl \ >+ $(WebCore)/html/Baselines.idl \ > $(WebCore)/html/TimeRanges.idl \ > $(WebCore)/html/URLSearchParams.idl \ > $(WebCore)/html/ValidityState.idl \ >diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt >index e708db44abb392cd0390882bddbfd1ed20b9fd55..8d11543db68d426ff624378e6162a05f4ee5d40c 100644 >--- a/Source/WebCore/Sources.txt >+++ b/Source/WebCore/Sources.txt >@@ -3094,6 +3094,7 @@ JSTextDecoder.cpp > JSTextEncoder.cpp > JSTextEvent.cpp > JSTextMetrics.cpp >+JSBaselines.cpp > JSTimeRanges.cpp > JSTransitionEvent.cpp > JSTreeWalker.cpp >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 1e63243548689fe500941b1b9cbfd5013119fdf5..139025e28eb03d0cbfdddb3a031a5585d9b31c60 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -3852,7 +3852,6 @@ > BCEF444A0E6745E0001C1287 /* StyleGeneratedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEF44490E6745E0001C1287 /* StyleGeneratedImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; > BCEF444D0E674628001C1287 /* StyleCachedImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEF444C0E674628001C1287 /* StyleCachedImage.h */; settings = {ATTRIBUTES = (Private, ); }; }; > BCEF45E90E687767001C1287 /* TextMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEF45E80E687767001C1287 /* TextMetrics.h */; }; >- BCEF45F60E687B5C001C1287 /* JSTextMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEF45F40E687B5C001C1287 /* JSTextMetrics.h */; }; > BCEF869F0E844E9D00A85CD5 /* ScrollbarThemeMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BCEF869E0E844E9D00A85CD5 /* ScrollbarThemeMac.mm */; }; > BCEFE1EB0DCA5F6400739219 /* JSXSLTProcessor.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEFE1E90DCA5F6400739219 /* JSXSLTProcessor.h */; }; > BCF7E491137CD7C7001DDAE7 /* AdjustViewSizeOrNot.h in Headers */ = {isa = PBXBuildFile; fileRef = BCF48CE61370D114004E87D6 /* AdjustViewSizeOrNot.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -7803,6 +7802,8 @@ > 4B3043CB0AE0373B00A82647 /* Editor.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Editor.h; sourceTree = "<group>"; }; > 4B3480910EEF50D400AC1B41 /* ImageSourceCGMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageSourceCGMac.mm; sourceTree = "<group>"; }; > 4B3480920EEF50D400AC1B41 /* ImageSourceCG.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageSourceCG.h; sourceTree = "<group>"; }; >+ 4B409DEE214830310002C7DB /* Baselines.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = Baselines.idl; sourceTree = "<group>"; }; >+ 4B409DF021483BBB0002C7DB /* Baselines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Baselines.h; sourceTree = "<group>"; }; > 4B6FA6F20C39E48C00087011 /* SmartReplace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SmartReplace.h; sourceTree = "<group>"; }; > 4B6FA6F60C39E4A100087011 /* SmartReplaceCF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SmartReplaceCF.cpp; sourceTree = "<group>"; }; > 4BAE95B00B2FA9CE00AED8A0 /* EditorDeleteAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditorDeleteAction.h; sourceTree = "<group>"; }; >@@ -12963,8 +12964,6 @@ > BCEF447C0E674806001C1287 /* StyleGeneratedImage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StyleGeneratedImage.cpp; sourceTree = "<group>"; }; > BCEF453F0E676AC1001C1287 /* TextMetrics.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TextMetrics.idl; sourceTree = "<group>"; }; > BCEF45E80E687767001C1287 /* TextMetrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextMetrics.h; sourceTree = "<group>"; }; >- BCEF45F30E687B5C001C1287 /* JSTextMetrics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTextMetrics.cpp; sourceTree = "<group>"; }; >- BCEF45F40E687B5C001C1287 /* JSTextMetrics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSTextMetrics.h; sourceTree = "<group>"; }; > BCEF869E0E844E9D00A85CD5 /* ScrollbarThemeMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollbarThemeMac.mm; sourceTree = "<group>"; }; > BCEFAF4D0C317E6900FA81F6 /* JSEventCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSEventCustom.cpp; sourceTree = "<group>"; }; > BCEFE1DC0DCA5CFD00739219 /* XSLTProcessor.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = XSLTProcessor.idl; sourceTree = "<group>"; }; >@@ -20377,6 +20376,8 @@ > C33EE5C314FB49610002095A /* BaseClickableWithKeyInputType.h */, > F59C95FD1255B23F000623C0 /* BaseDateAndTimeInputType.cpp */, > F59C95FE1255B23F000623C0 /* BaseDateAndTimeInputType.h */, >+ 4B409DF021483BBB0002C7DB /* Baselines.h */, >+ 4B409DEE214830310002C7DB /* Baselines.idl */, > F55B3D791251F12D003EF269 /* BaseTextInputType.cpp */, > F55B3D7A1251F12D003EF269 /* BaseTextInputType.h */, > F55B3D7B1251F12D003EF269 /* ButtonInputType.cpp */, >@@ -21949,8 +21950,6 @@ > 7C193BFE1F5E10D70088F3E6 /* JSPath2D.h */, > B658FF9F1522EF3A00DD5595 /* JSRadioNodeList.cpp */, > B658FFA01522EF3A00DD5595 /* JSRadioNodeList.h */, >- BCEF45F30E687B5C001C1287 /* JSTextMetrics.cpp */, >- BCEF45F40E687B5C001C1287 /* JSTextMetrics.h */, > 0707568E1422668C00414161 /* JSTextTrack.cpp */, > 0707568F1422668C00414161 /* JSTextTrack.h */, > 070756D714239B4B00414161 /* JSTextTrackCue.cpp */, >@@ -29147,7 +29146,6 @@ > B2FA3E190AB75A6F000E5AC4 /* JSSVGZoomEvent.h in Headers */, > 65DF320409D1CC60000BE325 /* JSText.h in Headers */, > 933A14B90B7D1D5200A53FFD /* JSTextEvent.h in Headers */, >- BCEF45F60E687B5C001C1287 /* JSTextMetrics.h in Headers */, > 070756951422668D00414161 /* JSTextTrack.h in Headers */, > 070756DE14239B4E00414161 /* JSTextTrackCue.h in Headers */, > 070756E014239B4E00414161 /* JSTextTrackCueList.h in Headers */, >diff --git a/Source/WebCore/html/Baselines.h b/Source/WebCore/html/Baselines.h >new file mode 100644 >index 0000000000000000000000000000000000000000..41c37a14cff14617b32464d733f1fcfa01581d23 >--- /dev/null >+++ b/Source/WebCore/html/Baselines.h >@@ -0,0 +1,36 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+namespace WebCore { >+ >+struct Baselines { >+ std::optional<double> alphabetic; >+ std::optional<double> hanging; >+ std::optional<double> ideographic; >+}; >+ >+} >diff --git a/Source/WebCore/html/Baselines.idl b/Source/WebCore/html/Baselines.idl >new file mode 100644 >index 0000000000000000000000000000000000000000..b3d7bb9d26e0081871a9ae5717167c153954f528 >--- /dev/null >+++ b/Source/WebCore/html/Baselines.idl >@@ -0,0 +1,32 @@ >+/* >+* Copyright (C) 2018 Apple Inc. All Rights Reserved. >+* >+* Redistribution and use in source and binary forms, with or without >+* modification, are permitted provided that the following conditions >+* are met: >+* 1. Redistributions of source code must retain the above copyright >+* notice, this list of conditions and the following disclaimer. >+* 2. Redistributions in binary form must reproduce the above copyright >+* notice, this list of conditions and the following disclaimer in the >+* documentation and/or other materials provided with the distribution. >+* >+* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+*/ >+ >+[ >+ JSGenerateToJSObject >+] dictionary Baselines { >+ double alphabetic; >+ double hanging; >+ double ideographic; >+}; >diff --git a/Source/WebCore/html/TextMetrics.h b/Source/WebCore/html/TextMetrics.h >index 0fccffe76edf5d16678e233453d67d7c213afa5b..82108496afce2967877644e9dbbc6f235042b950 100644 >--- a/Source/WebCore/html/TextMetrics.h >+++ b/Source/WebCore/html/TextMetrics.h >@@ -25,11 +25,15 @@ > > #pragma once > >+#include "Baselines.h" >+ > #include <wtf/Ref.h> > #include <wtf/RefCounted.h> > > namespace WebCore { > >+typedef Vector<double> AdvancesArray; >+ > class TextMetrics : public RefCounted<TextMetrics> { > public: > static Ref<TextMetrics> create() { return adoptRef(*new TextMetrics); } >@@ -37,6 +41,9 @@ public: > float width() const { return m_width; } > void setWidth(float w) { m_width = w; } > >+ const AdvancesArray& advances() const { return m_advances; } >+ void setAdvances(AdvancesArray value) { m_advances = WTFMove(value); } >+ > float actualBoundingBoxLeft() const { return m_actualBoundingBoxLeft; } > void setActualBoundingBoxLeft(float value) { m_actualBoundingBoxLeft = value; } > >@@ -61,17 +68,12 @@ public: > float emHeightDescent() const { return m_emHeightDescent; } > void setEmHeightDescent(float value) { m_emHeightDescent = value; } > >- float hangingBaseline() const { return m_hangingBaseline; } >- void setHangingBaseline(float value) { m_hangingBaseline = value; } >- >- float alphabeticBaseline() const { return m_alphabeticBaseline; } >- void setAlphabeticBaseline(float value) { m_alphabeticBaseline = value; } >- >- float ideographicBaseline() const { return m_ideographicBaseline; } >- void setIdeographicBaseline(float value) { m_ideographicBaseline = value; } >+ Baselines getBaselines() const { return m_baselines; } >+ void setBaselines(Baselines value) { m_baselines = value; } > > private: > float m_width { 0 }; >+ AdvancesArray m_advances; > float m_actualBoundingBoxLeft { 0 }; > float m_actualBoundingBoxRight { 0 }; > float m_fontBoundingBoxAscent { 0 }; >@@ -80,9 +82,7 @@ private: > float m_actualBoundingBoxDescent { 0 }; > float m_emHeightAscent { 0 }; > float m_emHeightDescent { 0 }; >- float m_hangingBaseline { 0 }; >- float m_alphabeticBaseline { 0 }; >- float m_ideographicBaseline { 0 }; >+ Baselines m_baselines { 0, 0, 0 }; > }; > > } // namespace WebCore >diff --git a/Source/WebCore/html/TextMetrics.idl b/Source/WebCore/html/TextMetrics.idl >index 0af50920c101dcb0ac5500d4990f61b0b1b7e505..1f7af26bec0e9d40df7c65566b00fd2073940fab 100644 >--- a/Source/WebCore/html/TextMetrics.idl >+++ b/Source/WebCore/html/TextMetrics.idl >@@ -24,25 +24,22 @@ > */ > > [ >- Exposed=Window, >+ Exposed=(Window,Worker), > ImplementationLacksVTable, > ] interface TextMetrics { >- // FIXME: All the unrestricted float attributes below should be doubles. >- > // x-direction >- readonly attribute unrestricted float width; // advance width >- readonly attribute unrestricted float actualBoundingBoxLeft; >- readonly attribute unrestricted float actualBoundingBoxRight; >+ readonly attribute double width; // advance width >+ readonly attribute FrozenArray<double> advances; >+ readonly attribute double actualBoundingBoxLeft; >+ readonly attribute double actualBoundingBoxRight; > > // y-direction >- readonly attribute unrestricted float fontBoundingBoxAscent; >- readonly attribute unrestricted float fontBoundingBoxDescent; >- readonly attribute unrestricted float actualBoundingBoxAscent; >- readonly attribute unrestricted float actualBoundingBoxDescent; >- readonly attribute unrestricted float emHeightAscent; >- readonly attribute unrestricted float emHeightDescent; >- readonly attribute unrestricted float hangingBaseline; >- readonly attribute unrestricted float alphabeticBaseline; >- readonly attribute unrestricted float ideographicBaseline; >+ readonly attribute double fontBoundingBoxAscent; >+ readonly attribute double fontBoundingBoxDescent; >+ readonly attribute double actualBoundingBoxAscent; >+ readonly attribute double actualBoundingBoxDescent; >+ readonly attribute double emHeightAscent; >+ readonly attribute double emHeightDescent; >+ Baselines getBaselines(); > }; > >diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >index e27d95194819b02e9414d49bfa8faff2ea1761de..4a4d3cdab202012a80b94acb23b9b00a3d457b37 100644 >--- a/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp >@@ -381,6 +381,24 @@ Ref<TextMetrics> CanvasRenderingContext2D::measureText(const String& text) > float fontWidth = font.width(textRun, &glyphOverflow); > metrics->setWidth(fontWidth); > >+ Vector<double> advances = fontProxy().getAdvances(textRun); >+ advances.removeLast(); >+ for (size_t i = 1; i < advances.size(); ++i) >+ advances[i] += advances[i-1]; >+ >+ Vector<size_t> offsetsInString = fontProxy().getOffsetsInString(textRun); >+ assert(offsetsInString.size() == advances.size()); >+ >+ Vector<double> characterAdvances; >+ for (size_t i = 0; i < advances.size(); ++i) { >+ size_t currentOffset = offsetsInString[i]; >+ size_t nextOffset = i + 1 < advances.size() ? offsetsInString[i + 1] : textRun.text().length(); >+ >+ for (size_t j = currentOffset; j < nextOffset; ++j) >+ characterAdvances.append(advances[i]); >+ } >+ metrics->setAdvances(characterAdvances); >+ > FloatPoint offset = textOffset(fontWidth, direction); > > metrics->setActualBoundingBoxAscent(glyphOverflow.top - offset.y()); >@@ -389,9 +407,12 @@ Ref<TextMetrics> CanvasRenderingContext2D::measureText(const String& text) > metrics->setFontBoundingBoxDescent(fontMetrics.descent() + offset.y()); > metrics->setEmHeightAscent(fontMetrics.ascent() - offset.y()); > metrics->setEmHeightDescent(fontMetrics.descent() + offset.y()); >- metrics->setHangingBaseline(fontMetrics.ascent() - offset.y()); >- metrics->setAlphabeticBaseline(-offset.y()); >- metrics->setIdeographicBaseline(-fontMetrics.descent() - offset.y()); >+ >+ Baselines baselines; >+ baselines.hanging = fontMetrics.ascent() - offset.y(); >+ baselines.alphabetic = -offset.y(); >+ baselines.ideographic = -fontMetrics.descent() - offset.y(); >+ metrics->setBaselines(baselines); > > metrics->setActualBoundingBoxLeft(glyphOverflow.left - offset.x()); > metrics->setActualBoundingBoxRight(fontWidth + glyphOverflow.right + offset.x()); >diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp b/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp >index 6d71cbe287cc993fdad5fd1988fa157c755c7d85..dbd98c757faed312019d40393fa9bd9e0028b117 100644 >--- a/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp >+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.cpp >@@ -343,6 +343,16 @@ inline float CanvasRenderingContext2DBase::FontProxy::width(const TextRun& textR > return m_font.width(textRun, 0, overflow); > } > >+inline Vector<double> CanvasRenderingContext2DBase::FontProxy::getAdvances(const TextRun& run, unsigned from, std::optional<unsigned> to) const >+{ >+ return m_font.getAdvances(run, from, to); >+} >+ >+inline Vector<size_t> CanvasRenderingContext2DBase::FontProxy::getOffsetsInString(const TextRun& run, unsigned from, std::optional<unsigned> to) const >+{ >+ return m_font.getOffsetsInString(run, from, to); >+} >+ > inline void CanvasRenderingContext2DBase::FontProxy::drawBidiText(GraphicsContext& context, const TextRun& run, const FloatPoint& point, FontCascade::CustomFontNotReadyAction action) const > { > context.drawBidiText(m_font, run, point, action); >diff --git a/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h b/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h >index 1ce7cd3dcdfef8d51ea6880ad060bcf3d730e3e8..fda337f37e90cbce747882b60a302c5a4562e3c8 100644 >--- a/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h >+++ b/Source/WebCore/html/canvas/CanvasRenderingContext2DBase.h >@@ -229,6 +229,8 @@ public: > const FontCascadeDescription& fontDescription() const; > float width(const TextRun&, GlyphOverflow* = 0) const; > void drawBidiText(GraphicsContext&, const TextRun&, const FloatPoint&, FontCascade::CustomFontNotReadyAction) const; >+ Vector<double> getAdvances(const TextRun&, unsigned from = 0, std::optional<unsigned> to = std::nullopt) const; >+ Vector<size_t> getOffsetsInString(const TextRun&, unsigned from = 0, std::optional<unsigned> to = std::nullopt) const; > > private: > void update(FontSelector&); >diff --git a/Source/WebCore/platform/graphics/FontCascade.cpp b/Source/WebCore/platform/graphics/FontCascade.cpp >index 08692534a4747c0bc8229d5a4701c40f58060491..c156b2ed81eb04b3b5032d41062c0d7ed4578e2b 100644 >--- a/Source/WebCore/platform/graphics/FontCascade.cpp >+++ b/Source/WebCore/platform/graphics/FontCascade.cpp >@@ -284,6 +284,53 @@ float FontCascade::glyphBufferForTextRun(CodePath codePathToUse, const TextRun& > return getGlyphsAndAdvancesForComplexText(run, from, to, glyphBuffer); > } > >+Vector<double> FontCascade::getAdvances(const TextRun& run, unsigned from, std::optional<unsigned> to) const >+{ >+ unsigned destination = to.value_or(run.length()); >+ GlyphBuffer glyphBuffer; >+ glyphBufferForTextRun(codePath(run, from, to), run, from, destination, glyphBuffer); >+ >+ Vector<double> advances; >+ advances.append(glyphBuffer.initialAdvance().width()); >+ >+ for (size_t i = 0; i < glyphBuffer.advancesCount(); ++i) >+ advances.append(glyphBuffer.advances(i)->width()); >+ >+ return advances; >+} >+ >+Vector<size_t> FontCascade::getOffsetsInString(const TextRun& run, unsigned from, std::optional<unsigned> to) const >+{ >+ unsigned destination = to.value_or(run.length()); >+ GlyphBuffer glyphBuffer; >+ glyphBuffer.saveOffsetsInString(); >+ glyphBufferForTextRun(codePath(run, from, to), run, from, destination, glyphBuffer); >+ >+ Vector<size_t> offsets; >+ if (glyphBuffer.isEmpty()) >+ return offsets; >+ >+ const Font* fontData = glyphBuffer.fontAt(0); >+ size_t currentOffset = 0; >+ size_t nextGlyph = 0; >+ size_t lastOffset = 0; >+ >+ while (nextGlyph < glyphBuffer.size()) { >+ const Font* nextFontData = glyphBuffer.fontAt(nextGlyph); >+ >+ if (nextFontData != fontData) { >+ fontData = nextFontData; >+ currentOffset = lastOffset + 1; >+ } >+ >+ lastOffset = glyphBuffer.offsetInString(nextGlyph) + currentOffset; >+ offsets.append(lastOffset); >+ nextGlyph++; >+ } >+ >+ return offsets; >+} >+ > float FontCascade::drawText(GraphicsContext& context, const TextRun& run, const FloatPoint& point, unsigned from, std::optional<unsigned> to, CustomFontNotReadyAction customFontNotReadyAction) const > { > unsigned destination = to.value_or(run.length()); >diff --git a/Source/WebCore/platform/graphics/FontCascade.h b/Source/WebCore/platform/graphics/FontCascade.h >index eaa08e012fa86e2b34f37aeb62b27260ec37de8c..30b27fcea97eff33dda10aaf7c001224d5a82a20 100644 >--- a/Source/WebCore/platform/graphics/FontCascade.h >+++ b/Source/WebCore/platform/graphics/FontCascade.h >@@ -118,6 +118,8 @@ public: > > WEBCORE_EXPORT void update(RefPtr<FontSelector>&& = nullptr) const; > >+ Vector<double> getAdvances(const TextRun&, unsigned from = 0, std::optional<unsigned> to = std::nullopt) const; >+ Vector<size_t> getOffsetsInString(const TextRun&, unsigned from = 0, std::optional<unsigned> to = std::nullopt) const; > enum CustomFontNotReadyAction { DoNotPaintIfFontNotReady, UseFallbackIfFontNotReady }; > WEBCORE_EXPORT float drawText(GraphicsContext&, const TextRun&, const FloatPoint&, unsigned from = 0, std::optional<unsigned> to = std::nullopt, CustomFontNotReadyAction = DoNotPaintIfFontNotReady) const; > static void drawGlyphs(GraphicsContext&, const Font&, const GlyphBuffer&, unsigned from, unsigned numGlyphs, const FloatPoint&, FontSmoothingMode); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index d2524123aea83d056fec28af8e0caa5938918ca3..0e769c99b8b7486c9fb84b21c2a491dd7dd5ae58 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,15 @@ >+2018-09-13 Justin Michaud <justin_michaud@apple.com> >+ >+ Implement more of the canvas TextMetrics API >+ https://bugs.webkit.org/show_bug.cgi?id=157629 >+ >+ Add tests for advances in the new canvas TextMetrics API >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * fast/canvas/canvas-measureText-2-expected.txt: >+ * fast/canvas/canvas-measureText-2.html: >+ > 2018-09-11 Frederic Wang <fwang@igalia.com> > > Modify more tests to use document.scrollingElement to access viewport scroll properties >diff --git a/LayoutTests/fast/canvas/canvas-measureText-2-expected.txt b/LayoutTests/fast/canvas/canvas-measureText-2-expected.txt >index b19709542c4facd226dcb5583dbefdd835b958c2..58c81331b36aeaa758ad0386f544535e108e18b1 100644 >--- a/LayoutTests/fast/canvas/canvas-measureText-2-expected.txt >+++ b/LayoutTests/fast/canvas/canvas-measureText-2-expected.txt >@@ -7,588 +7,2613 @@ PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=start text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=start text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=start text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=start text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=start text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=end text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=left text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=right text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=center text="Some simple text" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=top align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightAscent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=hanging align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.hangingBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=middle align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=alphabetic align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.alphabeticBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=ideographic align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >-PASS Math.abs(metrics.ideographicBaseline) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=start text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=end text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=left text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=right text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > baseline=bottom align=center text="à½à½à½´à¼à½à½ºà½à¼" > PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 > PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 > PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 > PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 > PASS Math.abs(metrics.emHeightDescent) is 0 >-PASS metrics.emHeightAscent is >= metrics.hangingBaseline >-PASS metrics.hangingBaseline is >= metrics.alphabeticBaseline >-PASS metrics.alphabeticBaseline is >= metrics.ideographicBaseline >-PASS metrics.ideographicBaseline is >= -metrics.emHeightDescent >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=top align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=start text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=end text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=left text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=right text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=center text="" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=hanging align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=middle align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=alphabetic align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=ideographic align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=start text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=end text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=left text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=right text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=bottom align=center text="a" >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+baseline=top align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=top align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=top align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=top align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=top align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightAscent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=hanging align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=hanging align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=hanging align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=hanging align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=hanging align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().hanging) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=middle align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=middle align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=middle align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=middle align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=middle align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=alphabetic align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=alphabetic align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=alphabetic align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=alphabetic align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=alphabetic align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().alphabetic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=ideographic align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=ideographic align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=ideographic align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=ideographic align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=ideographic align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.getBaselines().ideographic) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=bottom align=start text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=bottom align=end text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=bottom align=left text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=bottom align=right text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+baseline=bottom align=center text="Ø§ÙØ³Ùا٠عÙÙÙÙ " >+PASS metrics.actualBoundingBoxLeft + metrics.actualBoundingBoxRight - metrics.width is within 1 of 0 >+PASS metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent is >= 0 >+PASS metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent is >= 0 >+PASS metrics.emHeightAscent + metrics.emHeightDescent is >= 0 >+PASS Math.abs(metrics.emHeightDescent) is 0 >+PASS metrics.emHeightAscent is >= metrics.getBaselines().hanging >+PASS metrics.getBaselines().hanging is >= metrics.getBaselines().alphabetic >+PASS metrics.getBaselines().alphabetic is >= metrics.getBaselines().ideographic >+PASS metrics.getBaselines().ideographic is >= -metrics.emHeightDescent >+PASS metrics.advances.length is Array.from(text).length >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] >+PASS metrics.advances[z] is >= metrics.advances[z-1] > >diff --git a/LayoutTests/fast/canvas/canvas-measureText-2.html b/LayoutTests/fast/canvas/canvas-measureText-2.html >index f1ae6298798d0175b0d3e6cc228026cccf9fbe2f..82e9d6b2b1a72cf7d6f75000b5a3c1e60b3fc3c0 100644 >--- a/LayoutTests/fast/canvas/canvas-measureText-2.html >+++ b/LayoutTests/fast/canvas/canvas-measureText-2.html >@@ -6,9 +6,11 @@ > <script src="../../resources/js-test-pre.js"></script> > > <script> >- var texts = ['Some simple text', 'à½à½à½´à¼à½à½ºà½à¼']; // tibetan script triggers complex path >+ var texts = ['Some simple text', 'à½à½à½´à¼à½à½ºà½à¼', '', 'a', 'Ø§ÙØ³Ùا٠عÙÙÙÙ ']; // tibetan script triggers complex path > var baselines = ['top', 'hanging', 'middle', 'alphabetic', 'ideographic', 'bottom']; > var aligns = ['start', 'end', 'left', 'right', 'center']; >+ var z = 0; // global scope for eval() >+ var text = ''; > > function tests() { > var canvas = document.getElementById("canvas"); >@@ -18,7 +20,7 @@ > for (var i = 0; i < texts.length; i++) { > for (var j = 0; j < baselines.length; j++) { > for (var k = 0; k < aligns.length; k++) { >- var text = texts[i]; >+ text = texts[i]; > var align = aligns[k]; > var baseline = baselines[j]; > debug('baseline=' + baseline + ' align=' + align + ' text="' + text + '"'); >@@ -37,20 +39,24 @@ > if (baseline === 'bottom') > shouldBeZero("Math.abs(metrics.emHeightDescent)"); > if (baseline === 'hanging') >- shouldBeZero("Math.abs(metrics.hangingBaseline)"); >+ shouldBeZero("Math.abs(metrics.getBaselines().hanging)"); > if (baseline === 'alphabetic') >- shouldBeZero("Math.abs(metrics.alphabeticBaseline)"); >+ shouldBeZero("Math.abs(metrics.getBaselines().alphabetic)"); > if (baseline === 'ideographic') >- shouldBeZero("Math.abs(metrics.ideographicBaseline)"); >+ shouldBeZero("Math.abs(metrics.getBaselines().ideographic)"); > >- shouldBeGreaterThanOrEqual("metrics.emHeightAscent", "metrics.hangingBaseline"); >- shouldBeGreaterThanOrEqual("metrics.hangingBaseline", "metrics.alphabeticBaseline"); >- shouldBeGreaterThanOrEqual("metrics.alphabeticBaseline", "metrics.ideographicBaseline"); >- shouldBeGreaterThanOrEqual("metrics.ideographicBaseline", "-metrics.emHeightDescent"); >+ shouldBeGreaterThanOrEqual("metrics.emHeightAscent", "metrics.getBaselines().hanging"); >+ shouldBeGreaterThanOrEqual("metrics.getBaselines().hanging", "metrics.getBaselines().alphabetic"); >+ shouldBeGreaterThanOrEqual("metrics.getBaselines().alphabetic", "metrics.getBaselines().ideographic"); >+ shouldBeGreaterThanOrEqual("metrics.getBaselines().ideographic", "-metrics.emHeightDescent"); >+ >+ shouldBe("metrics.advances.length", "Array.from(text).length"); >+ for (z = 1; z < metrics.advances.length; ++z) { >+ shouldBeGreaterThanOrEqual("metrics.advances[z]", "metrics.advances[z-1]"); >+ } > } > } > } >- > } > > window.addEventListener('load', tests, true);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
mmaxfield
:
review-
ews-watchlist
:
commit-queue-
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 157629
:
349683
| 349684 |
349685
|
349699
|
349702