| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/i18n/break_iterator.h" | 9 #include "base/i18n/break_iterator.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 colors->push_back(c0); | 136 colors->push_back(c0); |
| 137 } | 137 } |
| 138 positions->push_back(p0); | 138 positions->push_back(p0); |
| 139 colors->push_back(c0); | 139 colors->push_back(c0); |
| 140 positions->push_back(p1); | 140 positions->push_back(p1); |
| 141 colors->push_back(c1); | 141 colors->push_back(c1); |
| 142 } | 142 } |
| 143 | 143 |
| 144 // Creates a SkShader to fade the text, with |left_part| specifying the left | 144 // Creates a SkShader to fade the text, with |left_part| specifying the left |
| 145 // fade effect, if any, and |right_part| specifying the right fade effect. | 145 // fade effect, if any, and |right_part| specifying the right fade effect. |
| 146 SkShader* CreateFadeShader(const gfx::Rect& text_rect, | 146 skia::RefPtr<SkShader> CreateFadeShader(const gfx::Rect& text_rect, |
| 147 const gfx::Rect& left_part, | 147 const gfx::Rect& left_part, |
| 148 const gfx::Rect& right_part, | 148 const gfx::Rect& right_part, |
| 149 SkColor color) { | 149 SkColor color) { |
| 150 // Fade alpha of 51/255 corresponds to a fade of 0.2 of the original color. | 150 // Fade alpha of 51/255 corresponds to a fade of 0.2 of the original color. |
| 151 const SkColor fade_color = SkColorSetA(color, 51); | 151 const SkColor fade_color = SkColorSetA(color, 51); |
| 152 std::vector<SkScalar> positions; | 152 std::vector<SkScalar> positions; |
| 153 std::vector<SkColor> colors; | 153 std::vector<SkColor> colors; |
| 154 | 154 |
| 155 if (!left_part.IsEmpty()) | 155 if (!left_part.IsEmpty()) |
| 156 AddFadeEffect(text_rect, left_part, fade_color, color, | 156 AddFadeEffect(text_rect, left_part, fade_color, color, |
| 157 &positions, &colors); | 157 &positions, &colors); |
| 158 if (!right_part.IsEmpty()) | 158 if (!right_part.IsEmpty()) |
| 159 AddFadeEffect(text_rect, right_part, color, fade_color, | 159 AddFadeEffect(text_rect, right_part, color, fade_color, |
| 160 &positions, &colors); | 160 &positions, &colors); |
| 161 DCHECK(!positions.empty()); | 161 DCHECK(!positions.empty()); |
| 162 | 162 |
| 163 // Terminate |positions| with 1.0, as required by Skia. | 163 // Terminate |positions| with 1.0, as required by Skia. |
| 164 if (positions.back() != 1.0) { | 164 if (positions.back() != 1.0) { |
| 165 positions.push_back(1.0); | 165 positions.push_back(1.0); |
| 166 colors.push_back(colors.back()); | 166 colors.push_back(colors.back()); |
| 167 } | 167 } |
| 168 | 168 |
| 169 SkPoint points[2]; | 169 SkPoint points[2]; |
| 170 points[0].iset(text_rect.x(), text_rect.y()); | 170 points[0].iset(text_rect.x(), text_rect.y()); |
| 171 points[1].iset(text_rect.right(), text_rect.y()); | 171 points[1].iset(text_rect.right(), text_rect.y()); |
| 172 | 172 |
| 173 return SkGradientShader::CreateLinear(&points[0], &colors[0], &positions[0], | 173 return skia::AdoptRef( |
| 174 colors.size(), SkShader::kClamp_TileMode); | 174 SkGradientShader::CreateLinear(&points[0], &colors[0], &positions[0], |
| 175 colors.size(), SkShader::kClamp_TileMode)); |
| 175 } | 176 } |
| 176 | 177 |
| 177 } // namespace | 178 } // namespace |
| 178 | 179 |
| 179 namespace gfx { | 180 namespace gfx { |
| 180 | 181 |
| 181 namespace internal { | 182 namespace internal { |
| 182 | 183 |
| 183 // Value of |underline_thickness_| that indicates that underline metrics have | 184 // Value of |underline_thickness_| that indicates that underline metrics have |
| 184 // not been set explicitly. | 185 // not been set explicitly. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 | 231 |
| 231 void SkiaTextRenderer::SetTextSize(SkScalar size) { | 232 void SkiaTextRenderer::SetTextSize(SkScalar size) { |
| 232 paint_.setTextSize(size); | 233 paint_.setTextSize(size); |
| 233 } | 234 } |
| 234 | 235 |
| 235 void SkiaTextRenderer::SetFontFamilyWithStyle(const std::string& family, | 236 void SkiaTextRenderer::SetFontFamilyWithStyle(const std::string& family, |
| 236 int style) { | 237 int style) { |
| 237 DCHECK(!family.empty()); | 238 DCHECK(!family.empty()); |
| 238 | 239 |
| 239 SkTypeface::Style skia_style = ConvertFontStyleToSkiaTypefaceStyle(style); | 240 SkTypeface::Style skia_style = ConvertFontStyleToSkiaTypefaceStyle(style); |
| 240 SkTypeface* typeface = SkTypeface::CreateFromName(family.c_str(), skia_style); | 241 skia::RefPtr<SkTypeface> typeface = |
| 241 SkAutoUnref auto_unref(typeface); | 242 skia::AdoptRef(SkTypeface::CreateFromName(family.c_str(), skia_style)); |
| 242 if (typeface) { | 243 if (typeface) { |
| 243 // |paint_| adds its own ref. So don't |release()| it from the ref ptr here. | 244 // |paint_| adds its own ref. So don't |release()| it from the ref ptr here. |
| 244 SetTypeface(typeface); | 245 SetTypeface(typeface.get()); |
| 245 | 246 |
| 246 // Enable fake bold text if bold style is needed but new typeface does not | 247 // Enable fake bold text if bold style is needed but new typeface does not |
| 247 // have it. | 248 // have it. |
| 248 paint_.setFakeBoldText((skia_style & SkTypeface::kBold) && | 249 paint_.setFakeBoldText((skia_style & SkTypeface::kBold) && |
| 249 !typeface->isBold()); | 250 !typeface->isBold()); |
| 250 } | 251 } |
| 251 } | 252 } |
| 252 | 253 |
| 253 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) { | 254 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) { |
| 254 paint_.setColor(foreground); | 255 paint_.setColor(foreground); |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 if (fade_right) { | 910 if (fade_right) { |
| 910 right_part = solid_part; | 911 right_part = solid_part; |
| 911 right_part.Inset(solid_part.width() - gradient_width, 0, 0, 0); | 912 right_part.Inset(solid_part.width() - gradient_width, 0, 0, 0); |
| 912 solid_part.Inset(0, 0, gradient_width, 0); | 913 solid_part.Inset(0, 0, gradient_width, 0); |
| 913 } | 914 } |
| 914 | 915 |
| 915 gfx::Rect text_rect = display_rect(); | 916 gfx::Rect text_rect = display_rect(); |
| 916 text_rect.Inset(GetAlignmentOffset().x(), 0, 0, 0); | 917 text_rect.Inset(GetAlignmentOffset().x(), 0, 0, 0); |
| 917 | 918 |
| 918 const SkColor color = default_style().foreground; | 919 const SkColor color = default_style().foreground; |
| 919 SkShader* shader = CreateFadeShader(text_rect, left_part, right_part, color); | 920 skia::RefPtr<SkShader> shader = |
| 920 SkAutoUnref auto_unref(shader); | 921 CreateFadeShader(text_rect, left_part, right_part, color); |
| 921 if (shader) { | 922 if (shader) |
| 922 // |renderer| adds its own ref. So don't |release()| it from the ref ptr. | 923 renderer->SetShader(shader.get(), display_rect()); |
| 923 renderer->SetShader(shader, display_rect()); | |
| 924 } | |
| 925 } | 924 } |
| 926 | 925 |
| 927 void RenderText::ApplyTextShadows(internal::SkiaTextRenderer* renderer) { | 926 void RenderText::ApplyTextShadows(internal::SkiaTextRenderer* renderer) { |
| 928 SkDrawLooper* looper = gfx::CreateShadowDrawLooper(text_shadows_); | 927 skia::RefPtr<SkDrawLooper> looper = |
| 929 SkAutoUnref auto_unref(looper); | 928 gfx::CreateShadowDrawLooper(text_shadows_); |
| 930 renderer->SetDrawLooper(looper); | 929 renderer->SetDrawLooper(looper.get()); |
| 931 } | 930 } |
| 932 | 931 |
| 933 // static | 932 // static |
| 934 bool RenderText::RangeContainsCaret(const ui::Range& range, | 933 bool RenderText::RangeContainsCaret(const ui::Range& range, |
| 935 size_t caret_pos, | 934 size_t caret_pos, |
| 936 LogicalCursorDirection caret_affinity) { | 935 LogicalCursorDirection caret_affinity) { |
| 937 // NB: exploits unsigned wraparound (WG14/N1124 section 6.2.5 paragraph 9). | 936 // NB: exploits unsigned wraparound (WG14/N1124 section 6.2.5 paragraph 9). |
| 938 size_t adjacent = (caret_affinity == CURSOR_BACKWARD) ? | 937 size_t adjacent = (caret_affinity == CURSOR_BACKWARD) ? |
| 939 caret_pos - 1 : caret_pos + 1; | 938 caret_pos - 1 : caret_pos + 1; |
| 940 return range.Contains(ui::Range(caret_pos, adjacent)); | 939 return range.Contains(ui::Range(caret_pos, adjacent)); |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1019 if (cursor_enabled() && cursor_visible() && focused()) { | 1018 if (cursor_enabled() && cursor_visible() && focused()) { |
| 1020 const Rect& bounds = GetUpdatedCursorBounds(); | 1019 const Rect& bounds = GetUpdatedCursorBounds(); |
| 1021 if (bounds.width() != 0) | 1020 if (bounds.width() != 0) |
| 1022 canvas->FillRect(bounds, cursor_color_); | 1021 canvas->FillRect(bounds, cursor_color_); |
| 1023 else | 1022 else |
| 1024 canvas->DrawRect(bounds, cursor_color_); | 1023 canvas->DrawRect(bounds, cursor_color_); |
| 1025 } | 1024 } |
| 1026 } | 1025 } |
| 1027 | 1026 |
| 1028 } // namespace gfx | 1027 } // namespace gfx |
| OLD | NEW |