Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(49)

Side by Side Diff: Source/core/svg/SVGFontData.cpp

Issue 198783006: Hold SVGFontFaceElement in SVGDocumentExtensions until StyleRecalc is finished (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fixed indent Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/svg/SVGDocumentExtensions.cpp ('k') | Source/core/svg/SVGFontFaceElement.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 , m_verticalAdvanceY(fontFaceElement->verticalAdvanceY()) 55 , m_verticalAdvanceY(fontFaceElement->verticalAdvanceY())
56 { 56 {
57 ASSERT_ARG(fontFaceElement, fontFaceElement); 57 ASSERT_ARG(fontFaceElement, fontFaceElement);
58 } 58 }
59 59
60 void SVGFontData::initializeFontData(SimpleFontData* fontData, float fontSize) 60 void SVGFontData::initializeFontData(SimpleFontData* fontData, float fontSize)
61 { 61 {
62 ASSERT(fontData); 62 ASSERT(fontData);
63 63
64 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 64 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
65 ASSERT(svgFontFaceElement); 65 ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument());
66 66
67 SVGFontElement* svgFontElement = svgFontFaceElement->associatedFontElement() ; 67 SVGFontElement* svgFontElement = svgFontFaceElement->associatedFontElement() ;
68 ASSERT(svgFontElement); 68 ASSERT(svgFontElement);
69 GlyphData missingGlyphData; 69 GlyphData missingGlyphData;
70 missingGlyphData.fontData = fontData; 70 missingGlyphData.fontData = fontData;
71 missingGlyphData.glyph = svgFontElement->missingGlyph(); 71 missingGlyphData.glyph = svgFontElement->missingGlyph();
72 fontData->setMissingGlyphData(missingGlyphData); 72 fontData->setMissingGlyphData(missingGlyphData);
73 73
74 fontData->setZeroWidthSpaceGlyph(0); 74 fontData->setZeroWidthSpaceGlyph(0);
75 fontData->determinePitch(); 75 fontData->determinePitch();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 116
117 // Estimate maximum character width. 117 // Estimate maximum character width.
118 Glyph letterWGlyph = glyphPageZero->glyphForCharacter('W'); 118 Glyph letterWGlyph = glyphPageZero->glyphForCharacter('W');
119 fontData->setMaxCharWidth(letterWGlyph ? fontData->widthForGlyph(letterWGlyp h) : ascent); 119 fontData->setMaxCharWidth(letterWGlyph ? fontData->widthForGlyph(letterWGlyp h) : ascent);
120 } 120 }
121 121
122 float SVGFontData::widthForSVGGlyph(Glyph glyph, float fontSize) const 122 float SVGFontData::widthForSVGGlyph(Glyph glyph, float fontSize) const
123 { 123 {
124 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 124 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
125 ASSERT(svgFontFaceElement); 125 ASSERT(svgFontFaceElement);
126 // RenderView::clearSelection is invoked while removing some element, e.g.
127 // Document::nodeWillBeRemoved => FrameSelection::nodeWillBeRemoved => Rende rView::clearSelection.
128 // Since recalc style has not been executed yet, RenderStyle might have some reference to
129 // SVGFontFaceElement which was also removed.
130 // In this case, use default horizontalAdvanceX instead of associatedFontEle ment's one.
131 if (!svgFontFaceElement->inDocument())
132 return m_horizontalAdvanceX * scaleEmToUnits(fontSize, svgFontFaceElemen t->unitsPerEm());
126 133
127 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement(); 134 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement();
128 ASSERT(associatedFontElement); 135 ASSERT(associatedFontElement);
129 136
130 SVGGlyph svgGlyph = associatedFontElement->svgGlyphForGlyph(glyph); 137 SVGGlyph svgGlyph = associatedFontElement->svgGlyphForGlyph(glyph);
131 SVGGlyphElement::inheritUnspecifiedAttributes(svgGlyph, this); 138 SVGGlyphElement::inheritUnspecifiedAttributes(svgGlyph, this);
132 return svgGlyph.horizontalAdvanceX * scaleEmToUnits(fontSize, svgFontFaceEle ment->unitsPerEm()); 139 return svgGlyph.horizontalAdvanceX * scaleEmToUnits(fontSize, svgFontFaceEle ment->unitsPerEm());
133 } 140 }
134 141
135 bool SVGFontData::applySVGGlyphSelection(WidthIterator& iterator, GlyphData& gly phData, bool mirror, int currentCharacter, unsigned& advanceLength) const 142 bool SVGFontData::applySVGGlyphSelection(WidthIterator& iterator, GlyphData& gly phData, bool mirror, int currentCharacter, unsigned& advanceLength) const
(...skipping 12 matching lines...) Expand all
148 remainingTextInRun = String(run.data16(currentCharacter), run.characters Length() - currentCharacter); 155 remainingTextInRun = String(run.data16(currentCharacter), run.characters Length() - currentCharacter);
149 remainingTextInRun = Character::normalizeSpaces(remainingTextInRun.chara cters16(), remainingTextInRun.length()); 156 remainingTextInRun = Character::normalizeSpaces(remainingTextInRun.chara cters16(), remainingTextInRun.length());
150 } 157 }
151 158
152 if (mirror) 159 if (mirror)
153 remainingTextInRun = createStringWithMirroredCharacters(remainingTextInR un); 160 remainingTextInRun = createStringWithMirroredCharacters(remainingTextInR un);
154 if (!currentCharacter && arabicForms.isEmpty()) 161 if (!currentCharacter && arabicForms.isEmpty())
155 arabicForms = charactersWithArabicForm(remainingTextInRun, mirror); 162 arabicForms = charactersWithArabicForm(remainingTextInRun, mirror);
156 163
157 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 164 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
158 ASSERT(svgFontFaceElement); 165 ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument());
159 166
160 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement(); 167 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement();
161 ASSERT(associatedFontElement); 168 ASSERT(associatedFontElement);
162 169
163 RenderObject* renderObject = 0; 170 RenderObject* renderObject = 0;
164 if (TextRun::RenderingContext* renderingContext = run.renderingContext()) 171 if (TextRun::RenderingContext* renderingContext = run.renderingContext())
165 renderObject = static_cast<SVGTextRunRenderingContext*>(renderingContext )->renderer(); 172 renderObject = static_cast<SVGTextRunRenderingContext*>(renderingContext )->renderer();
166 173
167 String language; 174 String language;
168 bool isVerticalText = false; 175 bool isVerticalText = false;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 226
220 return false; 227 return false;
221 } 228 }
222 229
223 bool SVGFontData::fillSVGGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData ) const 230 bool SVGFontData::fillSVGGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData ) const
224 { 231 {
225 ASSERT(fontData->isCustomFont()); 232 ASSERT(fontData->isCustomFont());
226 ASSERT(fontData->isSVGFont()); 233 ASSERT(fontData->isSVGFont());
227 234
228 SVGFontFaceElement* fontFaceElement = this->svgFontFaceElement(); 235 SVGFontFaceElement* fontFaceElement = this->svgFontFaceElement();
229 ASSERT(fontFaceElement); 236 ASSERT(fontFaceElement && fontFaceElement->inDocument());
230 237
231 SVGFontElement* fontElement = fontFaceElement->associatedFontElement(); 238 SVGFontElement* fontElement = fontFaceElement->associatedFontElement();
232 ASSERT(fontElement); 239 ASSERT(fontElement);
233 240
234 if (bufferLength == length) 241 if (bufferLength == length)
235 return fillBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fo ntData); 242 return fillBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fo ntData);
236 243
237 ASSERT(bufferLength == 2 * length); 244 ASSERT(bufferLength == 2 * length);
238 return fillNonBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fon tData); 245 return fillNonBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fon tData);
239 } 246 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 mirroredCharacters.append(mirroredChar(character)); 317 mirroredCharacters.append(mirroredChar(character));
311 } 318 }
312 } 319 }
313 320
314 return mirroredCharacters.toString(); 321 return mirroredCharacters.toString();
315 } 322 }
316 323
317 } // namespace WebCore 324 } // namespace WebCore
318 325
319 #endif 326 #endif
OLDNEW
« no previous file with comments | « Source/core/svg/SVGDocumentExtensions.cpp ('k') | Source/core/svg/SVGFontFaceElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698