Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. | 3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
| 4 * Copyright (C) 2013 Google Inc. All rights reserved. | 4 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 5 * | 5 * |
| 6 * This library is free software; you can redistribute it and/or | 6 * This library is free software; you can redistribute it and/or |
| 7 * modify it under the terms of the GNU Library General Public | 7 * modify it under the terms of the GNU Library General Public |
| 8 * License as published by the Free Software Foundation; either | 8 * License as published by the Free Software Foundation; either |
| 9 * version 2 of the License, or (at your option) any later version. | 9 * version 2 of the License, or (at your option) any later version. |
| 10 * | 10 * |
| 11 * This library is distributed in the hope that it will be useful, | 11 * This library is distributed in the hope that it will be useful, |
| 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 * Library General Public License for more details. | 14 * Library General Public License for more details. |
| 15 * | 15 * |
| 16 * You should have received a copy of the GNU Library General Public License | 16 * You should have received a copy of the GNU Library General Public License |
| 17 * along with this library; see the file COPYING.LIB. If not, write to | 17 * along with this library; see the file COPYING.LIB. If not, write to |
| 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 19 * Boston, MA 02110-1301, USA. | 19 * Boston, MA 02110-1301, USA. |
| 20 * | 20 * |
| 21 */ | 21 */ |
| 22 | 22 |
| 23 #include "config.h" | 23 #include "config.h" |
| 24 #include "core/css/resolver/FontBuilder.h" | 24 #include "core/css/resolver/FontBuilder.h" |
| 25 | 25 |
| 26 #include "core/css/CSSCalculationValue.h" | 26 #include "core/CSSValueKeywords.h" |
| 27 #include "core/css/CSSToLengthConversionData.h" | |
| 28 #include "core/frame/LocalFrame.h" | 27 #include "core/frame/LocalFrame.h" |
| 29 #include "core/frame/Settings.h" | 28 #include "core/frame/Settings.h" |
| 30 #include "core/rendering/RenderTheme.h" | 29 #include "core/rendering/RenderTheme.h" |
| 31 #include "core/rendering/RenderView.h" | 30 #include "core/rendering/RenderView.h" |
| 32 #include "core/rendering/TextAutosizer.h" | 31 #include "core/rendering/TextAutosizer.h" |
| 32 #include "platform/FontFamilyNames.h" | |
| 33 #include "platform/fonts/FontDescription.h" | 33 #include "platform/fonts/FontDescription.h" |
| 34 #include "platform/text/LocaleToScriptMapping.h" | 34 #include "platform/text/LocaleToScriptMapping.h" |
| 35 | 35 |
| 36 namespace blink { | 36 namespace blink { |
| 37 | 37 |
| 38 // FIXME: This scoping class is a short-term fix to minimize the changes in | 38 // FIXME: This scoping class is a short-term fix to minimize the changes in |
| 39 // Font-constructing logic. | 39 // Font-constructing logic. |
| 40 class FontDescriptionChangeScope { | 40 class FontDescriptionChangeScope { |
| 41 STACK_ALLOCATED(); | 41 STACK_ALLOCATED(); |
| 42 public: | 42 public: |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 68 } | 68 } |
| 69 | 69 |
| 70 void FontBuilder::initForStyleResolve(const Document& document, RenderStyle* sty le) | 70 void FontBuilder::initForStyleResolve(const Document& document, RenderStyle* sty le) |
| 71 { | 71 { |
| 72 ASSERT(document.frame()); | 72 ASSERT(document.frame()); |
| 73 m_document = &document; | 73 m_document = &document; |
| 74 m_style = style; | 74 m_style = style; |
| 75 m_fontDirty = false; | 75 m_fontDirty = false; |
| 76 } | 76 } |
| 77 | 77 |
| 78 inline static void setFontFamilyToStandard(FontDescription& fontDescription, con st Document* document) | |
| 79 { | |
| 80 if (!document || !document->settings()) | |
| 81 return; | |
| 82 | |
| 83 fontDescription.setGenericFamily(FontDescription::StandardFamily); | |
| 84 const AtomicString& standardFontFamily = document->settings()->genericFontFa milySettings().standard(); | |
| 85 if (standardFontFamily.isEmpty()) | |
| 86 return; | |
| 87 | |
| 88 fontDescription.firstFamily().setFamily(standardFontFamily); | |
| 89 // FIXME: Why is this needed here? | |
| 90 fontDescription.firstFamily().appendFamily(nullptr); | |
| 91 } | |
| 92 | |
| 93 void FontBuilder::setInitial(float effectiveZoom) | 78 void FontBuilder::setInitial(float effectiveZoom) |
| 94 { | 79 { |
| 95 ASSERT(m_document && m_document->settings()); | 80 ASSERT(m_document && m_document->settings()); |
| 96 if (!m_document || !m_document->settings()) | 81 if (!m_document || !m_document->settings()) |
| 97 return; | 82 return; |
| 98 | 83 |
| 99 FontDescriptionChangeScope scope(this); | 84 FontDescriptionChangeScope scope(this); |
| 100 | 85 |
| 101 scope.reset(); | 86 scope.reset(); |
| 102 setFontFamilyToStandard(scope.fontDescription(), m_document); | 87 setFamilyDescription(scope.fontDescription(), FontBuilder::initialFamilyDesc ription()); |
| 103 setSize(scope.fontDescription(), FontBuilder::initialSize()); | 88 setSize(scope.fontDescription(), FontBuilder::initialSize()); |
| 104 } | 89 } |
| 105 | 90 |
| 106 void FontBuilder::inheritFrom(const FontDescription& fontDescription) | 91 void FontBuilder::inheritFrom(const FontDescription& fontDescription) |
| 107 { | 92 { |
| 108 FontDescriptionChangeScope scope(this); | 93 FontDescriptionChangeScope scope(this); |
| 109 | 94 |
| 110 scope.set(fontDescription); | 95 scope.set(fontDescription); |
| 111 } | 96 } |
| 112 | 97 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 130 const Settings* settings = m_document->settings(); | 115 const Settings* settings = m_document->settings(); |
| 131 ASSERT(settings); // If we're doing style resolution, this document should a lways be in a frame and thus have settings | 116 ASSERT(settings); // If we're doing style resolution, this document should a lways be in a frame and thus have settings |
| 132 if (!settings) | 117 if (!settings) |
| 133 return; | 118 return; |
| 134 | 119 |
| 135 // Handle the zoom factor. | 120 // Handle the zoom factor. |
| 136 fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(fontDescrip tion, effectiveZoom, fontDescription.specifiedSize())); | 121 fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(fontDescrip tion, effectiveZoom, fontDescription.specifiedSize())); |
| 137 scope.set(fontDescription); | 122 scope.set(fontDescription); |
| 138 } | 123 } |
| 139 | 124 |
| 140 void FontBuilder::setFontFamilyInitial() | 125 FontFamily FontBuilder::standardFontFamily() const |
| 126 { | |
| 127 FontFamily family; | |
| 128 family.setFamily(standardFontFamilyName()); | |
| 129 return family; | |
| 130 } | |
| 131 | |
| 132 AtomicString FontBuilder::standardFontFamilyName() const | |
| 133 { | |
| 134 ASSERT(m_document); | |
| 135 Settings* settings = m_document->settings(); | |
| 136 if (settings) | |
| 137 return settings->genericFontFamilySettings().standard(); | |
| 138 return AtomicString(); | |
| 139 } | |
| 140 | |
| 141 AtomicString FontBuilder::genericFontFamilyName(FontDescription::GenericFamilyTy pe genericFamily) const | |
|
dglazkov
2014/09/26 17:52:52
AWESOME!!
| |
| 142 { | |
| 143 switch (genericFamily) { | |
| 144 default: | |
| 145 ASSERT_NOT_REACHED(); | |
| 146 case FontDescription::NoFamily: | |
| 147 return AtomicString(); | |
| 148 case FontDescription::StandardFamily: | |
| 149 return standardFontFamilyName(); | |
| 150 case FontDescription::SerifFamily: | |
| 151 return FontFamilyNames::webkit_serif; | |
| 152 case FontDescription::SansSerifFamily: | |
| 153 return FontFamilyNames::webkit_sans_serif; | |
| 154 case FontDescription::MonospaceFamily: | |
| 155 return FontFamilyNames::webkit_monospace; | |
| 156 case FontDescription::CursiveFamily: | |
| 157 return FontFamilyNames::webkit_cursive; | |
| 158 case FontDescription::FantasyFamily: | |
| 159 return FontFamilyNames::webkit_fantasy; | |
| 160 case FontDescription::PictographFamily: | |
| 161 return FontFamilyNames::webkit_pictograph; | |
| 162 } | |
| 163 } | |
| 164 | |
| 165 void FontBuilder::setFamilyDescription(const FontDescription::FamilyDescription& familyDescription) | |
| 141 { | 166 { |
| 142 FontDescriptionChangeScope scope(this); | 167 FontDescriptionChangeScope scope(this); |
| 143 | 168 |
| 144 setFontFamilyToStandard(scope.fontDescription(), m_document); | 169 setFamilyDescription(scope.fontDescription(), familyDescription); |
| 145 } | |
| 146 | |
| 147 void FontBuilder::setFontFamilyInherit(const FontDescription& parentFontDescript ion) | |
| 148 { | |
| 149 FontDescriptionChangeScope scope(this); | |
| 150 | |
| 151 scope.fontDescription().setGenericFamily(parentFontDescription.genericFamily ()); | |
| 152 scope.fontDescription().setFamily(parentFontDescription.family()); | |
| 153 } | |
| 154 | |
| 155 // FIXME: I am not convinced FontBuilder needs to know anything about CSSValues. | |
| 156 void FontBuilder::setFontFamilyValue(CSSValue* value) | |
| 157 { | |
| 158 FontDescriptionChangeScope scope(this); | |
| 159 | |
| 160 if (!value->isValueList()) | |
| 161 return; | |
| 162 | |
| 163 FontFamily& firstFamily = scope.fontDescription().firstFamily(); | |
| 164 FontFamily* currFamily = 0; | |
| 165 | |
| 166 // Before mapping in a new font-family property, we should reset the generic family. | |
| 167 FixedPitchFontType oldFixedPitchFontType = scope.fontDescription().fixedPitc hFontType(); | |
| 168 scope.fontDescription().setGenericFamily(FontDescription::NoFamily); | |
| 169 | |
| 170 for (CSSValueListIterator i = value; i.hasMore(); i.advance()) { | |
| 171 CSSValue* item = i.value(); | |
| 172 if (!item->isPrimitiveValue()) | |
| 173 continue; | |
| 174 CSSPrimitiveValue* contentValue = toCSSPrimitiveValue(item); | |
| 175 AtomicString face; | |
| 176 Settings* settings = m_document->settings(); | |
| 177 if (contentValue->isString()) { | |
| 178 face = AtomicString(contentValue->getStringValue()); | |
| 179 } else if (settings) { | |
| 180 switch (contentValue->getValueID()) { | |
| 181 case CSSValueWebkitBody: | |
| 182 face = settings->genericFontFamilySettings().standard(); | |
| 183 break; | |
| 184 case CSSValueSerif: | |
| 185 face = FontFamilyNames::webkit_serif; | |
| 186 scope.fontDescription().setGenericFamily(FontDescription::SerifF amily); | |
| 187 break; | |
| 188 case CSSValueSansSerif: | |
| 189 face = FontFamilyNames::webkit_sans_serif; | |
| 190 scope.fontDescription().setGenericFamily(FontDescription::SansSe rifFamily); | |
| 191 break; | |
| 192 case CSSValueCursive: | |
| 193 face = FontFamilyNames::webkit_cursive; | |
| 194 scope.fontDescription().setGenericFamily(FontDescription::Cursiv eFamily); | |
| 195 break; | |
| 196 case CSSValueFantasy: | |
| 197 face = FontFamilyNames::webkit_fantasy; | |
| 198 scope.fontDescription().setGenericFamily(FontDescription::Fantas yFamily); | |
| 199 break; | |
| 200 case CSSValueMonospace: | |
| 201 face = FontFamilyNames::webkit_monospace; | |
| 202 scope.fontDescription().setGenericFamily(FontDescription::Monosp aceFamily); | |
| 203 break; | |
| 204 case CSSValueWebkitPictograph: | |
| 205 face = FontFamilyNames::webkit_pictograph; | |
| 206 scope.fontDescription().setGenericFamily(FontDescription::Pictog raphFamily); | |
| 207 break; | |
| 208 default: | |
| 209 break; | |
| 210 } | |
| 211 } | |
| 212 | |
| 213 if (!face.isEmpty()) { | |
| 214 if (!currFamily) { | |
| 215 // Filling in the first family. | |
| 216 firstFamily.setFamily(face); | |
| 217 firstFamily.appendFamily(nullptr); // Remove any inherited famil y-fallback list. | |
| 218 currFamily = &firstFamily; | |
| 219 } else { | |
| 220 RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create(); | |
| 221 newFamily->setFamily(face); | |
| 222 currFamily->appendFamily(newFamily); | |
| 223 currFamily = newFamily.get(); | |
| 224 } | |
| 225 } | |
| 226 } | |
| 227 | |
| 228 // We can't call useFixedDefaultSize() until all new font families have been added | |
| 229 // If currFamily is non-zero then we set at least one family on this descrip tion. | |
| 230 if (!currFamily) | |
| 231 return; | |
| 232 | |
| 233 if (scope.fontDescription().keywordSize() && scope.fontDescription().fixedPi tchFontType() != oldFixedPitchFontType) | |
| 234 setSize(scope.fontDescription(), FontDescription::Size(scope.fontDescrip tion().keywordSize(), 0.0f, false)); | |
| 235 } | 170 } |
| 236 | 171 |
| 237 void FontBuilder::setWeight(FontWeight fontWeight) | 172 void FontBuilder::setWeight(FontWeight fontWeight) |
| 238 { | 173 { |
| 239 FontDescriptionChangeScope scope(this); | 174 FontDescriptionChangeScope scope(this); |
| 240 | 175 |
| 241 scope.fontDescription().setWeight(fontWeight); | 176 scope.fontDescription().setWeight(fontWeight); |
| 242 } | 177 } |
| 243 | 178 |
| 244 void FontBuilder::setSize(const FontDescription::Size& size) | 179 void FontBuilder::setSize(const FontDescription::Size& size) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 305 scope.fontDescription().setFontSmoothing(foontSmoothingMode); | 240 scope.fontDescription().setFontSmoothing(foontSmoothingMode); |
| 306 } | 241 } |
| 307 | 242 |
| 308 void FontBuilder::setFeatureSettings(PassRefPtr<FontFeatureSettings> settings) | 243 void FontBuilder::setFeatureSettings(PassRefPtr<FontFeatureSettings> settings) |
| 309 { | 244 { |
| 310 FontDescriptionChangeScope scope(this); | 245 FontDescriptionChangeScope scope(this); |
| 311 | 246 |
| 312 scope.fontDescription().setFeatureSettings(settings); | 247 scope.fontDescription().setFeatureSettings(settings); |
| 313 } | 248 } |
| 314 | 249 |
| 250 void FontBuilder::setFamilyDescription(FontDescription& fontDescription, const F ontDescription::FamilyDescription& familyDescription) | |
| 251 { | |
| 252 FixedPitchFontType oldFixedPitchFontType = fontDescription.fixedPitchFontTyp e(); | |
| 253 | |
| 254 bool isInitial = familyDescription.genericFamily == FontDescription::Standar dFamily && familyDescription.family.familyIsEmpty(); | |
| 255 | |
| 256 fontDescription.setGenericFamily(familyDescription.genericFamily); | |
| 257 fontDescription.setFamily(isInitial ? standardFontFamily() : familyDescripti on.family); | |
| 258 | |
| 259 if (fontDescription.keywordSize() && fontDescription.fixedPitchFontType() != oldFixedPitchFontType) | |
| 260 setSize(fontDescription, FontDescription::Size(fontDescription.keywordSi ze(), 0.0f, false)); | |
| 261 } | |
| 262 | |
| 315 void FontBuilder::setSize(FontDescription& fontDescription, const FontDescriptio n::Size& size) | 263 void FontBuilder::setSize(FontDescription& fontDescription, const FontDescriptio n::Size& size) |
| 316 { | 264 { |
| 317 float specifiedSize = size.value; | 265 float specifiedSize = size.value; |
| 318 | 266 |
| 319 if (!specifiedSize && size.keyword) | 267 if (!specifiedSize && size.keyword) |
| 320 specifiedSize = FontSize::fontSizeForKeyword(m_document, size.keyword, f ontDescription.fixedPitchFontType()); | 268 specifiedSize = FontSize::fontSizeForKeyword(m_document, size.keyword, f ontDescription.fixedPitchFontType()); |
| 321 | 269 |
| 322 if (specifiedSize < 0) | 270 if (specifiedSize < 0) |
| 323 return; | 271 return; |
| 324 | 272 |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 458 checkForOrientationChange(style); | 406 checkForOrientationChange(style); |
| 459 style->font().update(fontSelector); | 407 style->font().update(fontSelector); |
| 460 m_fontDirty = false; | 408 m_fontDirty = false; |
| 461 } | 409 } |
| 462 | 410 |
| 463 void FontBuilder::createFontForDocument(PassRefPtrWillBeRawPtr<FontSelector> fon tSelector, RenderStyle* documentStyle) | 411 void FontBuilder::createFontForDocument(PassRefPtrWillBeRawPtr<FontSelector> fon tSelector, RenderStyle* documentStyle) |
| 464 { | 412 { |
| 465 FontDescription fontDescription = FontDescription(); | 413 FontDescription fontDescription = FontDescription(); |
| 466 fontDescription.setScript(localeToScriptCodeForFontSelection(documentStyle-> locale())); | 414 fontDescription.setScript(localeToScriptCodeForFontSelection(documentStyle-> locale())); |
| 467 | 415 |
| 468 setFontFamilyToStandard(fontDescription, m_document); | 416 setFamilyDescription(fontDescription, FontBuilder::initialFamilyDescription( )); |
| 469 | |
| 470 setSize(fontDescription, FontDescription::Size(FontSize::initialKeywordSize( ), 0.0f, false)); | 417 setSize(fontDescription, FontDescription::Size(FontSize::initialKeywordSize( ), 0.0f, false)); |
| 471 updateComputedSize(fontDescription, documentStyle); | 418 updateComputedSize(fontDescription, documentStyle); |
| 472 | 419 |
| 473 FontOrientation fontOrientation; | 420 FontOrientation fontOrientation; |
| 474 NonCJKGlyphOrientation glyphOrientation; | 421 NonCJKGlyphOrientation glyphOrientation; |
| 475 getFontAndGlyphOrientation(documentStyle, fontOrientation, glyphOrientation) ; | 422 getFontAndGlyphOrientation(documentStyle, fontOrientation, glyphOrientation) ; |
| 476 fontDescription.setOrientation(fontOrientation); | 423 fontDescription.setOrientation(fontOrientation); |
| 477 fontDescription.setNonCJKGlyphOrientation(glyphOrientation); | 424 fontDescription.setNonCJKGlyphOrientation(glyphOrientation); |
| 478 documentStyle->setFontDescription(fontDescription); | 425 documentStyle->setFontDescription(fontDescription); |
| 479 documentStyle->font().update(fontSelector); | 426 documentStyle->font().update(fontSelector); |
| 480 } | 427 } |
| 481 | 428 |
| 482 } | 429 } |
| OLD | NEW |