| 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 |