Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Side by Side Diff: ui/gfx/render_text.cc

Issue 493363006: Remove deferred fade shader workaround from RenderText (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove deferred fade shader workaround from RenderText Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« ui/gfx/render_text.h ('K') | « ui/gfx/render_text.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include <climits> 8 #include <climits>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 started_drawing_(false), 182 started_drawing_(false),
183 underline_thickness_(kUnderlineMetricsNotSet), 183 underline_thickness_(kUnderlineMetricsNotSet),
184 underline_position_(0.0f) { 184 underline_position_(0.0f) {
185 DCHECK(canvas_skia_); 185 DCHECK(canvas_skia_);
186 paint_.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 186 paint_.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
187 paint_.setStyle(SkPaint::kFill_Style); 187 paint_.setStyle(SkPaint::kFill_Style);
188 paint_.setAntiAlias(true); 188 paint_.setAntiAlias(true);
189 paint_.setSubpixelText(true); 189 paint_.setSubpixelText(true);
190 paint_.setLCDRenderText(true); 190 paint_.setLCDRenderText(true);
191 paint_.setHinting(SkPaint::kNormal_Hinting); 191 paint_.setHinting(SkPaint::kNormal_Hinting);
192 bounds_.setEmpty();
193 } 192 }
194 193
195 SkiaTextRenderer::~SkiaTextRenderer() { 194 SkiaTextRenderer::~SkiaTextRenderer() {
196 // Work-around for http://crbug.com/122743, where non-ClearType text is
197 // rendered with incorrect gamma when using the fade shader. Draw the text
198 // to a layer and restore it faded by drawing a rect in kDstIn_Mode mode.
199 //
200 // TODO(asvitkine): Remove this work-around once the Skia bug is fixed.
201 // http://code.google.com/p/skia/issues/detail?id=590
202 if (deferred_fade_shader_.get()) {
203 paint_.setShader(deferred_fade_shader_.get());
204 paint_.setXfermodeMode(SkXfermode::kDstIn_Mode);
205 canvas_skia_->drawRect(bounds_, paint_);
206 canvas_skia_->restore();
207 }
208 } 195 }
209 196
210 void SkiaTextRenderer::SetDrawLooper(SkDrawLooper* draw_looper) { 197 void SkiaTextRenderer::SetDrawLooper(SkDrawLooper* draw_looper) {
211 paint_.setLooper(draw_looper); 198 paint_.setLooper(draw_looper);
212 } 199 }
213 200
214 void SkiaTextRenderer::SetFontRenderParams(const FontRenderParams& params, 201 void SkiaTextRenderer::SetFontRenderParams(const FontRenderParams& params,
215 bool background_is_transparent) { 202 bool background_is_transparent) {
216 ApplyRenderParams(params, background_is_transparent, &paint_); 203 ApplyRenderParams(params, background_is_transparent, &paint_);
217 } 204 }
(...skipping 18 matching lines...) Expand all
236 // Enable fake bold text if bold style is needed but new typeface does not 223 // Enable fake bold text if bold style is needed but new typeface does not
237 // have it. 224 // have it.
238 paint_.setFakeBoldText((style & Font::BOLD) && !typeface->isBold()); 225 paint_.setFakeBoldText((style & Font::BOLD) && !typeface->isBold());
239 } 226 }
240 } 227 }
241 228
242 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) { 229 void SkiaTextRenderer::SetForegroundColor(SkColor foreground) {
243 paint_.setColor(foreground); 230 paint_.setColor(foreground);
244 } 231 }
245 232
246 void SkiaTextRenderer::SetShader(SkShader* shader, const Rect& bounds) { 233 void SkiaTextRenderer::SetShader(SkShader* shader) {
247 bounds_ = RectToSkRect(bounds);
248 paint_.setShader(shader); 234 paint_.setShader(shader);
249 } 235 }
250 236
251 void SkiaTextRenderer::SetUnderlineMetrics(SkScalar thickness, 237 void SkiaTextRenderer::SetUnderlineMetrics(SkScalar thickness,
252 SkScalar position) { 238 SkScalar position) {
253 underline_thickness_ = thickness; 239 underline_thickness_ = thickness;
254 underline_position_ = position; 240 underline_position_ = position;
255 } 241 }
256 242
257 void SkiaTextRenderer::DrawPosText(const SkPoint* pos, 243 void SkiaTextRenderer::DrawPosText(const SkPoint* pos,
258 const uint16* glyphs, 244 const uint16* glyphs,
259 size_t glyph_count) { 245 size_t glyph_count) {
260 if (!started_drawing_) {
261 started_drawing_ = true;
262 // Work-around for http://crbug.com/122743, where non-ClearType text is
263 // rendered with incorrect gamma when using the fade shader. Draw the text
264 // to a layer and restore it faded by drawing a rect in kDstIn_Mode mode.
265 //
266 // Skip this when there is a looper which seems not working well with
267 // deferred paint. Currently a looper is only used for text shadows.
268 //
269 // TODO(asvitkine): Remove this work-around once the Skia bug is fixed.
270 // http://code.google.com/p/skia/issues/detail?id=590
271 if (!paint_.isLCDRenderText() &&
272 paint_.getShader() &&
273 !paint_.getLooper()) {
274 deferred_fade_shader_ = skia::SharePtr(paint_.getShader());
275 paint_.setShader(NULL);
276 canvas_skia_->saveLayer(&bounds_, NULL);
277 }
278 }
279
280 const size_t byte_length = glyph_count * sizeof(glyphs[0]); 246 const size_t byte_length = glyph_count * sizeof(glyphs[0]);
281 canvas_skia_->drawPosText(&glyphs[0], byte_length, &pos[0], paint_); 247 canvas_skia_->drawPosText(&glyphs[0], byte_length, &pos[0], paint_);
282 } 248 }
283 249
284 void SkiaTextRenderer::DrawDecorations(int x, int y, int width, bool underline, 250 void SkiaTextRenderer::DrawDecorations(int x, int y, int width, bool underline,
285 bool strike, bool diagonal_strike) { 251 bool strike, bool diagonal_strike) {
286 if (underline) 252 if (underline)
287 DrawUnderline(x, y, width); 253 DrawUnderline(x, y, width);
288 if (strike) 254 if (strike)
289 DrawStrike(x, y, width); 255 DrawStrike(x, y, width);
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
1168 solid_part.Inset(0, 0, gradient_width, 0); 1134 solid_part.Inset(0, 0, gradient_width, 0);
1169 } 1135 }
1170 1136
1171 Rect text_rect = display_rect(); 1137 Rect text_rect = display_rect();
1172 text_rect.Inset(GetAlignmentOffset(0).x(), 0, 0, 0); 1138 text_rect.Inset(GetAlignmentOffset(0).x(), 0, 0, 0);
1173 1139
1174 // TODO(msw): Use the actual text colors corresponding to each faded part. 1140 // TODO(msw): Use the actual text colors corresponding to each faded part.
1175 skia::RefPtr<SkShader> shader = CreateFadeShader( 1141 skia::RefPtr<SkShader> shader = CreateFadeShader(
1176 text_rect, left_part, right_part, colors_.breaks().front().second); 1142 text_rect, left_part, right_part, colors_.breaks().front().second);
1177 if (shader) 1143 if (shader)
1178 renderer->SetShader(shader.get(), display_rect()); 1144 renderer->SetShader(shader.get());
1179 } 1145 }
1180 1146
1181 void RenderText::ApplyTextShadows(internal::SkiaTextRenderer* renderer) { 1147 void RenderText::ApplyTextShadows(internal::SkiaTextRenderer* renderer) {
1182 skia::RefPtr<SkDrawLooper> looper = CreateShadowDrawLooper(shadows_); 1148 skia::RefPtr<SkDrawLooper> looper = CreateShadowDrawLooper(shadows_);
1183 renderer->SetDrawLooper(looper.get()); 1149 renderer->SetDrawLooper(looper.get());
1184 } 1150 }
1185 1151
1186 // static 1152 // static
1187 bool RenderText::RangeContainsCaret(const Range& range, 1153 bool RenderText::RangeContainsCaret(const Range& range,
1188 size_t caret_pos, 1154 size_t caret_pos,
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 SetDisplayOffset(display_offset_.x() + delta_x); 1397 SetDisplayOffset(display_offset_.x() + delta_x);
1432 } 1398 }
1433 1399
1434 void RenderText::DrawSelection(Canvas* canvas) { 1400 void RenderText::DrawSelection(Canvas* canvas) {
1435 const std::vector<Rect> sel = GetSubstringBounds(selection()); 1401 const std::vector<Rect> sel = GetSubstringBounds(selection());
1436 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i) 1402 for (std::vector<Rect>::const_iterator i = sel.begin(); i < sel.end(); ++i)
1437 canvas->FillRect(*i, selection_background_focused_color_); 1403 canvas->FillRect(*i, selection_background_focused_color_);
1438 } 1404 }
1439 1405
1440 } // namespace gfx 1406 } // namespace gfx
OLDNEW
« ui/gfx/render_text.h ('K') | « ui/gfx/render_text.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698