| 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 "skia/ext/cdl_canvas.h" |
| 21 #include "skia/ext/cdl_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 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 // SkPaint::Hinting value. |
| 175 SkPaint::Hinting FontRenderParamsHintingToSkPaintHinting( | 177 CdlPaint::Hinting FontRenderParamsHintingToSkPaintHinting( |
| 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 CdlPaint::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 CdlPaint::kSlight_Hinting; |
| 184 case FontRenderParams::HINTING_MEDIUM: |
| 185 return CdlPaint::kNormal_Hinting; |
| 186 case FontRenderParams::HINTING_FULL: |
| 187 return CdlPaint::kFull_Hinting; |
| 182 } | 188 } |
| 183 return SkPaint::kNo_Hinting; | 189 return CdlPaint::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(CdlPaint::kGlyphID_TextEncoding); |
| 220 paint_.setStyle(SkPaint::kFill_Style); | 226 paint_.setStyle(CdlPaint::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(CdlPaint::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(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 27 matching lines...) Expand all Loading... |
| 290 diagonal_.reset(); | 296 diagonal_.reset(); |
| 291 } | 297 } |
| 292 } | 298 } |
| 293 | 299 |
| 294 void SkiaTextRenderer::DrawUnderline(int x, int y, int width) { | 300 void SkiaTextRenderer::DrawUnderline(int x, int y, int width) { |
| 295 SkScalar x_scalar = SkIntToScalar(x); | 301 SkScalar x_scalar = SkIntToScalar(x); |
| 296 SkRect r = SkRect::MakeLTRB( | 302 SkRect r = SkRect::MakeLTRB( |
| 297 x_scalar, y + underline_position_, x_scalar + width, | 303 x_scalar, y + underline_position_, x_scalar + width, |
| 298 y + underline_position_ + underline_thickness_); | 304 y + underline_position_ + underline_thickness_); |
| 299 if (underline_thickness_ == kUnderlineMetricsNotSet) { | 305 if (underline_thickness_ == kUnderlineMetricsNotSet) { |
| 300 const SkScalar text_size = paint_.getTextSize(); | 306 const SkScalar text_size = ToSkPaint(paint_).getTextSize(); |
| 301 r.fTop = SkScalarMulAdd(text_size, kUnderlineOffset, y); | 307 r.fTop = SkScalarMulAdd(text_size, kUnderlineOffset, y); |
| 302 r.fBottom = r.fTop + SkScalarMul(text_size, kLineThickness); | 308 r.fBottom = r.fTop + SkScalarMul(text_size, kLineThickness); |
| 303 } | 309 } |
| 304 canvas_skia_->drawRect(r, paint_); | 310 canvas_skia_->drawRect(r, paint_); |
| 305 } | 311 } |
| 306 | 312 |
| 307 void SkiaTextRenderer::DrawStrike(int x, int y, int width) const { | 313 void SkiaTextRenderer::DrawStrike(int x, int y, int width) const { |
| 308 const SkScalar text_size = paint_.getTextSize(); | 314 const SkScalar text_size = ToSkPaint(paint_).getTextSize(); |
| 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 CdlPaint& 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 CdlPaint* 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(FontRenderParamsHintingToSkPaintHinting(params.hinting)); |
| 420 } | 422 } |
| 421 | 423 |
| 422 } // namespace internal | 424 } // namespace internal |
| 423 | 425 |
| (...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1688 | 1690 |
| 1689 for (; range_max < length; ++range_max) | 1691 for (; range_max < length; ++range_max) |
| 1690 if (iter.IsEndOfWord(range_max) || iter.IsStartOfWord(range_max)) | 1692 if (iter.IsEndOfWord(range_max) || iter.IsStartOfWord(range_max)) |
| 1691 break; | 1693 break; |
| 1692 | 1694 |
| 1693 return range.is_reversed() ? Range(range_max, range_min) | 1695 return range.is_reversed() ? Range(range_max, range_min) |
| 1694 : Range(range_min, range_max); | 1696 : Range(range_min, range_max); |
| 1695 } | 1697 } |
| 1696 | 1698 |
| 1697 } // namespace gfx | 1699 } // namespace gfx |
| OLD | NEW |