| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (c) 2006, 2007, 2008, Google Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions are | |
| 6 * met: | |
| 7 * | |
| 8 * * Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * * Redistributions in binary form must reproduce the above | |
| 11 * copyright notice, this list of conditions and the following disclaimer | |
| 12 * in the documentation and/or other materials provided with the | |
| 13 * distribution. | |
| 14 * * Neither the name of Google Inc. nor the names of its | |
| 15 * contributors may be used to endorse or promote products derived from | |
| 16 * this software without specific prior written permission. | |
| 17 * | |
| 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 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. | |
| 29 */ | |
| 30 | |
| 31 #include "config.h" | |
| 32 #include "core/platform/graphics/harfbuzz/FontPlatformDataHarfBuzz.h" | |
| 33 | |
| 34 #include "RuntimeEnabledFeatures.h" | |
| 35 #include "SkTypeface.h" | |
| 36 #include "platform/LayoutTestSupport.h" | |
| 37 #include "platform/NotImplemented.h" | |
| 38 #include "core/platform/graphics/FontCache.h" | |
| 39 #include "core/platform/graphics/harfbuzz/HarfBuzzFace.h" | |
| 40 | |
| 41 #include "public/platform/linux/WebFontInfo.h" | |
| 42 #include "public/platform/linux/WebFontRenderStyle.h" | |
| 43 #include "public/platform/linux/WebSandboxSupport.h" | |
| 44 #include "public/platform/Platform.h" | |
| 45 #include "wtf/text/WTFString.h" | |
| 46 | |
| 47 namespace WebCore { | |
| 48 | |
| 49 static SkPaint::Hinting skiaHinting = SkPaint::kNormal_Hinting; | |
| 50 static bool useSkiaAutoHint = true; | |
| 51 static bool useSkiaBitmaps = true; | |
| 52 static bool useSkiaAntiAlias = true; | |
| 53 static bool useSkiaSubpixelRendering = false; | |
| 54 | |
| 55 void FontPlatformData::setHinting(SkPaint::Hinting hinting) | |
| 56 { | |
| 57 skiaHinting = hinting; | |
| 58 } | |
| 59 | |
| 60 void FontPlatformData::setAutoHint(bool useAutoHint) | |
| 61 { | |
| 62 useSkiaAutoHint = useAutoHint; | |
| 63 } | |
| 64 | |
| 65 void FontPlatformData::setUseBitmaps(bool useBitmaps) | |
| 66 { | |
| 67 useSkiaBitmaps = useBitmaps; | |
| 68 } | |
| 69 | |
| 70 void FontPlatformData::setAntiAlias(bool useAntiAlias) | |
| 71 { | |
| 72 useSkiaAntiAlias = useAntiAlias; | |
| 73 } | |
| 74 | |
| 75 void FontPlatformData::setSubpixelRendering(bool useSubpixelRendering) | |
| 76 { | |
| 77 useSkiaSubpixelRendering = useSubpixelRendering; | |
| 78 } | |
| 79 | |
| 80 FontPlatformData::FontPlatformData(WTF::HashTableDeletedValueType) | |
| 81 : m_textSize(0) | |
| 82 , m_emSizeInFontUnits(0) | |
| 83 , m_fakeBold(false) | |
| 84 , m_fakeItalic(false) | |
| 85 , m_orientation(Horizontal) | |
| 86 , m_isHashTableDeletedValue(true) | |
| 87 { | |
| 88 } | |
| 89 | |
| 90 FontPlatformData::FontPlatformData() | |
| 91 : m_textSize(0) | |
| 92 , m_emSizeInFontUnits(0) | |
| 93 , m_fakeBold(false) | |
| 94 , m_fakeItalic(false) | |
| 95 , m_orientation(Horizontal) | |
| 96 , m_isHashTableDeletedValue(false) | |
| 97 { | |
| 98 } | |
| 99 | |
| 100 FontPlatformData::FontPlatformData(float textSize, bool fakeBold, bool fakeItali
c) | |
| 101 : m_textSize(textSize) | |
| 102 , m_emSizeInFontUnits(0) | |
| 103 , m_fakeBold(fakeBold) | |
| 104 , m_fakeItalic(fakeItalic) | |
| 105 , m_orientation(Horizontal) | |
| 106 , m_isHashTableDeletedValue(false) | |
| 107 { | |
| 108 } | |
| 109 | |
| 110 FontPlatformData::FontPlatformData(const FontPlatformData& src) | |
| 111 : m_typeface(src.m_typeface) | |
| 112 , m_family(src.m_family) | |
| 113 , m_textSize(src.m_textSize) | |
| 114 , m_emSizeInFontUnits(src.m_emSizeInFontUnits) | |
| 115 , m_fakeBold(src.m_fakeBold) | |
| 116 , m_fakeItalic(src.m_fakeItalic) | |
| 117 , m_orientation(src.m_orientation) | |
| 118 , m_style(src.m_style) | |
| 119 , m_harfBuzzFace(0) | |
| 120 , m_isHashTableDeletedValue(false) | |
| 121 { | |
| 122 } | |
| 123 | |
| 124 FontPlatformData::FontPlatformData(PassRefPtr<SkTypeface> tf, const char* family
, float textSize, bool fakeBold, bool fakeItalic, FontOrientation orientation, b
ool subpixelTextPosition) | |
| 125 : m_typeface(tf) | |
| 126 , m_family(family) | |
| 127 , m_textSize(textSize) | |
| 128 , m_emSizeInFontUnits(0) | |
| 129 , m_fakeBold(fakeBold) | |
| 130 , m_fakeItalic(fakeItalic) | |
| 131 , m_orientation(orientation) | |
| 132 , m_isHashTableDeletedValue(false) | |
| 133 { | |
| 134 querySystemForRenderStyle(subpixelTextPosition); | |
| 135 } | |
| 136 | |
| 137 FontPlatformData::FontPlatformData(const FontPlatformData& src, float textSize) | |
| 138 : m_typeface(src.m_typeface) | |
| 139 , m_family(src.m_family) | |
| 140 , m_textSize(textSize) | |
| 141 , m_emSizeInFontUnits(src.m_emSizeInFontUnits) | |
| 142 , m_fakeBold(src.m_fakeBold) | |
| 143 , m_fakeItalic(src.m_fakeItalic) | |
| 144 , m_orientation(src.m_orientation) | |
| 145 , m_harfBuzzFace(0) | |
| 146 , m_isHashTableDeletedValue(false) | |
| 147 { | |
| 148 querySystemForRenderStyle(FontDescription::subpixelPositioning()); | |
| 149 } | |
| 150 | |
| 151 FontPlatformData::~FontPlatformData() | |
| 152 { | |
| 153 } | |
| 154 | |
| 155 int FontPlatformData::emSizeInFontUnits() const | |
| 156 { | |
| 157 if (m_emSizeInFontUnits) | |
| 158 return m_emSizeInFontUnits; | |
| 159 | |
| 160 m_emSizeInFontUnits = m_typeface->getUnitsPerEm(); | |
| 161 return m_emSizeInFontUnits; | |
| 162 } | |
| 163 | |
| 164 FontPlatformData& FontPlatformData::operator=(const FontPlatformData& src) | |
| 165 { | |
| 166 m_typeface = src.m_typeface; | |
| 167 m_family = src.m_family; | |
| 168 m_textSize = src.m_textSize; | |
| 169 m_fakeBold = src.m_fakeBold; | |
| 170 m_fakeItalic = src.m_fakeItalic; | |
| 171 m_harfBuzzFace = 0; | |
| 172 m_orientation = src.m_orientation; | |
| 173 m_style = src.m_style; | |
| 174 m_emSizeInFontUnits = src.m_emSizeInFontUnits; | |
| 175 | |
| 176 return *this; | |
| 177 } | |
| 178 | |
| 179 #ifndef NDEBUG | |
| 180 String FontPlatformData::description() const | |
| 181 { | |
| 182 return String(); | |
| 183 } | |
| 184 #endif | |
| 185 | |
| 186 void FontPlatformData::setupPaint(SkPaint* paint, GraphicsContext* context) cons
t | |
| 187 { | |
| 188 UNUSED_PARAM(context); | |
| 189 paint->setAntiAlias(m_style.useAntiAlias); | |
| 190 paint->setHinting(static_cast<SkPaint::Hinting>(m_style.hintStyle)); | |
| 191 paint->setEmbeddedBitmapText(m_style.useBitmaps); | |
| 192 paint->setAutohinted(m_style.useAutoHint); | |
| 193 if (m_style.useAntiAlias) | |
| 194 paint->setLCDRenderText(m_style.useSubpixelRendering); | |
| 195 | |
| 196 // TestRunner specifically toggles the subpixel positioning flag. | |
| 197 if (RuntimeEnabledFeatures::subpixelFontScalingEnabled() && !isRunningLayout
Test()) | |
| 198 paint->setSubpixelText(true); | |
| 199 else | |
| 200 paint->setSubpixelText(m_style.useSubpixelPositioning); | |
| 201 | |
| 202 const float ts = m_textSize >= 0 ? m_textSize : 12; | |
| 203 paint->setTextSize(SkFloatToScalar(ts)); | |
| 204 paint->setTypeface(m_typeface.get()); | |
| 205 paint->setFakeBoldText(m_fakeBold); | |
| 206 paint->setTextSkewX(m_fakeItalic ? -SK_Scalar1 / 4 : 0); | |
| 207 } | |
| 208 | |
| 209 SkFontID FontPlatformData::uniqueID() const | |
| 210 { | |
| 211 return m_typeface->uniqueID(); | |
| 212 } | |
| 213 | |
| 214 String FontPlatformData::fontFamilyName() const | |
| 215 { | |
| 216 SkTypeface::LocalizedStrings* fontFamilyIterator = this->typeface()->createF
amilyNameIterator(); | |
| 217 SkTypeface::LocalizedString localizedString; | |
| 218 while (fontFamilyIterator->next(&localizedString) && !localizedString.fStrin
g.size()) { } | |
| 219 fontFamilyIterator->unref(); | |
| 220 return String(localizedString.fString.c_str()); | |
| 221 } | |
| 222 | |
| 223 bool FontPlatformData::operator==(const FontPlatformData& a) const | |
| 224 { | |
| 225 // If either of the typeface pointers are null then we test for pointer | |
| 226 // equality. Otherwise, we call SkTypeface::Equal on the valid pointers. | |
| 227 bool typefacesEqual; | |
| 228 if (!m_typeface || !a.m_typeface) | |
| 229 typefacesEqual = m_typeface == a.m_typeface; | |
| 230 else | |
| 231 typefacesEqual = SkTypeface::Equal(m_typeface.get(), a.m_typeface.get())
; | |
| 232 | |
| 233 return typefacesEqual | |
| 234 && m_textSize == a.m_textSize | |
| 235 && m_fakeBold == a.m_fakeBold | |
| 236 && m_fakeItalic == a.m_fakeItalic | |
| 237 && m_orientation == a.m_orientation | |
| 238 && m_style == a.m_style | |
| 239 && m_isHashTableDeletedValue == a.m_isHashTableDeletedValue; | |
| 240 } | |
| 241 | |
| 242 bool FontPlatformData::isFixedPitch() const | |
| 243 { | |
| 244 notImplemented(); | |
| 245 return false; | |
| 246 } | |
| 247 | |
| 248 HarfBuzzFace* FontPlatformData::harfBuzzFace() const | |
| 249 { | |
| 250 if (!m_harfBuzzFace) | |
| 251 m_harfBuzzFace = HarfBuzzFace::create(const_cast<FontPlatformData*>(this
), uniqueID()); | |
| 252 | |
| 253 return m_harfBuzzFace.get(); | |
| 254 } | |
| 255 | |
| 256 void FontPlatformData::getRenderStyleForStrike(const char* font, int sizeAndStyl
e) | |
| 257 { | |
| 258 blink::WebFontRenderStyle style; | |
| 259 | |
| 260 #if OS(ANDROID) | |
| 261 style.setDefaults(); | |
| 262 #else | |
| 263 if (!font || !*font) | |
| 264 style.setDefaults(); // It's probably a webfont. Take the system default
s. | |
| 265 else if (blink::Platform::current()->sandboxSupport()) | |
| 266 blink::Platform::current()->sandboxSupport()->getRenderStyleForStrike(fo
nt, sizeAndStyle, &style); | |
| 267 else | |
| 268 blink::WebFontInfo::renderStyleForStrike(font, sizeAndStyle, &style); | |
| 269 #endif | |
| 270 | |
| 271 style.toFontRenderStyle(&m_style); | |
| 272 } | |
| 273 | |
| 274 void FontPlatformData::querySystemForRenderStyle(bool useSkiaSubpixelPositioning
) | |
| 275 { | |
| 276 getRenderStyleForStrike(m_family.data(), (((int)m_textSize) << 2) | (m_typef
ace->style() & 3)); | |
| 277 | |
| 278 // Fix FontRenderStyle::NoPreference to actual styles. | |
| 279 if (m_style.useAntiAlias == FontRenderStyle::NoPreference) | |
| 280 m_style.useAntiAlias = useSkiaAntiAlias; | |
| 281 | |
| 282 if (!m_style.useHinting) | |
| 283 m_style.hintStyle = SkPaint::kNo_Hinting; | |
| 284 else if (m_style.useHinting == FontRenderStyle::NoPreference) | |
| 285 m_style.hintStyle = skiaHinting; | |
| 286 | |
| 287 if (m_style.useBitmaps == FontRenderStyle::NoPreference) | |
| 288 m_style.useBitmaps = useSkiaBitmaps; | |
| 289 if (m_style.useAutoHint == FontRenderStyle::NoPreference) | |
| 290 m_style.useAutoHint = useSkiaAutoHint; | |
| 291 if (m_style.useAntiAlias == FontRenderStyle::NoPreference) | |
| 292 m_style.useAntiAlias = useSkiaAntiAlias; | |
| 293 if (m_style.useSubpixelRendering == FontRenderStyle::NoPreference) | |
| 294 m_style.useSubpixelRendering = useSkiaSubpixelRendering; | |
| 295 | |
| 296 // TestRunner specifically toggles the subpixel positioning flag. | |
| 297 if (m_style.useSubpixelPositioning == FontRenderStyle::NoPreference | |
| 298 || isRunningLayoutTest()) | |
| 299 m_style.useSubpixelPositioning = useSkiaSubpixelPositioning; | |
| 300 } | |
| 301 | |
| 302 } // namespace WebCore | |
| OLD | NEW |