| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. | 2 * Copyright (c) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 | 32 |
| 33 #if !OS(WIN) && !OS(ANDROID) |
| 34 #include "SkFontConfigInterface.h" |
| 35 #endif |
| 33 #include "SkFontMgr.h" | 36 #include "SkFontMgr.h" |
| 37 #include "SkStream.h" |
| 34 #include "SkTypeface.h" | 38 #include "SkTypeface.h" |
| 35 #include "platform/NotImplemented.h" | 39 #include "platform/NotImplemented.h" |
| 36 #include "platform/fonts/AlternateFontFamily.h" | 40 #include "platform/fonts/AlternateFontFamily.h" |
| 37 #include "platform/fonts/FontCache.h" | 41 #include "platform/fonts/FontCache.h" |
| 38 #include "platform/fonts/FontDescription.h" | 42 #include "platform/fonts/FontDescription.h" |
| 43 #include "platform/fonts/FontFaceCreationParams.h" |
| 39 #include "platform/fonts/SimpleFontData.h" | 44 #include "platform/fonts/SimpleFontData.h" |
| 40 #include "wtf/Assertions.h" | 45 #include "wtf/Assertions.h" |
| 41 #include "wtf/text/AtomicString.h" | 46 #include "wtf/text/AtomicString.h" |
| 42 #include "wtf/text/CString.h" | 47 #include "wtf/text/CString.h" |
| 43 #include <unicode/locid.h> | 48 #include <unicode/locid.h> |
| 44 | 49 |
| 50 #if !OS(WIN) && !OS(ANDROID) |
| 51 static SkStream* streamForFontconfigInterfaceId(int fontconfigInterfaceId) |
| 52 { |
| 53 SkAutoTUnref<SkFontConfigInterface> fci(SkFontConfigInterface::RefGlobal()); |
| 54 SkFontConfigInterface::FontIdentity fontIdentity; |
| 55 fontIdentity.fID = fontconfigInterfaceId; |
| 56 return fci->openStream(fontIdentity); |
| 57 } |
| 58 #endif |
| 59 |
| 45 namespace WebCore { | 60 namespace WebCore { |
| 46 | 61 |
| 47 void FontCache::platformInit() | 62 void FontCache::platformInit() |
| 48 { | 63 { |
| 49 } | 64 } |
| 50 | 65 |
| 51 #if !OS(WIN) && !OS(ANDROID) | 66 #if !OS(WIN) && !OS(ANDROID) |
| 52 PassRefPtr<SimpleFontData> FontCache::fallbackFontForCharacter(const FontDescrip
tion& fontDescription, UChar32 c, const SimpleFontData*) | 67 PassRefPtr<SimpleFontData> FontCache::fallbackFontForCharacter(const FontDescrip
tion& fontDescription, UChar32 c, const SimpleFontData*) |
| 53 { | 68 { |
| 54 icu::Locale locale = icu::Locale::getDefault(); | 69 icu::Locale locale = icu::Locale::getDefault(); |
| 55 FontCache::PlatformFallbackFont fallbackFont; | 70 FontCache::PlatformFallbackFont fallbackFont; |
| 56 FontCache::getFontForCharacter(c, locale.getLanguage(), &fallbackFont); | 71 FontCache::getFontForCharacter(c, locale.getLanguage(), &fallbackFont); |
| 57 if (fallbackFont.name.isEmpty()) | 72 if (fallbackFont.name.isEmpty()) |
| 58 return nullptr; | 73 return nullptr; |
| 59 | 74 |
| 60 AtomicString atomicFamily(fallbackFont.name); | 75 FontFaceCreationParams creationParams; |
| 76 creationParams = FontFaceCreationParams(fallbackFont.fontconfigInterfaceId,
fallbackFont.ttcIndex); |
| 77 |
| 61 // Changes weight and/or italic of given FontDescription depends on | 78 // Changes weight and/or italic of given FontDescription depends on |
| 62 // the result of fontconfig so that keeping the correct font mapping | 79 // the result of fontconfig so that keeping the correct font mapping |
| 63 // of the given character. See http://crbug.com/32109 for details. | 80 // of the given character. See http://crbug.com/32109 for details. |
| 64 bool shouldSetSyntheticBold = false; | 81 bool shouldSetSyntheticBold = false; |
| 65 bool shouldSetSyntheticItalic = false; | 82 bool shouldSetSyntheticItalic = false; |
| 66 FontDescription description(fontDescription); | 83 FontDescription description(fontDescription); |
| 67 if (fallbackFont.isBold && description.weight() < FontWeightBold) | 84 if (fallbackFont.isBold && description.weight() < FontWeightBold) |
| 68 description.setWeight(FontWeightBold); | 85 description.setWeight(FontWeightBold); |
| 69 if (!fallbackFont.isBold && description.weight() >= FontWeightBold) { | 86 if (!fallbackFont.isBold && description.weight() >= FontWeightBold) { |
| 70 shouldSetSyntheticBold = true; | 87 shouldSetSyntheticBold = true; |
| 71 description.setWeight(FontWeightNormal); | 88 description.setWeight(FontWeightNormal); |
| 72 } | 89 } |
| 73 if (fallbackFont.isItalic && description.style() == FontStyleNormal) | 90 if (fallbackFont.isItalic && description.style() == FontStyleNormal) |
| 74 description.setStyle(FontStyleItalic); | 91 description.setStyle(FontStyleItalic); |
| 75 if (!fallbackFont.isItalic && description.style() == FontStyleItalic) { | 92 if (!fallbackFont.isItalic && description.style() == FontStyleItalic) { |
| 76 shouldSetSyntheticItalic = true; | 93 shouldSetSyntheticItalic = true; |
| 77 description.setStyle(FontStyleNormal); | 94 description.setStyle(FontStyleNormal); |
| 78 } | 95 } |
| 79 | 96 |
| 80 FontPlatformData* substitutePlatformData = getFontPlatformData(description,
atomicFamily); | 97 FontPlatformData* substitutePlatformData = getFontPlatformData(description,
creationParams); |
| 81 if (!substitutePlatformData) | 98 if (!substitutePlatformData) |
| 82 return nullptr; | 99 return nullptr; |
| 83 FontPlatformData platformData = FontPlatformData(*substitutePlatformData); | 100 FontPlatformData platformData = FontPlatformData(*substitutePlatformData); |
| 84 platformData.setSyntheticBold(shouldSetSyntheticBold); | 101 platformData.setSyntheticBold(shouldSetSyntheticBold); |
| 85 platformData.setSyntheticItalic(shouldSetSyntheticItalic); | 102 platformData.setSyntheticItalic(shouldSetSyntheticItalic); |
| 86 return fontDataFromFontPlatformData(&platformData, DoNotRetain); | 103 return fontDataFromFontPlatformData(&platformData, DoNotRetain); |
| 87 } | 104 } |
| 88 | 105 |
| 89 #endif // !OS(WIN) && !OS(ANDROID) | 106 #endif // !OS(WIN) && !OS(ANDROID) |
| 90 | 107 |
| 91 PassRefPtr<SimpleFontData> FontCache::getLastResortFallbackFont(const FontDescri
ption& description, ShouldRetain shouldRetain) | 108 PassRefPtr<SimpleFontData> FontCache::getLastResortFallbackFont(const FontDescri
ption& description, ShouldRetain shouldRetain) |
| 92 { | 109 { |
| 93 const AtomicString fallbackFontFamily = getFallbackFontFamily(description); | 110 const FontFaceCreationParams fallbackCreationParams(getFallbackFontFamily(de
scription)); |
| 94 const FontPlatformData* fontPlatformData = getFontPlatformData(description,
fallbackFontFamily); | 111 const FontPlatformData* fontPlatformData = getFontPlatformData(description,
fallbackCreationParams); |
| 95 | 112 |
| 96 // We should at least have Sans or Arial which is the last resort fallback o
f SkFontHost ports. | 113 // We should at least have Sans or Arial which is the last resort fallback o
f SkFontHost ports. |
| 97 if (!fontPlatformData) { | 114 if (!fontPlatformData) { |
| 98 DEFINE_STATIC_LOCAL(const AtomicString, sansStr, ("Sans", AtomicString::
ConstructFromLiteral)); | 115 DEFINE_STATIC_LOCAL(const FontFaceCreationParams, sansCreationParams, (A
tomicString("Sans", AtomicString::ConstructFromLiteral))); |
| 99 fontPlatformData = getFontPlatformData(description, sansStr); | 116 fontPlatformData = getFontPlatformData(description, sansCreationParams); |
| 100 } | 117 } |
| 101 if (!fontPlatformData) { | 118 if (!fontPlatformData) { |
| 102 DEFINE_STATIC_LOCAL(const AtomicString, arialStr, ("Arial", AtomicString
::ConstructFromLiteral)); | 119 DEFINE_STATIC_LOCAL(const FontFaceCreationParams, arialCreationParams, (
AtomicString("Arial", AtomicString::ConstructFromLiteral))); |
| 103 fontPlatformData = getFontPlatformData(description, arialStr); | 120 fontPlatformData = getFontPlatformData(description, arialCreationParams)
; |
| 104 } | 121 } |
| 105 | 122 |
| 106 // TODO(scottmg|eae): Trying to identify crashes in http://crbug.com/383542 | 123 // TODO(scottmg|eae): Trying to identify crashes in http://crbug.com/383542 |
| 107 if (!fontPlatformData) | 124 if (!fontPlatformData) |
| 108 CRASH(); | 125 CRASH(); |
| 109 return fontDataFromFontPlatformData(fontPlatformData, shouldRetain); | 126 return fontDataFromFontPlatformData(fontPlatformData, shouldRetain); |
| 110 } | 127 } |
| 111 | 128 |
| 112 PassRefPtr<SkTypeface> FontCache::createTypeface(const FontDescription& fontDesc
ription, const AtomicString& family, CString& name) | 129 PassRefPtr<SkTypeface> FontCache::createTypeface(const FontDescription& fontDesc
ription, const FontFaceCreationParams& creationParams, CString& name) |
| 113 { | 130 { |
| 131 #if !OS(WIN) && !OS(ANDROID) |
| 132 if (creationParams.creationType() == CreateFontByFciIdAndTtcIndex) { |
| 133 // TODO(dro): crbug.com/381620 Use creationParams.ttcIndex() after |
| 134 // https://code.google.com/p/skia/issues/detail?id=1186 gets fixed. |
| 135 SkTypeface* typeface = SkTypeface::CreateFromStream(streamForFontconfigI
nterfaceId(creationParams.fontconfigInterfaceId())); |
| 136 return adoptRef(typeface); |
| 137 } |
| 138 #endif |
| 139 |
| 140 AtomicString family = creationParams.family(); |
| 114 // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the
name into | 141 // If we're creating a fallback font (e.g. "-webkit-monospace"), convert the
name into |
| 115 // the fallback name (like "monospace") that fontconfig understands. | 142 // the fallback name (like "monospace") that fontconfig understands. |
| 116 if (!family.length() || family.startsWith("-webkit-")) { | 143 if (!family.length() || family.startsWith("-webkit-")) { |
| 117 name = getFallbackFontFamily(fontDescription).string().utf8(); | 144 name = getFallbackFontFamily(fontDescription).string().utf8(); |
| 118 } else { | 145 } else { |
| 119 // convert the name to utf8 | 146 // convert the name to utf8 |
| 120 name = family.utf8(); | 147 name = family.utf8(); |
| 121 } | 148 } |
| 122 | 149 |
| 123 int style = SkTypeface::kNormal; | 150 int style = SkTypeface::kNormal; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 135 } | 162 } |
| 136 // FIXME: Use SkFontStyle and matchFamilyStyle instead of legacyCreateTypefa
ce. | 163 // FIXME: Use SkFontStyle and matchFamilyStyle instead of legacyCreateTypefa
ce. |
| 137 if (m_fontManager) | 164 if (m_fontManager) |
| 138 return adoptRef(m_fontManager->legacyCreateTypeface(name.data(), style))
; | 165 return adoptRef(m_fontManager->legacyCreateTypeface(name.data(), style))
; |
| 139 #endif | 166 #endif |
| 140 | 167 |
| 141 return adoptRef(SkTypeface::CreateFromName(name.data(), static_cast<SkTypefa
ce::Style>(style))); | 168 return adoptRef(SkTypeface::CreateFromName(name.data(), static_cast<SkTypefa
ce::Style>(style))); |
| 142 } | 169 } |
| 143 | 170 |
| 144 #if !OS(WIN) | 171 #if !OS(WIN) |
| 145 FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontD
escription, const AtomicString& family, float fontSize) | 172 FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontD
escription, const FontFaceCreationParams& creationParams, float fontSize) |
| 146 { | 173 { |
| 147 CString name; | 174 CString name; |
| 148 RefPtr<SkTypeface> tf(createTypeface(fontDescription, family, name)); | 175 RefPtr<SkTypeface> tf(createTypeface(fontDescription, creationParams, name))
; |
| 149 if (!tf) | 176 if (!tf) |
| 150 return 0; | 177 return 0; |
| 151 | 178 |
| 152 FontPlatformData* result = new FontPlatformData(tf, | 179 FontPlatformData* result = new FontPlatformData(tf, |
| 153 name.data(), | 180 name.data(), |
| 154 fontSize, | 181 fontSize, |
| 155 (fontDescription.weight() >= FontWeightBold && !tf->isBold()) || fontDes
cription.isSyntheticBold(), | 182 (fontDescription.weight() >= FontWeightBold && !tf->isBold()) || fontDes
cription.isSyntheticBold(), |
| 156 (fontDescription.style() && !tf->isItalic()) || fontDescription.isSynthe
ticItalic(), | 183 (fontDescription.style() && !tf->isItalic()) || fontDescription.isSynthe
ticItalic(), |
| 157 fontDescription.orientation(), | 184 fontDescription.orientation(), |
| 158 fontDescription.useSubpixelPositioning()); | 185 fontDescription.useSubpixelPositioning()); |
| 159 return result; | 186 return result; |
| 160 } | 187 } |
| 161 #endif // !OS(WIN) | 188 #endif // !OS(WIN) |
| 162 | 189 |
| 163 } // namespace WebCore | 190 } // namespace WebCore |
| OLD | NEW |