Changeset 267073 in webkit
- Timestamp:
- Sep 14, 2020 9:19:22 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r267072 r267073 1 2020-09-14 Myles C. Maxfield <mmaxfield@apple.com> 2 3 [Apple Win] Migrate from FontPlatformDataWin.cpp to FontPlatformDataCoreText.cpp 4 https://bugs.webkit.org/show_bug.cgi?id=216448 5 6 Reviewed by Darin Adler. 7 8 These two tests are progressions. 9 10 * platform/win/mathml/opentype/opentype-stretchy-expected.txt: 11 * platform/win/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.txt: 12 1 13 2020-09-14 Hector Lopez <hector_i_lopez@apple.com> 2 14 -
trunk/LayoutTests/platform/win/mathml/opentype/opentype-stretchy-expected.txt
r203339 r267073 1 layer at (0,0) size 785x335544312 RenderView at (0,0) size 785x6003 layer at (0,0) size 785x335544314 RenderBlock {HTML} at (0,0) size 785x335544315 RenderBody {BODY} at (8,16) size 7 69x335544156 RenderBlock {P} at (0,0) size 7 69x347 RenderMathMLMath {math} at (0,20) size 8x108 RenderMathMLRow {mrow} at (0,0) size 8x109 RenderMathMLOperator {mo} at (0,0) size 8x1010 RenderBlock (anonymous) at (0,0) size 2x 1011 RenderText {#text} at (0, 0) size 2x012 text run at (0, 0) width 2: "\x{219F}"13 RenderText {#text} at ( 7,16) size 5x1814 text run at ( 7,16) width 5: " "15 RenderMathMLMath {math} at ( 11,15) size 27x1516 RenderMathMLRow {mrow} at (0,0) size 26x 1517 RenderMathMLOperator {mo} at (0,0) size 26x 1018 RenderBlock (anonymous) at (0,0) size 2x 1019 RenderText {#text} at (0, 0) size 2x020 text run at (0, 0) width 2: "\x{219F}"21 RenderText {#text} at ( 37,16) size 5x1822 text run at ( 37,16) width 5: " "23 RenderMathMLMath {math} at ( 41,0) size 47x3024 RenderMathMLRow {mrow} at (0,0) size 47x3025 RenderMathMLOperator {mo} at (0,0) size 47x3026 RenderBlock (anonymous) at (0,0) size 2x 1027 RenderText {#text} at (0, 0) size 2x028 text run at (0, 0) width 2: "\x{219F}"1 layer at (0,0) size 800x600 2 RenderView at (0,0) size 800x600 3 layer at (0,0) size 800x338 4 RenderBlock {HTML} at (0,0) size 800x338 5 RenderBody {BODY} at (8,16) size 784x306 6 RenderBlock {P} at (0,0) size 784x34 7 RenderMathMLMath {math} at (0,20) size 26x11 8 RenderMathMLRow {mrow} at (0,0) size 26x11 9 RenderMathMLOperator {mo} at (0,0) size 26x11 10 RenderBlock (anonymous) at (0,0) size 2x3 11 RenderText {#text} at (0,-3) size 2x0 12 text run at (0,-3) width 2: "\x{219F}" 13 RenderText {#text} at (25,16) size 5x18 14 text run at (25,16) width 5: " " 15 RenderMathMLMath {math} at (29,10) size 27x21 16 RenderMathMLRow {mrow} at (0,0) size 26x21 17 RenderMathMLOperator {mo} at (0,0) size 26x21 18 RenderBlock (anonymous) at (0,0) size 2x3 19 RenderText {#text} at (0,-3) size 2x0 20 text run at (0,-3) width 2: "\x{219F}" 21 RenderText {#text} at (55,16) size 5x18 22 text run at (55,16) width 5: " " 23 RenderMathMLMath {math} at (59,0) size 26x31 24 RenderMathMLRow {mrow} at (0,0) size 26x31 25 RenderMathMLOperator {mo} at (0,0) size 26x31 26 RenderBlock (anonymous) at (0,0) size 2x3 27 RenderText {#text} at (0,-3) size 2x0 28 text run at (0,-3) width 2: "\x{219F}" 29 29 RenderText {#text} at (0,0) size 0x0 30 RenderBlock {P} at (0,50) size 7 69x15430 RenderBlock {P} at (0,50) size 784x154 31 31 RenderMathMLMath {math} at (0,0) size 47x150 32 32 RenderMathMLRow {mrow} at (0,0) size 47x150 33 33 RenderMathMLOperator {mo} at (0,0) size 47x150 34 RenderBlock (anonymous) at (0,0) size 2x 1035 RenderText {#text} at (0, 0) size 2x036 text run at (0, 0) width 2: "\x{219F}"34 RenderBlock (anonymous) at (0,0) size 2x3 35 RenderText {#text} at (0,-3) size 2x0 36 text run at (0,-3) width 2: "\x{219F}" 37 37 RenderText {#text} at (0,0) size 0x0 38 RenderBlock {P} at (0,220) size 7 69x3355421139 RenderMathMLMath {math} at (0, 14) size 94x3355441740 RenderMathMLRow {mrow} at (0,0) size 94x3355443141 RenderMathMLOperator {mo} at (0, 33554431) size 94x042 RenderBlock (anonymous) at (0,0) size 10x1 043 RenderText {#text} at (0, 0) size 10x044 text run at (0, 0) width 10: "\x{2A1B}"38 RenderBlock {P} at (0,220) size 784x86 39 RenderMathMLMath {math} at (0,0) size 84x82 40 RenderMathMLRow {mrow} at (0,0) size 84x82 41 RenderMathMLOperator {mo} at (0,0) size 84x82 42 RenderBlock (anonymous) at (0,0) size 10x12 43 RenderText {#text} at (0,6) size 10x0 44 text run at (0,6) width 10: "\x{2A1B}" 45 45 RenderText {#text} at (0,0) size 0x0 -
trunk/LayoutTests/platform/win/svg/W3C-SVG-1.1-SE/coords-units-03-b-expected.txt
r197145 r267073 40 40 RenderSVGInlineText {#text} at (0,0) size 164x14 41 41 chunk 1 text run 1 at (230.00,80.00) startOffset 0 endOffset 30 width 164.00: "Relative to font x-height (ex)" 42 RenderSVGContainer {g} at (20,140) size 320x143 RenderSVGRect {rect} at (20,140) size 320x1 [fill={[type=SOLID] [color=#000000]}] [x=20.00] [y=80.00] [width=320.00] [height=1.00]42 RenderSVGContainer {g} at (20,140) size 210x1 43 RenderSVGRect {rect} at (20,140) size 210x1 [fill={[type=SOLID] [color=#000000]}] [x=20.00] [y=80.00] [width=240.00] [height=1.00] 44 44 RenderSVGText {text} at (20,87) size 99x14 contains 1 chunk(s) 45 45 RenderSVGInlineText {#text} at (0,0) size 99x14 -
trunk/Source/WebCore/ChangeLog
r267071 r267073 1 2020-09-14 Myles C. Maxfield <mmaxfield@apple.com> 2 3 [Apple Win] Migrate from FontPlatformDataWin.cpp to FontPlatformDataCoreText.cpp 4 https://bugs.webkit.org/show_bug.cgi?id=216448 5 6 Reviewed by Darin Adler. 7 8 This is one of the steps toward migrating the Apple Win port off of CGFont and on to 9 CTFont. This patch removes the #if !PLATFORM(WIN) guard in FontPlatformDataCoreText.cpp 10 and deletes the old functions it used to be using. It fixes up the Core Text functions to 11 use ctFont() instead of font(), because font() returns the HFONT on Windows. 12 13 It also adds a new helper, platformOpenTypeTable(), because it looks like 14 CTFontCopyTable() sometimes fails, so we can use this function to fall back to using the 15 HFONT and the win32 API instead. 16 17 Covered by existing tests. 18 19 * platform/graphics/FontPlatformData.cpp: 20 * platform/graphics/FontPlatformData.h: 21 (WebCore::FontPlatformData::ctFont const): 22 (WebCore::FontPlatformData::font const): 23 * platform/graphics/cocoa/FontPlatformDataCocoa.mm: 24 (WebCore::FontPlatformData::platformOpenTypeTable const): 25 * platform/graphics/coretext/FontPlatformDataCoreText.cpp: 26 (WebCore::FontPlatformData::FontPlatformData): 27 (WebCore::FontPlatformData::registeredFont const): 28 (WebCore::FontPlatformData::ctFont const): 29 (WebCore::FontPlatformData::openTypeTable const): 30 (WebCore::FontPlatformData::description const): 31 (WebCore::FontPlatformData::familyName const): 32 * platform/graphics/win/FontCustomPlatformData.cpp: 33 (WebCore::FontCustomPlatformData::~FontCustomPlatformData): 34 (WebCore::FontCustomPlatformData::fontPlatformData): 35 (WebCore::createFontCustomPlatformData): 36 * platform/graphics/win/FontCustomPlatformData.h: 37 (WebCore::FontCustomPlatformData::FontCustomPlatformData): 38 * platform/graphics/win/FontCustomPlatformDataCairo.cpp: 39 (WebCore::FontCustomPlatformData::~FontCustomPlatformData): 40 (WebCore::FontCustomPlatformData::fontPlatformData): 41 * platform/graphics/win/FontPlatformDataCGWin.cpp: 42 (WebCore::FontPlatformData::FontPlatformData): 43 * platform/graphics/win/FontPlatformDataCairoWin.cpp: 44 (WebCore::FontPlatformData::openTypeTable const): 45 * platform/graphics/win/FontPlatformDataWin.cpp: 46 (WebCore::FontPlatformData::platformOpenTypeTable const): 47 (WebCore::FontPlatformData::openTypeTable const): Deleted. 48 (WebCore::FontPlatformData::description const): Deleted. 49 1 50 2020-09-14 Chris Dumez <cdumez@apple.com> 2 51 -
trunk/Source/WebCore/PAL/ChangeLog
r267063 r267073 1 2020-09-14 Myles C. Maxfield <mmaxfield@apple.com> 2 3 [Apple Win] Migrate from FontPlatformDataWin.cpp to FontPlatformDataCoreText.cpp 4 https://bugs.webkit.org/show_bug.cgi?id=216448 5 6 Reviewed by Darin Adler. 7 8 * pal/spi/win/CoreTextSPIWin.h: 9 1 10 2020-09-14 Peng Liu <peng.liu6@apple.com> 2 11 -
trunk/Source/WebCore/PAL/pal/spi/win/CoreTextSPIWin.h
r266936 r267073 130 130 CTFontSymbolicTraits CTFontGetSymbolicTraits(CTFontRef); 131 131 CFCharacterSetRef CTFontCopyCharacterSet(CTFontRef); 132 CGFontRef CTFontCopyGraphicsFont(CTFontRef, CTFontDescriptorRef* attributes); 132 133 CFStringRef CTFontCopyFamilyName(CTFontRef); 133 134 CFStringRef CTFontCopyFullName(CTFontRef); … … 155 156 bool CTFontGetVerticalGlyphsForCharacters(CTFontRef, const UniChar[], CGGlyph[], CFIndex count); 156 157 158 CTFontDescriptorRef CTFontManagerCreateFontDescriptorFromData(CFDataRef); 159 157 160 CTFontDescriptorRef CTFontDescriptorCreateWithAttributes(CFDictionaryRef); 158 161 bool CTFontDescriptorIsSystemUIFont(CTFontDescriptorRef); -
trunk/Source/WebCore/platform/graphics/FontPlatformData.cpp
r266982 r267073 80 80 #endif 81 81 82 #if !USE(CORE_TEXT) || PLATFORM(WIN)82 #if !USE(CORE_TEXT) 83 83 84 84 String FontPlatformData::familyName() const -
trunk/Source/WebCore/platform/graphics/FontPlatformData.h
r266982 r267073 89 89 #if PLATFORM(WIN) 90 90 FontPlatformData(GDIObject<HFONT>, float size, bool syntheticBold, bool syntheticOblique, bool useGDI); 91 #if USE(CG) 92 FontPlatformData(GDIObject<HFONT>, CGFontRef, float size, bool syntheticBold, bool syntheticOblique, bool useGDI); 93 FontPlatformData(CGFontRef, float size, bool syntheticBold, bool syntheticOblique, FontOrientation, FontWidthVariant, TextRenderingMode); 91 #if USE(CORE_TEXT) 92 FontPlatformData(GDIObject<HFONT>, CTFontRef, CGFontRef, float size, bool syntheticBold, bool syntheticOblique, bool useGDI); 94 93 #endif 95 94 #if USE(DIRECT2D) … … 115 114 CGFontRef cgFont() const { return m_cgFont.get(); } 116 115 #endif 117 #if USE(CORE_TEXT) 118 CTFontRef ctFont() const { return m_ctFont.get(); } 119 #endif 120 #elif USE(CORE_TEXT) 121 CTFontRef font() const { return m_font.get(); } 116 #endif 117 118 #if USE(CORE_TEXT) 122 119 WEBCORE_EXPORT CTFontRef registeredFont() const; // Returns nullptr iff the font is not registered, such as web fonts (otherwise returns font()). 123 124 CTFontRef ctFont() const;125 120 static RetainPtr<CFTypeRef> objectForEqualityCheck(CTFontRef); 126 121 RetainPtr<CFTypeRef> objectForEqualityCheck() const; 127 128 122 bool hasCustomTracking() const { return isSystemFont(); } 123 124 #if PLATFORM(WIN) 125 CTFontRef ctFont() const { return m_ctFont.get(); } 126 #else 127 CTFontRef font() const { return m_font.get(); } 128 CTFontRef ctFont() const; 129 #endif 129 130 #endif 130 131 … … 195 196 196 197 RefPtr<SharedBuffer> openTypeTable(uint32_t table) const; 198 RefPtr<SharedBuffer> platformOpenTypeTable(uint32_t table) const; 197 199 198 200 String description() const; … … 215 217 #if PLATFORM(WIN) 216 218 RefPtr<SharedGDIObject<HFONT>> m_font; // FIXME: Delete this in favor of m_ctFont or m_dwFont or m_scaledFont. 217 #if USE(C G)219 #if USE(CORE_TEXT) 218 220 RetainPtr<CGFontRef> m_cgFont; // FIXME: Delete this in favor of m_ctFont. 219 #endif220 #if USE(CORE_TEXT)221 221 RetainPtr<CTFontRef> m_ctFont; 222 222 #endif -
trunk/Source/WebCore/platform/graphics/cocoa/FontPlatformDataCocoa.mm
r266936 r267073 57 57 } 58 58 59 RefPtr<SharedBuffer> FontPlatformData::platformOpenTypeTable(uint32_t) const 60 { 61 return nullptr; 62 } 63 59 64 } // namespace WebCore -
trunk/Source/WebCore/platform/graphics/coretext/FontPlatformDataCoreText.cpp
r266982 r267073 36 36 namespace WebCore { 37 37 38 #if !PLATFORM(WIN)39 40 38 FontPlatformData::FontPlatformData(CTFontRef font, float size, bool syntheticBold, bool syntheticOblique, FontOrientation orientation, FontWidthVariant widthVariant, TextRenderingMode textRenderingMode) 41 39 : FontPlatformData(size, syntheticBold, syntheticOblique, orientation, widthVariant, textRenderingMode) 42 40 { 43 41 ASSERT_ARG(font, font); 42 #if PLATFORM(WIN) 43 m_ctFont = font; 44 #else 44 45 m_font = font; 46 #endif 45 47 m_isColorBitmapFont = CTFontGetSymbolicTraits(font) & kCTFontColorGlyphsTrait; 46 m_isSystemFont = WebCore::isSystemFont( m_font.get());48 m_isSystemFont = WebCore::isSystemFont(font); 47 49 auto variations = adoptCF(static_cast<CFDictionaryRef>(CTFontCopyAttribute(font, kCTFontVariationAttribute))); 48 50 m_hasVariations = variations && CFDictionaryGetCount(variations.get()); … … 64 66 CTFontRef FontPlatformData::registeredFont() const 65 67 { 66 CTFontRef platformFont = font();68 CTFontRef platformFont = ctFont(); 67 69 ASSERT(platformFont); 68 70 if (platformFont && adoptCF(CTFontCopyAttribute(platformFont, kCTFontURLAttribute))) … … 133 135 return m_ctFont.get(); 134 136 } 135 #else136 CTFontRef FontPlatformData::ctFont() const137 {138 return font();139 }140 137 #endif 141 138 … … 157 154 RefPtr<SharedBuffer> FontPlatformData::openTypeTable(uint32_t table) const 158 155 { 159 if (RetainPtr<CFDataRef> data = adoptCF(CTFontCopyTable( font(), table, kCTFontTableOptionNoOptions)))156 if (RetainPtr<CFDataRef> data = adoptCF(CTFontCopyTable(ctFont(), table, kCTFontTableOptionNoOptions))) 160 157 return SharedBuffer::create(data.get()); 161 158 162 return nullptr;159 return platformOpenTypeTable(table); 163 160 } 164 161 … … 167 164 String FontPlatformData::description() const 168 165 { 169 String fontDescription { adoptCF(CFCopyDescription( font())).get() };166 String fontDescription { adoptCF(CFCopyDescription(ctFont())).get() }; 170 167 return makeString(fontDescription, ' ', m_size, 171 168 (m_syntheticBold ? " synthetic bold" : ""), … … 178 175 String FontPlatformData::familyName() const 179 176 { 180 if (auto platformFont = font())177 if (auto platformFont = ctFont()) 181 178 return adoptCF(CTFontCopyFamilyName(platformFont)).get(); 182 179 return { }; 183 180 } 184 181 185 #endif186 187 182 } // namespace WebCore -
trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformData.cpp
r252760 r267073 43 43 FontCustomPlatformData::~FontCustomPlatformData() 44 44 { 45 if ( m_fontReference)46 RemoveFontMemResourceEx( m_fontReference);45 if (fontReference) 46 RemoveFontMemResourceEx(fontReference); 47 47 } 48 48 … … 52 52 FontRenderingMode renderingMode = fontDescription.renderingMode(); 53 53 54 ASSERT( m_fontReference);54 ASSERT(fontReference); 55 55 56 auto faceName = m_name.charactersWithNullTermination();56 auto faceName = name.charactersWithNullTermination(); 57 57 if (faceName.size() > LF_FACESIZE) { 58 58 faceName.resize(LF_FACESIZE); … … 61 61 62 62 LOGFONT logFont { }; 63 memcpy(logFont.lfFaceName, faceName.data(), sizeof(logFont.lfFaceName[0]) * std::min<size_t>(static_cast<size_t>(LF_FACESIZE), 1 + m_name.length()));63 memcpy(logFont.lfFaceName, faceName.data(), sizeof(logFont.lfFaceName[0]) * std::min<size_t>(static_cast<size_t>(LF_FACESIZE), 1 + name.length())); 64 64 65 65 logFont.lfHeight = -size; … … 83 83 84 84 auto hfont = adoptGDIObject(::CreateFontIndirect(&logFont)); 85 #if USE(CG) 86 RetainPtr<CGFontRef> cgFont = adoptCF(CGFontCreateWithPlatformFont(&logFont)); 87 return FontPlatformData(WTFMove(hfont), cgFont.get(), size, bold, italic, renderingMode == FontRenderingMode::Alternate); 85 #if USE(CORE_TEXT) 86 auto ctFont = adoptCF(CTFontCreateWithFontDescriptor(fontDescriptor.get(), size, nullptr)); 87 auto cgFont = adoptCF(CTFontCopyGraphicsFont(ctFont.get(), nullptr)); 88 return FontPlatformData(WTFMove(hfont), ctFont.get(), cgFont.get(), size, bold, italic, renderingMode == FontRenderingMode::Alternate); 88 89 #else 89 90 auto font = DirectWrite::createWithPlatformFont(logFont); … … 111 112 if (!fontReference) 112 113 return nullptr; 113 return makeUnique<FontCustomPlatformData>(fontReference, fontName); 114 auto result = makeUnique<FontCustomPlatformData>(fontReference, fontName); 115 #if USE(CORE_TEXT) 116 result->fontDescriptor = adoptCF(CTFontManagerCreateFontDescriptorFromData(buffer.createCFData().get())); 117 #endif 118 return result; 114 119 } 115 120 -
trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformData.h
r252760 r267073 28 28 #include <wtf/text/WTFString.h> 29 29 30 #if USE(CORE_TEXT) 31 #include <pal/spi/win/CoreTextSPIWin.h> 32 #endif 33 30 34 typedef struct CGFont* CGFontRef; 31 35 … … 46 50 public: 47 51 FontCustomPlatformData(HANDLE fontReference, const String& name) 48 : m_fontReference(fontReference)49 , m_name(name)52 : fontReference(fontReference) 53 , name(name) 50 54 { 51 55 } … … 57 61 static bool supportsFormat(const String&); 58 62 59 HANDLE m_fontReference; 60 String m_name; 63 HANDLE fontReference; 64 String name; 65 #if USE(CORE_TEXT) 66 RetainPtr<CTFontDescriptorRef> fontDescriptor; 67 #endif 61 68 }; 62 69 -
trunk/Source/WebCore/platform/graphics/win/FontCustomPlatformDataCairo.cpp
r264236 r267073 35 35 FontCustomPlatformData::~FontCustomPlatformData() 36 36 { 37 if ( m_fontReference)38 RemoveFontMemResourceEx( m_fontReference);37 if (fontReference) 38 RemoveFontMemResourceEx(fontReference); 39 39 } 40 40 … … 46 46 LOGFONT logFont; 47 47 memset(&logFont, 0, sizeof(LOGFONT)); 48 wcsncpy(logFont.lfFaceName, m_name.wideCharacters().data(), LF_FACESIZE - 1);48 wcsncpy(logFont.lfFaceName, name.wideCharacters().data(), LF_FACESIZE - 1); 49 49 50 50 logFont.lfHeight = -size; -
trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCGWin.cpp
r266982 r267073 121 121 } 122 122 123 FontPlatformData::FontPlatformData(GDIObject<HFONT> hfont, C GFontRef font, float size, bool bold, bool oblique, bool useGDI)123 FontPlatformData::FontPlatformData(GDIObject<HFONT> hfont, CTFontRef ctFont, CGFontRef cgFont, float size, bool bold, bool oblique, bool useGDI) 124 124 : m_syntheticBold(bold) 125 125 , m_syntheticOblique(oblique) 126 126 , m_size(size) 127 127 , m_font(SharedGDIObject<HFONT>::create(WTFMove(hfont))) 128 , m_cgFont( font)129 , m_ctFont( adoptCF(CTFontCreateWithGraphicsFont(m_cgFont.get(), size, nullptr, nullptr)))128 , m_cgFont(cgFont) 129 , m_ctFont(ctFont) 130 130 , m_useGDI(useGDI) 131 131 { 132 }133 134 FontPlatformData::FontPlatformData(CGFontRef cgFont, float size, bool syntheticBold, bool syntheticOblique, FontOrientation orientation, FontWidthVariant widthVariant, TextRenderingMode textRenderingMode)135 : FontPlatformData(size, syntheticBold, syntheticOblique, orientation, widthVariant, textRenderingMode)136 {137 m_cgFont = cgFont;138 ASSERT(m_cgFont);139 m_ctFont = adoptCF(CTFontCreateWithGraphicsFont(m_cgFont.get(), size, nullptr, nullptr));140 132 } 141 133 -
trunk/Source/WebCore/platform/graphics/win/FontPlatformDataCairoWin.cpp
r239549 r267073 27 27 #include "FontPlatformData.h" 28 28 29 #include "SharedBuffer.h" 29 30 #include <wtf/HashMap.h> 30 31 #include <wtf/RetainPtr.h> … … 34 35 35 36 #include <cairo-win32.h> 36 37 37 38 38 namespace WebCore { … … 97 97 } 98 98 99 RefPtr<SharedBuffer> FontPlatformData::openTypeTable(uint32_t table) const 100 { 101 return platformOpenTypeTable(table); 99 102 } 103 104 } -
trunk/Source/WebCore/platform/graphics/win/FontPlatformDataWin.cpp
r248748 r267073 61 61 } 62 62 63 RefPtr<SharedBuffer> FontPlatformData:: openTypeTable(uint32_t table) const63 RefPtr<SharedBuffer> FontPlatformData::platformOpenTypeTable(uint32_t table) const 64 64 { 65 65 HWndDC hdc(0); … … 79 79 } 80 80 81 #if !LOG_DISABLED82 String FontPlatformData::description() const83 {84 return String();85 81 } 86 #endif87 88 }
Note: See TracChangeset
for help on using the changeset viewer.