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

Side by Side Diff: third_party/WebKit/Source/core/layout/svg/SVGTextLayoutEngineBaseline.cpp

Issue 1404853003: Add SVG Text to support the CSS 'text-orientation' property (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: drott review Created 5 years, 2 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 return ascent * 8 / 10.f; 141 return ascent * 8 / 10.f;
142 case AB_MATHEMATICAL: 142 case AB_MATHEMATICAL:
143 return ascent / 2; 143 return ascent / 2;
144 case AB_BASELINE: 144 case AB_BASELINE:
145 default: 145 default:
146 ASSERT_NOT_REACHED(); 146 ASSERT_NOT_REACHED();
147 return 0; 147 return 0;
148 } 148 }
149 } 149 }
150 150
151 float SVGTextLayoutEngineBaseline::calculateGlyphOrientationAngle(bool isVertica lText, const SVGComputedStyle& style, const UChar32 character) const
152 {
153 switch (isVerticalText ? style.glyphOrientationVertical() : style.glyphOrien tationHorizontal()) {
154 case GO_AUTO: {
155 // Spec: Fullwidth ideographic and fullwidth Latin text will be set with a glyph-orientation of 0-degrees.
156 // Text which is not fullwidth will be set with a glyph-orientation of 9 0-degrees.
157 if (!Character::isUprightInMixedVertical(character))
158 return 90;
159
160 return 0;
161 }
162 case GO_90DEG:
163 return 90;
164 case GO_180DEG:
165 return 180;
166 case GO_270DEG:
167 return 270;
168 case GO_0DEG:
169 default:
170 return 0;
171 }
172 } 151 }
173
174 static inline bool glyphOrientationIsMultiplyOf180Degrees(float orientationAngle )
175 {
176 return !fabsf(fmodf(orientationAngle, 180));
177 }
178
179 float SVGTextLayoutEngineBaseline::calculateGlyphAdvanceAndOrientation(bool isVe rticalText, const SVGTextMetrics& metrics, float angle, float& xOrientationShift , float& yOrientationShift) const
180 {
181 bool orientationIsMultiplyOf180Degrees = glyphOrientationIsMultiplyOf180Degr ees(angle);
182
183 // The function is based on spec requirements:
184 //
185 // Spec: If the 'glyph-orientation-horizontal' results in an orientation ang le that is not a multiple of
186 // of 180 degrees, then the current text position is incremented according t o the vertical metrics of the glyph.
187 //
188 // Spec: If if the 'glyph-orientation-vertical' results in an orientation an gle that is not a multiple of
189 // 180 degrees, then the current text position is incremented according to t he horizontal metrics of the glyph.
190
191 const FontMetrics& fontMetrics = m_font.fontMetrics();
192
193 float ascent = fontMetrics.floatAscent() / m_effectiveZoom;
194 float descent = fontMetrics.floatDescent() / m_effectiveZoom;
195
196 // Vertical orientation handling.
197 if (isVerticalText) {
198 float ascentMinusDescent = ascent - descent;
199
200 if (!angle) {
201 xOrientationShift = (ascentMinusDescent - metrics.width()) / 2;
202 yOrientationShift = ascent;
203 } else if (angle == 180) {
204 xOrientationShift = (ascentMinusDescent + metrics.width()) / 2;
205 } else if (angle == 270) {
206 yOrientationShift = metrics.width();
207 xOrientationShift = ascentMinusDescent;
208 }
209
210 // Vertical advance calculation.
211 if (angle && !orientationIsMultiplyOf180Degrees)
212 return metrics.width();
213
214 return metrics.height();
215 }
216
217 // Horizontal orientation handling.
218 if (angle == 90) {
219 yOrientationShift = -metrics.width();
220 } else if (angle == 180) {
221 xOrientationShift = metrics.width();
222 yOrientationShift = -ascent;
223 } else if (angle == 270) {
224 xOrientationShift = metrics.width();
225 }
226
227 // Horizontal advance calculation.
228 if (angle && !orientationIsMultiplyOf180Degrees)
229 return metrics.height();
230
231 return metrics.width();
232 }
233
234 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698