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

Side by Side Diff: Source/core/rendering/svg/SVGTextRunRenderingContext.cpp

Issue 565063003: Eliminate SVGTextRunRenderingContext::m_activePaintingResource (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase. Created 6 years, 3 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/rendering/svg/SVGTextRunRenderingContext.h ('k') | no next file » | 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) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 3 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
4 * 4 *
5 * This library is free software; you can redistribute it and/or 5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public 6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either 7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version. 8 * version 2 of the License, or (at your option) any later version.
9 * 9 *
10 * This library is distributed in the hope that it will be useful, 10 * This library is distributed in the hope that it will be useful,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 return renderer->isText() ? renderer->parent() : renderer; 63 return renderer->isText() ? renderer->parent() : renderer;
64 } 64 }
65 65
66 static inline RenderObject* renderObjectFromRun(const TextRun& run) 66 static inline RenderObject* renderObjectFromRun(const TextRun& run)
67 { 67 {
68 if (TextRun::RenderingContext* renderingContext = run.renderingContext()) 68 if (TextRun::RenderingContext* renderingContext = run.renderingContext())
69 return static_cast<SVGTextRunRenderingContext*>(renderingContext)->rende rer(); 69 return static_cast<SVGTextRunRenderingContext*>(renderingContext)->rende rer();
70 return 0; 70 return 0;
71 } 71 }
72 72
73 static inline RenderSVGResource* activePaintingResourceFromRun(const TextRun& ru n)
74 {
75 if (TextRun::RenderingContext* renderingContext = run.renderingContext())
76 return static_cast<SVGTextRunRenderingContext*>(renderingContext)->activ ePaintingResource();
77 return 0;
78 }
79
80 float SVGTextRunRenderingContext::floatWidthUsingSVGFont(const Font& font, const TextRun& run, int& charsConsumed, Glyph& glyphId) const 73 float SVGTextRunRenderingContext::floatWidthUsingSVGFont(const Font& font, const TextRun& run, int& charsConsumed, Glyph& glyphId) const
81 { 74 {
82 WidthIterator it(&font, run); 75 WidthIterator it(&font, run);
83 GlyphBuffer glyphBuffer; 76 GlyphBuffer glyphBuffer;
84 charsConsumed += it.advance(run.length(), &glyphBuffer); 77 charsConsumed += it.advance(run.length(), &glyphBuffer);
85 glyphId = !glyphBuffer.isEmpty() ? glyphBuffer.glyphAt(0) : 0; 78 glyphId = !glyphBuffer.isEmpty() ? glyphBuffer.glyphAt(0) : 0;
86 return it.runWidthSoFar(); 79 return it.runWidthSoFar();
87 } 80 }
88 81
89 void SVGTextRunRenderingContext::drawSVGGlyphs(GraphicsContext* context, const T extRun& run, const SimpleFontData* fontData, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point) const 82 void SVGTextRunRenderingContext::drawSVGGlyphs(GraphicsContext* context, const T extRun& run, const SimpleFontData* fontData, const GlyphBuffer& glyphBuffer, int from, int numGlyphs, const FloatPoint& point) const
90 { 83 {
91 SVGFontElement* fontElement = 0; 84 SVGFontElement* fontElement = 0;
92 SVGFontFaceElement* fontFaceElement = 0; 85 SVGFontFaceElement* fontFaceElement = 0;
93 86
94 const SVGFontData* svgFontData = svgFontAndFontFaceElementForFontData(fontDa ta, fontFaceElement, fontElement); 87 const SVGFontData* svgFontData = svgFontAndFontFaceElementForFontData(fontDa ta, fontFaceElement, fontElement);
95 if (!fontElement || !fontFaceElement) 88 if (!fontElement || !fontFaceElement)
96 return; 89 return;
97 90
98 // We can only paint SVGFonts if a context is available. 91 // We can only paint SVGFonts if a context is available.
99 RenderSVGResource* activePaintingResource = activePaintingResourceFromRun(ru n);
100 RenderObject* renderObject = renderObjectFromRun(run); 92 RenderObject* renderObject = renderObjectFromRun(run);
101 RenderObject* parentRenderObject = firstParentRendererForNonTextNode(renderO bject);
102 RenderStyle* parentRenderObjectStyle = 0;
103
104 ASSERT(renderObject); 93 ASSERT(renderObject);
105 if (!activePaintingResource) {
106 // TODO: We're only supporting simple filled HTML text so far.
107 RenderSVGResourceSolidColor* solidPaintingResource = RenderSVGResource:: sharedSolidPaintingResource();
108 solidPaintingResource->setColor(context->fillColor());
109 activePaintingResource = solidPaintingResource;
110 }
111 94
112 bool isVerticalText = false; 95 bool isVerticalText = false;
113 if (parentRenderObject) { 96 if (RenderObject* parentRenderObject = firstParentRendererForNonTextNode(ren derObject)) {
114 parentRenderObjectStyle = parentRenderObject->style(); 97 RenderStyle* parentRenderObjectStyle = parentRenderObject->style();
115 ASSERT(parentRenderObjectStyle); 98 ASSERT(parentRenderObjectStyle);
116 isVerticalText = parentRenderObjectStyle->svgStyle().isVerticalWritingMo de(); 99 isVerticalText = parentRenderObjectStyle->svgStyle().isVerticalWritingMo de();
117 } 100 }
118 101
119 float scale = scaleEmToUnits(fontData->platformData().size(), fontFaceElemen t->unitsPerEm()); 102 float scale = scaleEmToUnits(fontData->platformData().size(), fontFaceElemen t->unitsPerEm());
120 ASSERT(activePaintingResource);
121 103
122 FloatPoint glyphOrigin; 104 FloatPoint glyphOrigin;
123 glyphOrigin.setX(svgFontData->horizontalOriginX() * scale); 105 glyphOrigin.setX(svgFontData->horizontalOriginX() * scale);
124 glyphOrigin.setY(svgFontData->horizontalOriginY() * scale); 106 glyphOrigin.setY(svgFontData->horizontalOriginY() * scale);
125 107
126 unsigned short resourceMode = context->textDrawingMode() == TextModeStroke ? ApplyToStrokeMode : ApplyToFillMode; 108 unsigned short resourceMode = context->textDrawingMode() == TextModeStroke ? ApplyToStrokeMode : ApplyToFillMode;
127 // From a resource perspective this ought to be treated as "text mode".
128 resourceMode |= ApplyToTextMode;
129 109
130 FloatPoint currentPoint = point; 110 FloatPoint currentPoint = point;
131 for (int i = 0; i < numGlyphs; ++i) { 111 for (int i = 0; i < numGlyphs; ++i) {
132 Glyph glyph = glyphBuffer.glyphAt(from + i); 112 Glyph glyph = glyphBuffer.glyphAt(from + i);
133 if (!glyph) 113 if (!glyph)
134 continue; 114 continue;
135 115
136 float advance = glyphBuffer.advanceAt(from + i).width(); 116 float advance = glyphBuffer.advanceAt(from + i).width();
137 SVGGlyph svgGlyph = fontElement->svgGlyphForGlyph(glyph); 117 SVGGlyph svgGlyph = fontElement->svgGlyphForGlyph(glyph);
138 ASSERT(!svgGlyph.isPartOfLigature); 118 ASSERT(!svgGlyph.isPartOfLigature);
(...skipping 15 matching lines...) Expand all
154 glyphOrigin.setY(svgGlyph.verticalOriginY * scale); 134 glyphOrigin.setY(svgGlyph.verticalOriginY * scale);
155 } 135 }
156 136
157 AffineTransform glyphPathTransform; 137 AffineTransform glyphPathTransform;
158 glyphPathTransform.translate(currentPoint.x() + glyphOrigin.x(), current Point.y() + glyphOrigin.y()); 138 glyphPathTransform.translate(currentPoint.x() + glyphOrigin.x(), current Point.y() + glyphOrigin.y());
159 glyphPathTransform.scale(scale, -scale); 139 glyphPathTransform.scale(scale, -scale);
160 140
161 Path glyphPath = svgGlyph.pathData; 141 Path glyphPath = svgGlyph.pathData;
162 glyphPath.transform(glyphPathTransform); 142 glyphPath.transform(glyphPathTransform);
163 143
164 if (activePaintingResource->applyResource(parentRenderObject, parentRend erObjectStyle, context, resourceMode)) { 144 SVGRenderSupport::fillOrStrokePath(context, resourceMode, glyphPath);
165 float strokeThickness = context->strokeThickness();
166 if (renderObject && renderObject->isSVGInlineText())
167 context->setStrokeThickness(strokeThickness * toRenderSVGInlineT ext(renderObject)->scalingFactor());
168 SVGRenderSupport::fillOrStrokePath(context, resourceMode, glyphPath) ;
169 activePaintingResource->postApplyResource(parentRenderObject, contex t);
170 context->setStrokeThickness(strokeThickness);
171 }
172 145
173 if (isVerticalText) 146 if (isVerticalText)
174 currentPoint.move(0, advance); 147 currentPoint.move(0, advance);
175 else 148 else
176 currentPoint.move(advance, 0); 149 currentPoint.move(advance, 0);
177 } 150 }
178 } 151 }
179 152
180 GlyphData SVGTextRunRenderingContext::glyphDataForCharacter(const Font& font, co nst TextRun& run, WidthIterator& iterator, UChar32 character, bool mirror, int c urrentCharacter, unsigned& advanceLength) 153 GlyphData SVGTextRunRenderingContext::glyphDataForCharacter(const Font& font, co nst TextRun& run, WidthIterator& iterator, UChar32 character, bool mirror, int c urrentCharacter, unsigned& advanceLength)
181 { 154 {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 // Restore original state of the SVG Font glyph table and the current font f allback list, 220 // Restore original state of the SVG Font glyph table and the current font f allback list,
248 // to assure the next lookup of the same glyph won't immediately return the fallback glyph. 221 // to assure the next lookup of the same glyph won't immediately return the fallback glyph.
249 page->setGlyphDataForCharacter(character, glyphData.glyph, originalFontData) ; 222 page->setGlyphDataForCharacter(character, glyphData.glyph, originalFontData) ;
250 ASSERT(fallbackGlyphData.fontData); 223 ASSERT(fallbackGlyphData.fontData);
251 return fallbackGlyphData; 224 return fallbackGlyphData;
252 } 225 }
253 226
254 } 227 }
255 228
256 #endif 229 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/svg/SVGTextRunRenderingContext.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698