OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <climits> | 10 #include <climits> |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/i18n/break_iterator.h" | 13 #include "base/i18n/break_iterator.h" |
14 #include "base/logging.h" | 14 #include "base/logging.h" |
15 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
18 #include "base/trace_event/trace_event.h" | 18 #include "base/trace_event/trace_event.h" |
19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
| 20 #include "cc/paint/paint_canvas.h" |
| 21 #include "cc/paint/paint_shader.h" |
20 #include "third_party/icu/source/common/unicode/rbbi.h" | 22 #include "third_party/icu/source/common/unicode/rbbi.h" |
21 #include "third_party/icu/source/common/unicode/utf16.h" | 23 #include "third_party/icu/source/common/unicode/utf16.h" |
22 #include "third_party/skia/include/core/SkDrawLooper.h" | 24 #include "third_party/skia/include/core/SkDrawLooper.h" |
23 #include "third_party/skia/include/core/SkFontStyle.h" | 25 #include "third_party/skia/include/core/SkFontStyle.h" |
24 #include "third_party/skia/include/core/SkTypeface.h" | 26 #include "third_party/skia/include/core/SkTypeface.h" |
25 #include "third_party/skia/include/effects/SkGradientShader.h" | 27 #include "third_party/skia/include/effects/SkGradientShader.h" |
26 #include "third_party/skia/include/effects/SkMorphologyImageFilter.h" | 28 #include "third_party/skia/include/effects/SkMorphologyImageFilter.h" |
27 #include "ui/gfx/canvas.h" | 29 #include "ui/gfx/canvas.h" |
28 #include "ui/gfx/geometry/insets.h" | 30 #include "ui/gfx/geometry/insets.h" |
29 #include "ui/gfx/geometry/safe_integer_conversions.h" | 31 #include "ui/gfx/geometry/safe_integer_conversions.h" |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 } | 166 } |
165 | 167 |
166 const SkPoint points[2] = { PointToSkPoint(text_rect.origin()), | 168 const SkPoint points[2] = { PointToSkPoint(text_rect.origin()), |
167 PointToSkPoint(text_rect.top_right()) }; | 169 PointToSkPoint(text_rect.top_right()) }; |
168 return | 170 return |
169 SkGradientShader::MakeLinear(&points[0], &colors[0], &positions[0], | 171 SkGradientShader::MakeLinear(&points[0], &colors[0], &positions[0], |
170 colors.size(), SkShader::kClamp_TileMode); | 172 colors.size(), SkShader::kClamp_TileMode); |
171 } | 173 } |
172 | 174 |
173 // Converts a FontRenderParams::Hinting value to the corresponding | 175 // Converts a FontRenderParams::Hinting value to the corresponding |
174 // SkPaint::Hinting value. | 176 // cc::PaintFlags::Hinting value. |
175 SkPaint::Hinting FontRenderParamsHintingToSkPaintHinting( | 177 cc::PaintFlags::Hinting FontRenderParamsHintingToPaintFlagsHinting( |
176 FontRenderParams::Hinting params_hinting) { | 178 FontRenderParams::Hinting params_hinting) { |
177 switch (params_hinting) { | 179 switch (params_hinting) { |
178 case FontRenderParams::HINTING_NONE: return SkPaint::kNo_Hinting; | 180 case FontRenderParams::HINTING_NONE: |
179 case FontRenderParams::HINTING_SLIGHT: return SkPaint::kSlight_Hinting; | 181 return cc::PaintFlags::kNo_Hinting; |
180 case FontRenderParams::HINTING_MEDIUM: return SkPaint::kNormal_Hinting; | 182 case FontRenderParams::HINTING_SLIGHT: |
181 case FontRenderParams::HINTING_FULL: return SkPaint::kFull_Hinting; | 183 return cc::PaintFlags::kSlight_Hinting; |
| 184 case FontRenderParams::HINTING_MEDIUM: |
| 185 return cc::PaintFlags::kNormal_Hinting; |
| 186 case FontRenderParams::HINTING_FULL: |
| 187 return cc::PaintFlags::kFull_Hinting; |
182 } | 188 } |
183 return SkPaint::kNo_Hinting; | 189 return cc::PaintFlags::kNo_Hinting; |
184 } | 190 } |
185 | 191 |
186 // Make sure ranges don't break text graphemes. If a range in |break_list| | 192 // Make sure ranges don't break text graphemes. If a range in |break_list| |
187 // does break a grapheme in |render_text|, the range will be slightly | 193 // does break a grapheme in |render_text|, the range will be slightly |
188 // extended to encompass the grapheme. | 194 // extended to encompass the grapheme. |
189 template <typename T> | 195 template <typename T> |
190 void RestoreBreakList(RenderText* render_text, BreakList<T>* break_list) { | 196 void RestoreBreakList(RenderText* render_text, BreakList<T>* break_list) { |
191 break_list->SetMax(render_text->text().length()); | 197 break_list->SetMax(render_text->text().length()); |
192 Range range; | 198 Range range; |
193 while (range.end() < break_list->max()) { | 199 while (range.end() < break_list->max()) { |
(...skipping 15 matching lines...) Expand all Loading... |
209 // Value of |underline_thickness_| that indicates that underline metrics have | 215 // Value of |underline_thickness_| that indicates that underline metrics have |
210 // not been set explicitly. | 216 // not been set explicitly. |
211 const SkScalar kUnderlineMetricsNotSet = -1.0f; | 217 const SkScalar kUnderlineMetricsNotSet = -1.0f; |
212 | 218 |
213 SkiaTextRenderer::SkiaTextRenderer(Canvas* canvas) | 219 SkiaTextRenderer::SkiaTextRenderer(Canvas* canvas) |
214 : canvas_(canvas), | 220 : canvas_(canvas), |
215 canvas_skia_(canvas->sk_canvas()), | 221 canvas_skia_(canvas->sk_canvas()), |
216 underline_thickness_(kUnderlineMetricsNotSet), | 222 underline_thickness_(kUnderlineMetricsNotSet), |
217 underline_position_(0.0f) { | 223 underline_position_(0.0f) { |
218 DCHECK(canvas_skia_); | 224 DCHECK(canvas_skia_); |
219 paint_.setTextEncoding(SkPaint::kGlyphID_TextEncoding); | 225 paint_.setTextEncoding(cc::PaintFlags::kGlyphID_TextEncoding); |
220 paint_.setStyle(SkPaint::kFill_Style); | 226 paint_.setStyle(cc::PaintFlags::kFill_Style); |
221 paint_.setAntiAlias(true); | 227 paint_.setAntiAlias(true); |
222 paint_.setSubpixelText(true); | 228 paint_.setSubpixelText(true); |
223 paint_.setLCDRenderText(true); | 229 paint_.setLCDRenderText(true); |
224 paint_.setHinting(SkPaint::kNormal_Hinting); | 230 paint_.setHinting(cc::PaintFlags::kNormal_Hinting); |
225 } | 231 } |
226 | 232 |
227 SkiaTextRenderer::~SkiaTextRenderer() { | 233 SkiaTextRenderer::~SkiaTextRenderer() { |
228 } | 234 } |
229 | 235 |
230 void SkiaTextRenderer::SetDrawLooper(sk_sp<SkDrawLooper> draw_looper) { | 236 void SkiaTextRenderer::SetDrawLooper(sk_sp<SkDrawLooper> draw_looper) { |
231 paint_.setLooper(std::move(draw_looper)); | 237 paint_.setLooper(std::move(draw_looper)); |
232 } | 238 } |
233 | 239 |
234 void SkiaTextRenderer::SetFontRenderParams(const FontRenderParams& params, | 240 void SkiaTextRenderer::SetFontRenderParams(const FontRenderParams& params, |
235 bool subpixel_rendering_suppressed) { | 241 bool subpixel_rendering_suppressed) { |
236 ApplyRenderParams(params, subpixel_rendering_suppressed, &paint_); | 242 ApplyRenderParams(params, subpixel_rendering_suppressed, &paint_); |
237 } | 243 } |
238 | 244 |
239 void SkiaTextRenderer::SetTypeface(sk_sp<SkTypeface> typeface) { | 245 void SkiaTextRenderer::SetTypeface(sk_sp<SkTypeface> typeface) { |
240 paint_.setTypeface(std::move(typeface)); | 246 paint_.setTypeface(std::move(typeface)); |
241 } | 247 } |
242 | 248 |
243 void SkiaTextRenderer::SetTextSize(SkScalar size) { | 249 void SkiaTextRenderer::SetTextSize(SkScalar size) { |
244 paint_.setTextSize(size); | 250 paint_.setTextSize(size); |
245 } | 251 } |
246 | 252 |
247 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) { | 253 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) { |
248 paint_.setColor(foreground); | 254 paint_.setColor(foreground); |
249 } | 255 } |
250 | 256 |
251 void SkiaTextRenderer::SetShader(sk_sp<SkShader> shader) { | 257 void SkiaTextRenderer::SetShader(sk_sp<SkShader> shader) { |
252 paint_.setShader(std::move(shader)); | 258 paint_.setShader(cc::WrapSkShader(std::move(shader))); |
253 } | 259 } |
254 | 260 |
255 void SkiaTextRenderer::SetHaloEffect() { | 261 void SkiaTextRenderer::SetHaloEffect() { |
256 paint_.setImageFilter(SkDilateImageFilter::Make(1, 1, nullptr)); | 262 paint_.setImageFilter(SkDilateImageFilter::Make(1, 1, nullptr)); |
257 } | 263 } |
258 | 264 |
259 void SkiaTextRenderer::SetUnderlineMetrics(SkScalar thickness, | 265 void SkiaTextRenderer::SetUnderlineMetrics(SkScalar thickness, |
260 SkScalar position) { | 266 SkScalar position) { |
261 underline_thickness_ = thickness; | 267 underline_thickness_ = thickness; |
262 underline_position_ = position; | 268 underline_position_ = position; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 const SkScalar height = SkScalarMul(text_size, kLineThickness); | 315 const SkScalar height = SkScalarMul(text_size, kLineThickness); |
310 const SkScalar offset = SkScalarMulAdd(text_size, kStrikeThroughOffset, y); | 316 const SkScalar offset = SkScalarMulAdd(text_size, kStrikeThroughOffset, y); |
311 SkScalar x_scalar = SkIntToScalar(x); | 317 SkScalar x_scalar = SkIntToScalar(x); |
312 const SkRect r = | 318 const SkRect r = |
313 SkRect::MakeLTRB(x_scalar, offset, x_scalar + width, offset + height); | 319 SkRect::MakeLTRB(x_scalar, offset, x_scalar + width, offset + height); |
314 canvas_skia_->drawRect(r, paint_); | 320 canvas_skia_->drawRect(r, paint_); |
315 } | 321 } |
316 | 322 |
317 SkiaTextRenderer::DiagonalStrike::DiagonalStrike(Canvas* canvas, | 323 SkiaTextRenderer::DiagonalStrike::DiagonalStrike(Canvas* canvas, |
318 Point start, | 324 Point start, |
319 const SkPaint& paint) | 325 const cc::PaintFlags& paint) |
320 : canvas_(canvas), | 326 : canvas_(canvas), start_(start), paint_(paint), total_length_(0) {} |
321 start_(start), | |
322 paint_(paint), | |
323 total_length_(0) { | |
324 } | |
325 | 327 |
326 SkiaTextRenderer::DiagonalStrike::~DiagonalStrike() { | 328 SkiaTextRenderer::DiagonalStrike::~DiagonalStrike() { |
327 } | 329 } |
328 | 330 |
329 void SkiaTextRenderer::DiagonalStrike::AddPiece(int length, SkColor color) { | 331 void SkiaTextRenderer::DiagonalStrike::AddPiece(int length, SkColor color) { |
330 pieces_.push_back(Piece(length, color)); | 332 pieces_.push_back(Piece(length, color)); |
331 total_length_ += length; | 333 total_length_ += length; |
332 } | 334 } |
333 | 335 |
334 void SkiaTextRenderer::DiagonalStrike::Draw() { | 336 void SkiaTextRenderer::DiagonalStrike::Draw() { |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 LineSegment::~LineSegment() {} | 405 LineSegment::~LineSegment() {} |
404 | 406 |
405 Line::Line() : preceding_heights(0), baseline(0) {} | 407 Line::Line() : preceding_heights(0), baseline(0) {} |
406 | 408 |
407 Line::Line(const Line& other) = default; | 409 Line::Line(const Line& other) = default; |
408 | 410 |
409 Line::~Line() {} | 411 Line::~Line() {} |
410 | 412 |
411 void ApplyRenderParams(const FontRenderParams& params, | 413 void ApplyRenderParams(const FontRenderParams& params, |
412 bool subpixel_rendering_suppressed, | 414 bool subpixel_rendering_suppressed, |
413 SkPaint* paint) { | 415 cc::PaintFlags* paint) { |
414 paint->setAntiAlias(params.antialiasing); | 416 paint->setAntiAlias(params.antialiasing); |
415 paint->setLCDRenderText(!subpixel_rendering_suppressed && | 417 paint->setLCDRenderText(!subpixel_rendering_suppressed && |
416 params.subpixel_rendering != FontRenderParams::SUBPIXEL_RENDERING_NONE); | 418 params.subpixel_rendering != FontRenderParams::SUBPIXEL_RENDERING_NONE); |
417 paint->setSubpixelText(params.subpixel_positioning); | 419 paint->setSubpixelText(params.subpixel_positioning); |
418 paint->setAutohinted(params.autohinter); | 420 paint->setAutohinted(params.autohinter); |
419 paint->setHinting(FontRenderParamsHintingToSkPaintHinting(params.hinting)); | 421 paint->setHinting(FontRenderParamsHintingToPaintFlagsHinting(params.hinting)); |
420 } | 422 } |
421 | 423 |
422 } // namespace internal | 424 } // namespace internal |
423 | 425 |
424 // static | 426 // static |
425 constexpr base::char16 RenderText::kPasswordReplacementChar; | 427 constexpr base::char16 RenderText::kPasswordReplacementChar; |
426 constexpr bool RenderText::kDragToEndIfOutsideVerticalBounds; | 428 constexpr bool RenderText::kDragToEndIfOutsideVerticalBounds; |
427 | 429 |
428 RenderText::~RenderText() { | 430 RenderText::~RenderText() { |
429 } | 431 } |
(...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 | 1712 |
1711 for (; range_max < length; ++range_max) | 1713 for (; range_max < length; ++range_max) |
1712 if (iter.IsEndOfWord(range_max) || iter.IsStartOfWord(range_max)) | 1714 if (iter.IsEndOfWord(range_max) || iter.IsStartOfWord(range_max)) |
1713 break; | 1715 break; |
1714 | 1716 |
1715 return range.is_reversed() ? Range(range_max, range_min) | 1717 return range.is_reversed() ? Range(range_max, range_min) |
1716 : Range(range_min, range_max); | 1718 : Range(range_min, range_max); |
1717 } | 1719 } |
1718 | 1720 |
1719 } // namespace gfx | 1721 } // namespace gfx |
OLD | NEW |