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