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

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

Issue 216563002: [SVG Fonts] Fix <font-face> element leak document (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebased Created 6 years, 8 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
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 28 matching lines...) Expand all
39 #include "wtf/unicode/CharacterNames.h" 39 #include "wtf/unicode/CharacterNames.h"
40 #include "wtf/unicode/Unicode.h" 40 #include "wtf/unicode/Unicode.h"
41 41
42 using namespace WTF; 42 using namespace WTF;
43 using namespace Unicode; 43 using namespace Unicode;
44 44
45 namespace WebCore { 45 namespace WebCore {
46 46
47 SVGFontData::SVGFontData(SVGFontFaceElement* fontFaceElement) 47 SVGFontData::SVGFontData(SVGFontFaceElement* fontFaceElement)
48 : CustomFontData() 48 : CustomFontData()
49 , m_svgFontFaceElement(fontFaceElement) 49 , m_svgFontFaceElement(fontFaceElement->createWeakRef())
50 , m_horizontalOriginX(fontFaceElement->horizontalOriginX()) 50 , m_horizontalOriginX(fontFaceElement->horizontalOriginX())
51 , m_horizontalOriginY(fontFaceElement->horizontalOriginY()) 51 , m_horizontalOriginY(fontFaceElement->horizontalOriginY())
52 , m_horizontalAdvanceX(fontFaceElement->horizontalAdvanceX()) 52 , m_horizontalAdvanceX(fontFaceElement->horizontalAdvanceX())
53 , m_verticalOriginX(fontFaceElement->verticalOriginX()) 53 , m_verticalOriginX(fontFaceElement->verticalOriginX())
54 , m_verticalOriginY(fontFaceElement->verticalOriginY()) 54 , m_verticalOriginY(fontFaceElement->verticalOriginY())
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 SVGFontData::~SVGFontData()
61 {
62 }
63
60 void SVGFontData::initializeFontData(SimpleFontData* fontData, float fontSize) 64 void SVGFontData::initializeFontData(SimpleFontData* fontData, float fontSize)
61 { 65 {
62 ASSERT(fontData); 66 ASSERT(fontData);
63 67
64 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 68 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
65 ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument()); 69 RELEASE_ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument()); // F IXME: SVGFontData should be only used from the document with the SVGFontFaceElem ent.
66 70
67 SVGFontElement* svgFontElement = svgFontFaceElement->associatedFontElement() ; 71 SVGFontElement* svgFontElement = svgFontFaceElement->associatedFontElement() ;
68 ASSERT(svgFontElement); 72 ASSERT(svgFontElement);
69 GlyphData missingGlyphData; 73 GlyphData missingGlyphData;
70 missingGlyphData.fontData = fontData; 74 missingGlyphData.fontData = fontData;
71 missingGlyphData.glyph = svgFontElement->missingGlyph(); 75 missingGlyphData.glyph = svgFontElement->missingGlyph();
72 fontData->setMissingGlyphData(missingGlyphData); 76 fontData->setMissingGlyphData(missingGlyphData);
73 77
74 fontData->setZeroWidthSpaceGlyph(0); 78 fontData->setZeroWidthSpaceGlyph(0);
75 fontData->determinePitch(); 79 fontData->determinePitch();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 fontData->setAvgCharWidth(numeralZeroGlyph ? fontData->widthForGlyph(numeral ZeroGlyph) : fontData->spaceWidth()); 119 fontData->setAvgCharWidth(numeralZeroGlyph ? fontData->widthForGlyph(numeral ZeroGlyph) : fontData->spaceWidth());
116 120
117 // Estimate maximum character width. 121 // Estimate maximum character width.
118 Glyph letterWGlyph = glyphPageZero->glyphForCharacter('W'); 122 Glyph letterWGlyph = glyphPageZero->glyphForCharacter('W');
119 fontData->setMaxCharWidth(letterWGlyph ? fontData->widthForGlyph(letterWGlyp h) : ascent); 123 fontData->setMaxCharWidth(letterWGlyph ? fontData->widthForGlyph(letterWGlyp h) : ascent);
120 } 124 }
121 125
122 float SVGFontData::widthForSVGGlyph(Glyph glyph, float fontSize) const 126 float SVGFontData::widthForSVGGlyph(Glyph glyph, float fontSize) const
123 { 127 {
124 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 128 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
129
130 // FIXME: SVGFontData should be only used from the document with the SVGFont FaceElement.
125 ASSERT(svgFontFaceElement); 131 ASSERT(svgFontFaceElement);
132 if (!svgFontFaceElement)
133 return 0.0f;
134
126 // RenderView::clearSelection is invoked while removing some element, e.g. 135 // RenderView::clearSelection is invoked while removing some element, e.g.
127 // Document::nodeWillBeRemoved => FrameSelection::nodeWillBeRemoved => Rende rView::clearSelection. 136 // Document::nodeWillBeRemoved => FrameSelection::nodeWillBeRemoved => Rende rView::clearSelection.
128 // Since recalc style has not been executed yet, RenderStyle might have some reference to 137 // Since recalc style has not been executed yet, RenderStyle might have some reference to
129 // SVGFontFaceElement which was also removed. 138 // SVGFontFaceElement which was also removed.
130 // In this case, use default horizontalAdvanceX instead of associatedFontEle ment's one. 139 // In this case, use default horizontalAdvanceX instead of associatedFontEle ment's one.
131 if (!svgFontFaceElement->inDocument()) 140 if (!svgFontFaceElement->inDocument())
132 return m_horizontalAdvanceX * scaleEmToUnits(fontSize, svgFontFaceElemen t->unitsPerEm()); 141 return m_horizontalAdvanceX * scaleEmToUnits(fontSize, svgFontFaceElemen t->unitsPerEm());
133 142
134 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement(); 143 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement();
135 ASSERT(associatedFontElement); 144 ASSERT(associatedFontElement);
(...skipping 19 matching lines...) Expand all
155 remainingTextInRun = String(run.data16(currentCharacter), run.characters Length() - currentCharacter); 164 remainingTextInRun = String(run.data16(currentCharacter), run.characters Length() - currentCharacter);
156 remainingTextInRun = Character::normalizeSpaces(remainingTextInRun.chara cters16(), remainingTextInRun.length()); 165 remainingTextInRun = Character::normalizeSpaces(remainingTextInRun.chara cters16(), remainingTextInRun.length());
157 } 166 }
158 167
159 if (mirror) 168 if (mirror)
160 remainingTextInRun = createStringWithMirroredCharacters(remainingTextInR un); 169 remainingTextInRun = createStringWithMirroredCharacters(remainingTextInR un);
161 if (!currentCharacter && arabicForms.isEmpty()) 170 if (!currentCharacter && arabicForms.isEmpty())
162 arabicForms = charactersWithArabicForm(remainingTextInRun, mirror); 171 arabicForms = charactersWithArabicForm(remainingTextInRun, mirror);
163 172
164 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement(); 173 SVGFontFaceElement* svgFontFaceElement = this->svgFontFaceElement();
165 ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument()); 174 RELEASE_ASSERT(svgFontFaceElement && svgFontFaceElement->inDocument()); // F IXME: SVGFontData should be only used from the document with the SVGFontFaceElem ent.
166 175
167 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement(); 176 SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontEl ement();
168 ASSERT(associatedFontElement); 177 ASSERT(associatedFontElement);
169 178
170 RenderObject* renderObject = 0; 179 RenderObject* renderObject = 0;
171 if (TextRun::RenderingContext* renderingContext = run.renderingContext()) 180 if (TextRun::RenderingContext* renderingContext = run.renderingContext())
172 renderObject = static_cast<SVGTextRunRenderingContext*>(renderingContext )->renderer(); 181 renderObject = static_cast<SVGTextRunRenderingContext*>(renderingContext )->renderer();
173 182
174 String language; 183 String language;
175 bool isVerticalText = false; 184 bool isVerticalText = false;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 235
227 return false; 236 return false;
228 } 237 }
229 238
230 bool SVGFontData::fillSVGGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData ) const 239 bool SVGFontData::fillSVGGlyphPage(GlyphPage* pageToFill, unsigned offset, unsig ned length, UChar* buffer, unsigned bufferLength, const SimpleFontData* fontData ) const
231 { 240 {
232 ASSERT(fontData->isCustomFont()); 241 ASSERT(fontData->isCustomFont());
233 ASSERT(fontData->isSVGFont()); 242 ASSERT(fontData->isSVGFont());
234 243
235 SVGFontFaceElement* fontFaceElement = this->svgFontFaceElement(); 244 SVGFontFaceElement* fontFaceElement = this->svgFontFaceElement();
236 ASSERT(fontFaceElement && fontFaceElement->inDocument()); 245 RELEASE_ASSERT(fontFaceElement && fontFaceElement->inDocument()); // FIXME: SVGFontData should be only used from the document with the SVGFontFaceElement.
237 246
238 SVGFontElement* fontElement = fontFaceElement->associatedFontElement(); 247 SVGFontElement* fontElement = fontFaceElement->associatedFontElement();
239 ASSERT(fontElement); 248 ASSERT(fontElement);
240 249
241 if (bufferLength == length) 250 if (bufferLength == length)
242 return fillBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fo ntData); 251 return fillBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fo ntData);
243 252
244 ASSERT(bufferLength == 2 * length); 253 ASSERT(bufferLength == 2 * length);
245 return fillNonBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fon tData); 254 return fillNonBMPGlyphs(fontElement, pageToFill, offset, length, buffer, fon tData);
246 } 255 }
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 mirroredCharacters.append(mirroredChar(character)); 326 mirroredCharacters.append(mirroredChar(character));
318 } 327 }
319 } 328 }
320 329
321 return mirroredCharacters.toString(); 330 return mirroredCharacters.toString();
322 } 331 }
323 332
324 } // namespace WebCore 333 } // namespace WebCore
325 334
326 #endif 335 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698