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

Side by Side Diff: src/core/SkSpecialImage.cpp

Issue 1762013002: Swap over to using SkImageFilter::filterImage instead of filterImageDeprecated (Closed) Base URL: https://skia.googlesource.com/skia.git@if-fragment
Patch Set: Fix no-GPU build Created 4 years, 9 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 | « src/core/SkSpecialImage.h ('k') | src/gpu/GrLayerHoister.cpp » ('j') | 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 2016 Google Inc. 2 * Copyright 2016 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 "SkCanvas.h" 8 #include "SkCanvas.h"
9 #include "SkImage_Base.h" 9 #include "SkImage_Base.h"
10 #include "SkSpecialImage.h" 10 #include "SkSpecialImage.h"
11 #include "SkSpecialSurface.h" 11 #include "SkSpecialSurface.h"
12 12
13 /////////////////////////////////////////////////////////////////////////////// 13 ///////////////////////////////////////////////////////////////////////////////
14 class SkSpecialImage_Base : public SkSpecialImage { 14 class SkSpecialImage_Base : public SkSpecialImage {
15 public: 15 public:
16 SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint 32_t uniqueID) 16 SkSpecialImage_Base(SkImageFilter::Proxy* proxy, const SkIRect& subset, uint 32_t uniqueID)
17 : INHERITED(proxy, subset, uniqueID) { 17 : INHERITED(proxy, subset, uniqueID) {
18 } 18 }
19 virtual ~SkSpecialImage_Base() { } 19 virtual ~SkSpecialImage_Base() { }
20 20
21 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const = 0; 21 virtual void onDraw(SkCanvas*, SkScalar x, SkScalar y, const SkPaint*) const = 0;
22 22
23 virtual bool onPeekPixels(SkPixmap*) const { return false; } 23 virtual bool testingOnlyOnPeekPixels(SkPixmap*) const { return false; }
24 24
25 virtual GrTexture* onPeekTexture() const { return nullptr; } 25 virtual GrTexture* onPeekTexture() const { return nullptr; }
26 26
27 virtual bool testingOnlyOnGetROPixels(SkBitmap*) const = 0;
28
27 // Delete this entry point ASAP (see skbug.com/4965) 29 // Delete this entry point ASAP (see skbug.com/4965)
28 virtual bool getBitmap(SkBitmap* result) const = 0; 30 virtual bool getBitmap(SkBitmap* result) const = 0;
29 31
30 virtual SkSpecialSurface* onNewSurface(const SkImageInfo& info) const { retu rn nullptr; } 32 virtual SkSpecialSurface* onNewSurface(const SkImageInfo& info) const { retu rn nullptr; }
31 33
32 private: 34 private:
33 typedef SkSpecialImage INHERITED; 35 typedef SkSpecialImage INHERITED;
34 }; 36 };
35 37
36 /////////////////////////////////////////////////////////////////////////////// 38 ///////////////////////////////////////////////////////////////////////////////
37 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) { 39 static inline const SkSpecialImage_Base* as_SIB(const SkSpecialImage* image) {
38 return static_cast<const SkSpecialImage_Base*>(image); 40 return static_cast<const SkSpecialImage_Base*>(image);
39 } 41 }
40 42
41 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain t* paint) const { 43 void SkSpecialImage::draw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPain t* paint) const {
42 return as_SIB(this)->onDraw(canvas, x, y, paint); 44 return as_SIB(this)->onDraw(canvas, x, y, paint);
43 } 45 }
44 46
45 bool SkSpecialImage::peekPixels(SkPixmap* pixmap) const { 47 bool SkSpecialImage::testingOnlyPeekPixels(SkPixmap* pixmap) const {
46 return as_SIB(this)->onPeekPixels(pixmap); 48 return as_SIB(this)->testingOnlyOnPeekPixels(pixmap);
47 } 49 }
48 50
49 GrTexture* SkSpecialImage::peekTexture() const { 51 GrTexture* SkSpecialImage::peekTexture() const {
50 return as_SIB(this)->onPeekTexture(); 52 return as_SIB(this)->onPeekTexture();
51 } 53 }
52 54
55 bool SkSpecialImage::testingOnlyGetROPixels(SkBitmap* result) const {
56 return as_SIB(this)->testingOnlyOnGetROPixels(result);
57 }
58
53 SkSpecialSurface* SkSpecialImage::newSurface(const SkImageInfo& info) const { 59 SkSpecialSurface* SkSpecialImage::newSurface(const SkImageInfo& info) const {
54 return as_SIB(this)->onNewSurface(info); 60 return as_SIB(this)->onNewSurface(info);
55 } 61 }
56 62
57 #if SK_SUPPORT_GPU 63 #if SK_SUPPORT_GPU
58 #include "SkGr.h" 64 #include "SkGr.h"
59 #include "SkGrPixelRef.h" 65 #include "SkGrPixelRef.h"
60 #endif 66 #endif
61 67
62 SkSpecialImage* SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* proxy, 68 SkSpecialImage* SkSpecialImage::internal_fromBM(SkImageFilter::Proxy* proxy,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 return 0; 124 return 0;
119 } 125 }
120 126
121 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const override { 127 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const override {
122 SkRect dst = SkRect::MakeXYWH(x, y, this->subset().width(), this->subset ().height()); 128 SkRect dst = SkRect::MakeXYWH(x, y, this->subset().width(), this->subset ().height());
123 129
124 canvas->drawImageRect(fImage, this->subset(), 130 canvas->drawImageRect(fImage, this->subset(),
125 dst, paint, SkCanvas::kStrict_SrcRectConstraint); 131 dst, paint, SkCanvas::kStrict_SrcRectConstraint);
126 } 132 }
127 133
128 bool onPeekPixels(SkPixmap* pixmap) const override { 134 bool testingOnlyOnPeekPixels(SkPixmap* pixmap) const override {
129 return fImage->peekPixels(pixmap); 135 return fImage->peekPixels(pixmap);
130 } 136 }
131 137
132 GrTexture* onPeekTexture() const override { return as_IB(fImage.get())->peek Texture(); } 138 GrTexture* onPeekTexture() const override { return as_IB(fImage.get())->peek Texture(); }
133 139
134 bool getBitmap(SkBitmap* result) const override { 140 bool getBitmap(SkBitmap* result) const override {
135 return false; 141 return false;
136 } 142 }
137 143
144 bool testingOnlyOnGetROPixels(SkBitmap* result) const override {
145 return false;
146 }
147
138 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override { 148 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override {
139 #if SK_SUPPORT_GPU 149 #if SK_SUPPORT_GPU
140 GrTexture* texture = as_IB(fImage.get())->peekTexture(); 150 GrTexture* texture = as_IB(fImage.get())->peekTexture();
141 if (texture) { 151 if (texture) {
142 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info); 152 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info);
143 desc.fFlags = kRenderTarget_GrSurfaceFlag; 153 desc.fFlags = kRenderTarget_GrSurfaceFlag;
144 154
145 return SkSpecialSurface::NewRenderTarget(this->proxy(), texture->get Context(), desc); 155 return SkSpecialSurface::NewRenderTarget(this->proxy(), texture->get Context(), desc);
146 } 156 }
147 #endif 157 #endif
148 return SkSpecialSurface::NewRaster(this->proxy(), info, nullptr); 158 return SkSpecialSurface::NewRaster(this->proxy(), info, nullptr);
149 } 159 }
150 160
151 private: 161 private:
152 SkAutoTUnref<const SkImage> fImage; 162 SkAutoTUnref<const SkImage> fImage;
153 163
154 typedef SkSpecialImage_Base INHERITED; 164 typedef SkSpecialImage_Base INHERITED;
155 }; 165 };
156 166
157 #ifdef SK_DEBUG 167 #ifdef SK_DEBUG
158 static bool rect_fits(const SkIRect& rect, int width, int height) { 168 static bool rect_fits(const SkIRect& rect, int width, int height) {
169 if (0 == width && 0 == height) {
170 SkASSERT(0 == rect.fLeft && 0 == rect.fRight && 0 == rect.fTop && 0 == r ect.fBottom);
171 return true;
172 }
173
159 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight && 174 return rect.fLeft >= 0 && rect.fLeft < width && rect.fLeft < rect.fRight &&
160 rect.fRight >= 0 && rect.fRight <= width && 175 rect.fRight >= 0 && rect.fRight <= width &&
161 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom && 176 rect.fTop >= 0 && rect.fTop < height && rect.fTop < rect.fBottom &&
162 rect.fBottom >= 0 && rect.fBottom <= height; 177 rect.fBottom >= 0 && rect.fBottom <= height;
163 } 178 }
164 #endif 179 #endif
165 180
166 SkSpecialImage* SkSpecialImage::NewFromImage(const SkIRect& subset, const SkImag e* image) { 181 SkSpecialImage* SkSpecialImage::NewFromImage(const SkIRect& subset, const SkImag e* image) {
167 SkASSERT(rect_fits(subset, image->width(), image->height())); 182 SkASSERT(rect_fits(subset, image->width(), image->height()));
168 return new SkSpecialImage_Image(nullptr, subset, image); 183 return new SkSpecialImage_Image(nullptr, subset, image);
169 } 184 }
170 185
171 /////////////////////////////////////////////////////////////////////////////// 186 ///////////////////////////////////////////////////////////////////////////////
172 #include "SkBitmap.h" 187 #include "SkBitmap.h"
173 #include "SkImageInfo.h" 188 #include "SkImageInfo.h"
174 #include "SkPixelRef.h" 189 #include "SkPixelRef.h"
175 190
176 class SkSpecialImage_Raster : public SkSpecialImage_Base { 191 class SkSpecialImage_Raster : public SkSpecialImage_Base {
177 public: 192 public:
178 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, co nst SkBitmap& bm) 193 SkSpecialImage_Raster(SkImageFilter::Proxy* proxy, const SkIRect& subset, co nst SkBitmap& bm)
179 : INHERITED(proxy, subset, bm.getGenerationID()) 194 : INHERITED(proxy, subset, bm.getGenerationID())
180 , fBitmap(bm) { 195 , fBitmap(bm) {
181 if (bm.pixelRef()->isPreLocked()) { 196 if (bm.pixelRef() && bm.pixelRef()->isPreLocked()) {
182 // we only preemptively lock if there is no chance of triggering som ething expensive 197 // we only preemptively lock if there is no chance of triggering som ething expensive
183 // like a lazy decode or imagegenerator. PreLocked means it is flat pixels already. 198 // like a lazy decode or imagegenerator. PreLocked means it is flat pixels already.
184 fBitmap.lockPixels(); 199 fBitmap.lockPixels();
185 } 200 }
186 } 201 }
187 202
188 ~SkSpecialImage_Raster() override { } 203 ~SkSpecialImage_Raster() override { }
189 204
190 bool isOpaque() const override { return fBitmap.isOpaque(); } 205 bool isOpaque() const override { return fBitmap.isOpaque(); }
191 206
192 size_t getSize() const override { return fBitmap.getSize(); } 207 size_t getSize() const override { return fBitmap.getSize(); }
193 208
194 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const override { 209 void onDraw(SkCanvas* canvas, SkScalar x, SkScalar y, const SkPaint* paint) const override {
195 SkRect dst = SkRect::MakeXYWH(x, y, 210 SkRect dst = SkRect::MakeXYWH(x, y,
196 this->subset().width(), this->subset().hei ght()); 211 this->subset().width(), this->subset().hei ght());
197 212
198 canvas->drawBitmapRect(fBitmap, this->subset(), 213 canvas->drawBitmapRect(fBitmap, this->subset(),
199 dst, paint, SkCanvas::kStrict_SrcRectConstraint); 214 dst, paint, SkCanvas::kStrict_SrcRectConstraint);
200 } 215 }
201 216
202 bool onPeekPixels(SkPixmap* pixmap) const override { 217 bool testingOnlyOnPeekPixels(SkPixmap* pixmap) const override {
203 const SkImageInfo info = fBitmap.info(); 218 const SkImageInfo info = fBitmap.info();
204 if ((kUnknown_SkColorType == info.colorType()) || !fBitmap.getPixels()) { 219 if ((kUnknown_SkColorType == info.colorType()) || !fBitmap.getPixels()) {
205 return false; 220 return false;
206 } 221 }
207 const void* pixels = fBitmap.getPixels(); 222 const void* pixels = fBitmap.getPixels();
208 if (pixels) { 223 if (pixels) {
209 if (pixmap) { 224 if (pixmap) {
210 pixmap->reset(info, pixels, fBitmap.rowBytes()); 225 pixmap->reset(info, pixels, fBitmap.rowBytes());
211 } 226 }
212 return true; 227 return true;
213 } 228 }
214 return false; 229 return false;
215 } 230 }
216 231
217 bool getBitmap(SkBitmap* result) const override { 232 bool getBitmap(SkBitmap* result) const override {
218 *result = fBitmap; 233 *result = fBitmap;
219 return true; 234 return true;
220 } 235 }
221 236
237 bool testingOnlyOnGetROPixels(SkBitmap* result) const override {
238 *result = fBitmap;
239 return true;
240 }
241
222 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override { 242 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override {
223 return SkSpecialSurface::NewRaster(this->proxy(), info, nullptr); 243 return SkSpecialSurface::NewRaster(this->proxy(), info, nullptr);
224 } 244 }
225 245
226 private: 246 private:
227 SkBitmap fBitmap; 247 SkBitmap fBitmap;
228 248
229 typedef SkSpecialImage_Base INHERITED; 249 typedef SkSpecialImage_Base INHERITED;
230 }; 250 };
231 251
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 this->width(), this->heig ht(), 298 this->width(), this->heig ht(),
279 this->isOpaque()); 299 this->isOpaque());
280 if (!result->setInfo(info)) { 300 if (!result->setInfo(info)) {
281 return false; 301 return false;
282 } 302 }
283 303
284 result->setPixelRef(new SkGrPixelRef(info, fTexture))->unref(); 304 result->setPixelRef(new SkGrPixelRef(info, fTexture))->unref();
285 return true; 305 return true;
286 } 306 }
287 307
308 bool testingOnlyOnGetROPixels(SkBitmap* result) const override {
309
310 const SkImageInfo info = SkImageInfo::MakeN32(this->width(),
311 this->height(),
312 this->isOpaque() ? kOpaque _SkAlphaType
313 : kPremul _SkAlphaType);
314 if (!result->tryAllocPixels(info)) {
315 return false;
316 }
317
318 if (!fTexture->readPixels(0, 0, result->width(), result->height(), kSkia 8888_GrPixelConfig,
319 result->getPixels(), result->rowBytes())) {
320 return false;
321 }
322
323 result->pixelRef()->setImmutable();
324 return true;
325 }
326
288 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override { 327 SkSpecialSurface* onNewSurface(const SkImageInfo& info) const override {
289 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info); 328 GrSurfaceDesc desc = GrImageInfoToSurfaceDesc(info);
290 desc.fFlags = kRenderTarget_GrSurfaceFlag; 329 desc.fFlags = kRenderTarget_GrSurfaceFlag;
291 330
292 return SkSpecialSurface::NewRenderTarget(this->proxy(), fTexture->getCon text(), desc); 331 return SkSpecialSurface::NewRenderTarget(this->proxy(), fTexture->getCon text(), desc);
293 } 332 }
294 333
295 private: 334 private:
296 SkAutoTUnref<GrTexture> fTexture; 335 SkAutoTUnref<GrTexture> fTexture;
297 const SkAlphaType fAlphaType; 336 const SkAlphaType fAlphaType;
(...skipping 14 matching lines...) Expand all
312 351
313 SkSpecialImage* SkSpecialImage::NewFromGpu(SkImageFilter::Proxy* proxy, 352 SkSpecialImage* SkSpecialImage::NewFromGpu(SkImageFilter::Proxy* proxy,
314 const SkIRect& subset, 353 const SkIRect& subset,
315 uint32_t uniqueID, 354 uint32_t uniqueID,
316 GrTexture* tex, 355 GrTexture* tex,
317 SkAlphaType at) { 356 SkAlphaType at) {
318 return nullptr; 357 return nullptr;
319 } 358 }
320 359
321 #endif 360 #endif
OLDNEW
« no previous file with comments | « src/core/SkSpecialImage.h ('k') | src/gpu/GrLayerHoister.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698