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

Side by Side Diff: gm/pictureimagefilter.cpp

Issue 1878373003: Add GM to prevent mis-drawing of LCD text in SkPictureImageFilters (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Make artifacts more noticeable Created 4 years, 8 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
« no previous file with comments | « no previous file | 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 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "gm.h" 8 #include "gm.h"
9 9
10 #include "SkPictureImageFilter.h" 10 #include "SkPictureImageFilter.h"
(...skipping 19 matching lines...) Expand all
30 SkPaint paint; 30 SkPaint paint;
31 paint.setAntiAlias(true); 31 paint.setAntiAlias(true);
32 sk_tool_utils::set_portable_typeface(&paint); 32 sk_tool_utils::set_portable_typeface(&paint);
33 paint.setColor(0xFFFFFFFF); 33 paint.setColor(0xFFFFFFFF);
34 paint.setTextSize(SkIntToScalar(96)); 34 paint.setTextSize(SkIntToScalar(96));
35 const char* str = "e"; 35 const char* str = "e";
36 canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), pai nt); 36 canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), pai nt);
37 return recorder.finishRecordingAsPicture(); 37 return recorder.finishRecordingAsPicture();
38 } 38 }
39 39
40 // Create a picture that will draw LCD text
41 static sk_sp<SkPicture> make_LCD_picture() {
42 SkPictureRecorder recorder;
43 SkCanvas* canvas = recorder.beginRecording(100, 100, nullptr, 0);
44 canvas->clear(SK_ColorTRANSPARENT);
45 SkPaint paint;
46 paint.setLCDRenderText(true); // want LCD
47 paint.setAntiAlias(true); // need AA for LCD
48 sk_tool_utils::set_portable_typeface(&paint);
49 paint.setColor(0xFFFFFFFF);
50 // this has to be small enough that it doesn't become a path
51 paint.setTextSize(SkIntToScalar(36));
52 const char* str = "e";
53 canvas->drawText(str, strlen(str), SkIntToScalar(20), SkIntToScalar(70), pai nt);
54 return recorder.finishRecordingAsPicture();
55 }
56
40 class PictureImageFilterGM : public skiagm::GM { 57 class PictureImageFilterGM : public skiagm::GM {
41 public: 58 public:
42 PictureImageFilterGM() { } 59 PictureImageFilterGM() { }
43 60
44 protected: 61 protected:
45 SkString onShortName() override { 62 SkString onShortName() override {
46 return SkString("pictureimagefilter"); 63 return SkString("pictureimagefilter");
47 } 64 }
48 65
49 SkISize onISize() override { return SkISize::Make(600, 300); } 66 SkISize onISize() override { return SkISize::Make(600, 300); }
50 67
51 void onOnceBeforeDraw() override { 68 void onOnceBeforeDraw() override {
52 fPicture = make_picture(); 69 fPicture = make_picture();
70 fLCDPicture = make_LCD_picture();
53 } 71 }
54 72
55 void onDraw(SkCanvas* canvas) override { 73 void onDraw(SkCanvas* canvas) override {
56 canvas->clear(SK_ColorBLACK); 74 canvas->clear(SK_ColorGRAY);
57 { 75 {
58 SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30); 76 SkRect srcRect = SkRect::MakeXYWH(20, 20, 30, 30);
59 SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0); 77 SkRect emptyRect = SkRect::MakeXYWH(20, 20, 0, 0);
60 SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100); 78 SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100);
61 sk_sp<SkImageFilter> pictureSource(SkPictureImageFilter::Make(fPictu re)); 79 sk_sp<SkImageFilter> pictureSource(SkPictureImageFilter::Make(fPictu re));
62 sk_sp<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Make (fPicture, 80 sk_sp<SkImageFilter> pictureSourceSrcRect(SkPictureImageFilter::Make (fPicture,
63 srcRect)); 81 srcRect));
64 sk_sp<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Ma ke(fPicture, 82 sk_sp<SkImageFilter> pictureSourceEmptyRect(SkPictureImageFilter::Ma ke(fPicture,
65 emptyRect)); 83 emptyRect));
66 sk_sp<SkImageFilter> pictureSourceResampled(SkPictureImageFilter::Ma keForLocalSpace( 84 sk_sp<SkImageFilter> pictureSourceResampled(SkPictureImageFilter::Ma keForLocalSpace(
(...skipping 11 matching lines...) Expand all
78 canvas->translate(SkIntToScalar(100), 0); 96 canvas->translate(SkIntToScalar(100), 0);
79 97
80 // Draw an unscaled subset of the source picture. 98 // Draw an unscaled subset of the source picture.
81 fill_rect_filtered(canvas, bounds, pictureSourceSrcRect); 99 fill_rect_filtered(canvas, bounds, pictureSourceSrcRect);
82 canvas->translate(SkIntToScalar(100), 0); 100 canvas->translate(SkIntToScalar(100), 0);
83 101
84 // Draw the picture to an empty rect (should draw nothing). 102 // Draw the picture to an empty rect (should draw nothing).
85 fill_rect_filtered(canvas, bounds, pictureSourceEmptyRect); 103 fill_rect_filtered(canvas, bounds, pictureSourceEmptyRect);
86 canvas->translate(SkIntToScalar(100), 0); 104 canvas->translate(SkIntToScalar(100), 0);
87 105
106 // Draw the LCD picture to a layer
107 {
108 SkPaint stroke;
109 stroke.setStyle(SkPaint::kStroke_Style);
110
111 canvas->drawRect(bounds, stroke);
112
113 SkPaint paint;
114 paint.setImageFilter(SkPictureImageFilter::MakeForLocalSpace(
115 fLCDPict ure,
116 fPicture ->cullRect(),
117 kNone_Sk FilterQuality));
118
119 canvas->scale(4, 4);
120 canvas->translate(-0.9f*srcRect.fLeft, -2.45f*srcRect.fTop);
121
122 canvas->saveLayerPreserveLCDTextRequests(&bounds, &paint);
123 canvas->restore();
124 }
125
88 canvas->restore(); 126 canvas->restore();
89 127
90 // Draw the picture scaled 128 // Draw the picture scaled
91 canvas->translate(0, SkIntToScalar(100)); 129 canvas->translate(0, SkIntToScalar(100));
92 canvas->scale(200 / srcRect.width(), 200 / srcRect.height()); 130 canvas->scale(200 / srcRect.width(), 200 / srcRect.height());
93 canvas->translate(-srcRect.fLeft, -srcRect.fTop); 131 canvas->translate(-srcRect.fLeft, -srcRect.fTop);
94 fill_rect_filtered(canvas, srcRect, pictureSource); 132 fill_rect_filtered(canvas, srcRect, pictureSource);
95 133
96 // Draw the picture scaled, but rasterized at original resolution 134 // Draw the picture scaled, but rasterized at original resolution
97 canvas->translate(srcRect.width(), 0); 135 canvas->translate(srcRect.width(), 0);
98 fill_rect_filtered(canvas, srcRect, pictureSourceResampled); 136 fill_rect_filtered(canvas, srcRect, pictureSourceResampled);
99 137
100 // Draw the picture scaled, pixelated 138 // Draw the picture scaled, pixelated
101 canvas->translate(srcRect.width(), 0); 139 canvas->translate(srcRect.width(), 0);
102 fill_rect_filtered(canvas, srcRect, pictureSourcePixelated); 140 fill_rect_filtered(canvas, srcRect, pictureSourcePixelated);
103 } 141 }
104 } 142 }
105 143
106 private: 144 private:
107 sk_sp<SkPicture> fPicture; 145 sk_sp<SkPicture> fPicture;
146 sk_sp<SkPicture> fLCDPicture;
108 147
109 typedef GM INHERITED; 148 typedef GM INHERITED;
110 }; 149 };
111 150
112 /////////////////////////////////////////////////////////////////////////////// 151 ///////////////////////////////////////////////////////////////////////////////
113 152
114 DEF_GM( return new PictureImageFilterGM; ) 153 DEF_GM( return new PictureImageFilterGM; )
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698