OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2008 Apple 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 } | 85 } |
86 } | 86 } |
87 | 87 |
88 void CSSSegmentedFontFace::appendFontFace(PassRefPtr<CSSFontFace> fontFace) | 88 void CSSSegmentedFontFace::appendFontFace(PassRefPtr<CSSFontFace> fontFace) |
89 { | 89 { |
90 pruneTable(); | 90 pruneTable(); |
91 fontFace->setSegmentedFontFace(this); | 91 fontFace->setSegmentedFontFace(this); |
92 m_fontFaces.append(fontFace); | 92 m_fontFaces.append(fontFace); |
93 } | 93 } |
94 | 94 |
95 static void appendFontDataWithInvalidUnicodeRangeIfLoading(SegmentedFontData* ne
wFontData, PassRefPtr<SimpleFontData> prpFaceFontData, const Vector<CSSFontFace:
:UnicodeRange>& ranges) | 95 static void appendFontData(SegmentedFontData* newFontData, PassRefPtr<SimpleFont
Data> prpFaceFontData, const Vector<CSSFontFace::UnicodeRange>& ranges) |
96 { | 96 { |
97 RefPtr<SimpleFontData> faceFontData = prpFaceFontData; | 97 RefPtr<SimpleFontData> faceFontData = prpFaceFontData; |
98 if (faceFontData->isLoading()) { | |
99 newFontData->appendRange(FontDataRange(0, 0, faceFontData)); | |
100 return; | |
101 } | |
102 | |
103 unsigned numRanges = ranges.size(); | 98 unsigned numRanges = ranges.size(); |
104 if (!numRanges) { | 99 if (!numRanges) { |
105 newFontData->appendRange(FontDataRange(0, 0x7FFFFFFF, faceFontData)); | 100 newFontData->appendRange(FontDataRange(0, 0x7FFFFFFF, faceFontData)); |
106 return; | 101 return; |
107 } | 102 } |
108 | 103 |
109 for (unsigned j = 0; j < numRanges; ++j) | 104 for (unsigned j = 0; j < numRanges; ++j) |
110 newFontData->appendRange(FontDataRange(ranges[j].from(), ranges[j].to(),
faceFontData)); | 105 newFontData->appendRange(FontDataRange(ranges[j].from(), ranges[j].to(),
faceFontData)); |
111 } | 106 } |
112 | 107 |
(...skipping 16 matching lines...) Expand all Loading... |
129 fontData = SegmentedFontData::create(); | 124 fontData = SegmentedFontData::create(); |
130 | 125 |
131 bool syntheticBold = !(m_traitsMask & (FontWeight600Mask | FontWeight700Mask
| FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight60
0Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)); | 126 bool syntheticBold = !(m_traitsMask & (FontWeight600Mask | FontWeight700Mask
| FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight60
0Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)); |
132 bool syntheticItalic = !(m_traitsMask & FontStyleItalicMask) && (desiredTrai
tsMask & FontStyleItalicMask); | 127 bool syntheticItalic = !(m_traitsMask & FontStyleItalicMask) && (desiredTrai
tsMask & FontStyleItalicMask); |
133 | 128 |
134 for (int i = m_fontFaces.size() - 1; i >= 0; --i) { | 129 for (int i = m_fontFaces.size() - 1; i >= 0; --i) { |
135 if (!m_fontFaces[i]->isValid()) | 130 if (!m_fontFaces[i]->isValid()) |
136 continue; | 131 continue; |
137 if (RefPtr<SimpleFontData> faceFontData = m_fontFaces[i]->getFontData(fo
ntDescription, syntheticBold, syntheticItalic)) { | 132 if (RefPtr<SimpleFontData> faceFontData = m_fontFaces[i]->getFontData(fo
ntDescription, syntheticBold, syntheticItalic)) { |
138 ASSERT(!faceFontData->isSegmented()); | 133 ASSERT(!faceFontData->isSegmented()); |
139 appendFontDataWithInvalidUnicodeRangeIfLoading(fontData.get(), faceF
ontData.release(), m_fontFaces[i]->ranges()); | 134 appendFontData(fontData.get(), faceFontData.release(), m_fontFaces[i
]->ranges()); |
140 } | 135 } |
141 } | 136 } |
142 if (fontData->numRanges()) | 137 if (fontData->numRanges()) |
143 return fontData; // No release, we have a reference to an object in the
cache which should retain the ref count it has. | 138 return fontData; // No release, we have a reference to an object in the
cache which should retain the ref count it has. |
144 | 139 |
145 return 0; | 140 return 0; |
146 } | 141 } |
147 | 142 |
148 bool CSSSegmentedFontFace::hasSVGFontFaceSource() const | 143 bool CSSSegmentedFontFace::hasSVGFontFaceSource() const |
149 { | 144 { |
(...skipping 27 matching lines...) Expand all Loading... |
177 unsigned size = m_fontFaces.size(); | 172 unsigned size = m_fontFaces.size(); |
178 for (unsigned i = 0; i < size; i++) { | 173 for (unsigned i = 0; i < size; i++) { |
179 if (m_fontFaces[i]->loadStatus() != FontFace::Loaded) | 174 if (m_fontFaces[i]->loadStatus() != FontFace::Loaded) |
180 return false; | 175 return false; |
181 } | 176 } |
182 return true; | 177 return true; |
183 } | 178 } |
184 | 179 |
185 void CSSSegmentedFontFace::loadFont(const FontDescription& fontDescription, Pass
RefPtr<LoadFontCallback> callback) | 180 void CSSSegmentedFontFace::loadFont(const FontDescription& fontDescription, Pass
RefPtr<LoadFontCallback> callback) |
186 { | 181 { |
187 getFontData(fontDescription); // Kick off the load. | 182 RefPtr<SegmentedFontData> fontData = toSegmentedFontData(getFontData(fontDes
cription).get()); |
| 183 unsigned numRanges = fontData->numRanges(); |
| 184 for (unsigned i = 0; i < numRanges; i++) |
| 185 fontData->rangeAt(i).fontData()->beginLoadIfNeeded(); |
188 | 186 |
189 if (callback) { | 187 if (callback) { |
190 if (isLoading()) | 188 if (isLoading()) |
191 m_callbacks.append(callback); | 189 m_callbacks.append(callback); |
192 else if (checkFont()) | 190 else if (checkFont()) |
193 callback->notifyLoaded(this); | 191 callback->notifyLoaded(this); |
194 else | 192 else |
195 callback->notifyError(this); | 193 callback->notifyError(this); |
196 } | 194 } |
197 } | 195 } |
198 | 196 |
199 } | 197 } |
OLD | NEW |