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

Side by Side Diff: gm/image.cpp

Issue 1810813003: update callsites for Make image factories (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: start to take advantage of sk_sp drawImage 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 | « gm/grayscalejpg.cpp ('k') | gm/image_pict.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 2011 Google Inc. 2 * Copyright 2011 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 <functional> 8 #include <functional>
9 #include "gm.h" 9 #include "gm.h"
10 #include "SkAutoPixmapStorage.h" 10 #include "SkAutoPixmapStorage.h"
11 #include "SkData.h" 11 #include "SkData.h"
12 #include "SkCanvas.h" 12 #include "SkCanvas.h"
13 #include "SkRandom.h" 13 #include "SkRandom.h"
14 #include "SkStream.h" 14 #include "SkStream.h"
15 #include "SkSurface.h" 15 #include "SkSurface.h"
16 16
17 #if SK_SUPPORT_GPU 17 #if SK_SUPPORT_GPU
18 #include "GrContext.h" 18 #include "GrContext.h"
19 #endif 19 #endif
20 20
21 static void drawJpeg(SkCanvas* canvas, const SkISize& size) { 21 static void drawJpeg(SkCanvas* canvas, const SkISize& size) {
22 // TODO: Make this draw a file that is checked in, so it can 22 // TODO: Make this draw a file that is checked in, so it can
23 // be exercised on machines other than mike's. Will require a 23 // be exercised on machines other than mike's. Will require a
24 // rebaseline. 24 // rebaseline.
25 SkAutoDataUnref data(SkData::NewFromFileName("/Users/mike/Downloads/skia.goo gle.jpeg")); 25 sk_sp<SkData> data(SkData::MakeFromFileName("/Users/mike/Downloads/skia.goog le.jpeg"));
26 if (nullptr == data.get()) { 26 if (nullptr == data) {
27 return; 27 return;
28 } 28 }
29 SkImage* image = SkImage::NewFromEncoded(data); 29 sk_sp<SkImage> image = SkImage::MakeFromEncoded(std::move(data));
30 if (image) { 30 if (image) {
31 SkAutoCanvasRestore acr(canvas, true); 31 SkAutoCanvasRestore acr(canvas, true);
32 canvas->scale(size.width() * 1.0f / image->width(), 32 canvas->scale(size.width() * 1.0f / image->width(),
33 size.height() * 1.0f / image->height()); 33 size.height() * 1.0f / image->height());
34 canvas->drawImage(image, 0, 0, nullptr); 34 canvas->drawImage(image, 0, 0, nullptr);
35 image->unref();
36 } 35 }
37 } 36 }
38 37
39 static void drawContents(SkSurface* surface, SkColor fillC) { 38 static void drawContents(SkSurface* surface, SkColor fillC) {
40 SkSize size = SkSize::Make(SkIntToScalar(surface->width()), 39 SkSize size = SkSize::Make(SkIntToScalar(surface->width()),
41 SkIntToScalar(surface->height())); 40 SkIntToScalar(surface->height()));
42 SkCanvas* canvas = surface->getCanvas(); 41 SkCanvas* canvas = surface->getCanvas();
43 42
44 SkScalar stroke = size.fWidth / 10; 43 SkScalar stroke = size.fWidth / 10;
45 SkScalar radius = (size.fWidth - stroke) / 2; 44 SkScalar radius = (size.fWidth - stroke) / 2;
46 45
47 SkPaint paint; 46 SkPaint paint;
48 47
49 paint.setAntiAlias(true); 48 paint.setAntiAlias(true);
50 paint.setColor(fillC); 49 paint.setColor(fillC);
51 canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint); 50 canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
52 51
53 paint.setStyle(SkPaint::kStroke_Style); 52 paint.setStyle(SkPaint::kStroke_Style);
54 paint.setStrokeWidth(stroke); 53 paint.setStrokeWidth(stroke);
55 paint.setColor(SK_ColorBLACK); 54 paint.setColor(SK_ColorBLACK);
56 canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint); 55 canvas->drawCircle(size.fWidth/2, size.fHeight/2, radius, paint);
57 } 56 }
58 57
59 static void test_surface(SkCanvas* canvas, SkSurface* surf, bool usePaint) { 58 static void test_surface(SkCanvas* canvas, SkSurface* surf, bool usePaint) {
60 drawContents(surf, SK_ColorRED); 59 drawContents(surf, SK_ColorRED);
61 SkImage* imgR = surf->newImageSnapshot(); 60 sk_sp<SkImage> imgR = surf->makeImageSnapshot();
62 61
63 if (true) { 62 if (true) {
64 SkImage* imgR2 = surf->newImageSnapshot(); 63 sk_sp<SkImage> imgR2 = surf->makeImageSnapshot();
65 SkASSERT(imgR == imgR2); 64 SkASSERT(imgR == imgR2);
66 imgR2->unref();
67 } 65 }
68 66
69 drawContents(surf, SK_ColorGREEN); 67 drawContents(surf, SK_ColorGREEN);
70 SkImage* imgG = surf->newImageSnapshot(); 68 sk_sp<SkImage> imgG = surf->makeImageSnapshot();
71 69
72 // since we've drawn after we snapped imgR, imgG will be a different obj 70 // since we've drawn after we snapped imgR, imgG will be a different obj
73 SkASSERT(imgR != imgG); 71 SkASSERT(imgR != imgG);
74 72
75 drawContents(surf, SK_ColorBLUE); 73 drawContents(surf, SK_ColorBLUE);
76 74
77 SkPaint paint; 75 SkPaint paint;
78 // paint.setFilterBitmap(true); 76 // paint.setFilterBitmap(true);
79 // paint.setAlpha(0x80); 77 // paint.setAlpha(0x80);
80 78
81 canvas->drawImage(imgR, 0, 0, usePaint ? &paint : nullptr); 79 canvas->drawImage(imgR.get(), 0, 0, usePaint ? &paint : nullptr);
82 canvas->drawImage(imgG, 0, 80, usePaint ? &paint : nullptr); 80 canvas->drawImage(imgG.get(), 0, 80, usePaint ? &paint : nullptr);
83 surf->draw(canvas, 0, 160, usePaint ? &paint : nullptr); 81 surf->draw(canvas, 0, 160, usePaint ? &paint : nullptr);
84 82
85 SkRect src1, src2, src3; 83 SkRect src1, src2, src3;
86 src1.iset(0, 0, surf->width(), surf->height()); 84 src1.iset(0, 0, surf->width(), surf->height());
87 src2.iset(-surf->width() / 2, -surf->height() / 2, 85 src2.iset(-surf->width() / 2, -surf->height() / 2,
88 surf->width(), surf->height()); 86 surf->width(), surf->height());
89 src3.iset(0, 0, surf->width() / 2, surf->height() / 2); 87 src3.iset(0, 0, surf->width() / 2, surf->height() / 2);
90 88
91 SkRect dst1, dst2, dst3, dst4; 89 SkRect dst1, dst2, dst3, dst4;
92 dst1.set(0, 240, 65, 305); 90 dst1.set(0, 240, 65, 305);
93 dst2.set(0, 320, 65, 385); 91 dst2.set(0, 320, 65, 385);
94 dst3.set(0, 400, 65, 465); 92 dst3.set(0, 400, 65, 465);
95 dst4.set(0, 480, 65, 545); 93 dst4.set(0, 480, 65, 545);
96 94
97 canvas->drawImageRect(imgR, src1, dst1, usePaint ? &paint : nullptr); 95 canvas->drawImageRect(imgR.get(), src1, dst1, usePaint ? &paint : nullptr);
98 canvas->drawImageRect(imgG, src2, dst2, usePaint ? &paint : nullptr); 96 canvas->drawImageRect(imgG.get(), src2, dst2, usePaint ? &paint : nullptr);
99 canvas->drawImageRect(imgR, src3, dst3, usePaint ? &paint : nullptr); 97 canvas->drawImageRect(imgR.get(), src3, dst3, usePaint ? &paint : nullptr);
100 canvas->drawImageRect(imgG, dst4, usePaint ? &paint : nullptr); 98 canvas->drawImageRect(imgG.get(), dst4, usePaint ? &paint : nullptr);
101
102 imgG->unref();
103 imgR->unref();
104 } 99 }
105 100
106 class ImageGM : public skiagm::GM { 101 class ImageGM : public skiagm::GM {
107 void* fBuffer; 102 void* fBuffer;
108 size_t fBufferSize; 103 size_t fBufferSize;
109 SkSize fSize; 104 SkSize fSize;
110 enum { 105 enum {
111 W = 64, 106 W = 64,
112 H = 64, 107 H = 64,
113 RB = W * 4 + 8, 108 RB = W * 4 + 8,
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 } 230 }
236 } 231 }
237 232
238 static void draw_contents(SkCanvas* canvas) { 233 static void draw_contents(SkCanvas* canvas) {
239 SkPaint paint; 234 SkPaint paint;
240 paint.setStyle(SkPaint::kStroke_Style); 235 paint.setStyle(SkPaint::kStroke_Style);
241 paint.setStrokeWidth(20); 236 paint.setStrokeWidth(20);
242 canvas->drawCircle(50, 50, 35, paint); 237 canvas->drawCircle(50, 50, 35, paint);
243 } 238 }
244 239
245 static SkImage* make_raster(const SkImageInfo& info, GrContext*, void (*draw)(Sk Canvas*)) { 240 static sk_sp<SkImage> make_raster(const SkImageInfo& info, GrContext*, void (*dr aw)(SkCanvas*)) {
246 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); 241 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
247 draw(surface->getCanvas()); 242 draw(surface->getCanvas());
248 return surface->newImageSnapshot(); 243 return surface->makeImageSnapshot();
249 } 244 }
250 245
251 static SkImage* make_picture(const SkImageInfo& info, GrContext*, void (*draw)(S kCanvas*)) { 246 static sk_sp<SkImage> make_picture(const SkImageInfo& info, GrContext*, void (*d raw)(SkCanvas*)) {
252 SkPictureRecorder recorder; 247 SkPictureRecorder recorder;
253 draw(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height()))); 248 draw(recorder.beginRecording(SkRect::MakeIWH(info.width(), info.height())));
254 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 249 SkAutoTUnref<SkPicture> pict(recorder.endRecording());
255 return SkImage::NewFromPicture(pict, info.dimensions(), nullptr, nullptr); 250 return SkImage::MakeFromPicture(sk_ref_sp(pict.get()), info.dimensions(), nu llptr, nullptr);
256 } 251 }
257 252
258 static SkImage* make_codec(const SkImageInfo& info, GrContext*, void (*draw)(SkC anvas*)) { 253 static sk_sp<SkImage> make_codec(const SkImageInfo& info, GrContext*, void (*dra w)(SkCanvas*)) {
259 SkAutoTUnref<SkImage> image(make_raster(info, nullptr, draw)); 254 sk_sp<SkImage> image(make_raster(info, nullptr, draw));
260 SkAutoTUnref<SkData> data(image->encode()); 255 sk_sp<SkData> data(image->encode());
261 return SkImage::NewFromEncoded(data); 256 return SkImage::MakeFromEncoded(data);
262 } 257 }
263 258
264 static SkImage* make_gpu(const SkImageInfo& info, GrContext* ctx, void (*draw)(S kCanvas*)) { 259 static sk_sp<SkImage> make_gpu(const SkImageInfo& info, GrContext* ctx, void (*d raw)(SkCanvas*)) {
265 if (!ctx) { return nullptr; } 260 if (!ctx) { return nullptr; }
266 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkBudgeted:: kNo, info)); 261 SkAutoTUnref<SkSurface> surface(SkSurface::NewRenderTarget(ctx, SkBudgeted:: kNo, info));
267 draw(surface->getCanvas()); 262 draw(surface->getCanvas());
268 return surface->newImageSnapshot(); 263 return surface->makeImageSnapshot();
269 } 264 }
270 265
271 typedef SkImage* (*ImageMakerProc)(const SkImageInfo&, GrContext*, void (*)(SkCa nvas*)); 266 typedef sk_sp<SkImage> (*ImageMakerProc)(const SkImageInfo&, GrContext*, void (* )(SkCanvas*));
272 267
273 class ScalePixelsGM : public skiagm::GM { 268 class ScalePixelsGM : public skiagm::GM {
274 public: 269 public:
275 ScalePixelsGM() {} 270 ScalePixelsGM() {}
276 271
277 protected: 272 protected:
278 SkString onShortName() override { 273 SkString onShortName() override {
279 return SkString("scale-pixels"); 274 return SkString("scale-pixels");
280 } 275 }
281 276
282 SkISize onISize() override { 277 SkISize onISize() override {
283 return SkISize::Make(960, 1200); 278 return SkISize::Make(960, 1200);
284 } 279 }
285 280
286 void onDraw(SkCanvas* canvas) override { 281 void onDraw(SkCanvas* canvas) override {
287 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100); 282 const SkImageInfo info = SkImageInfo::MakeN32Premul(100, 100);
288 283
289 const ImageMakerProc procs[] = { 284 const ImageMakerProc procs[] = {
290 make_codec, make_raster, make_picture, make_codec, make_gpu, 285 make_codec, make_raster, make_picture, make_codec, make_gpu,
291 }; 286 };
292 for (auto& proc : procs) { 287 for (auto& proc : procs) {
293 SkAutoTUnref<SkImage> image(proc(info, canvas->getGrContext(), draw_ contents)); 288 sk_sp<SkImage> image(proc(info, canvas->getGrContext(), draw_content s));
294 if (image) { 289 if (image) {
295 show_scaled_pixels(canvas, image); 290 show_scaled_pixels(canvas, image.get());
296 } 291 }
297 canvas->translate(0, 120); 292 canvas->translate(0, 120);
298 } 293 }
299 } 294 }
300 295
301 private: 296 private:
302 typedef skiagm::GM INHERITED; 297 typedef skiagm::GM INHERITED;
303 }; 298 };
304 DEF_GM( return new ScalePixelsGM; ) 299 DEF_GM( return new ScalePixelsGM; )
305 300
(...skipping 29 matching lines...) Expand all
335 330
336 SkPaint paint; 331 SkPaint paint;
337 paint.setStyle(SkPaint::kStroke_Style); 332 paint.setStyle(SkPaint::kStroke_Style);
338 paint.setStrokeWidth(20); 333 paint.setStrokeWidth(20);
339 canvas->drawCircle(50, 50, 35, paint); 334 canvas->drawCircle(50, 50, 35, paint);
340 } 335 }
341 336
342 static SkImageGenerator* gen_raster(const SkImageInfo& info) { 337 static SkImageGenerator* gen_raster(const SkImageInfo& info) {
343 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info)); 338 SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
344 draw_opaque_contents(surface->getCanvas()); 339 draw_opaque_contents(surface->getCanvas());
345 SkAutoTUnref<SkImage> img(surface->newImageSnapshot()); 340 return new ImageGeneratorFromImage(surface->makeImageSnapshot().get());
346 return new ImageGeneratorFromImage(img);
347 } 341 }
348 342
349 static SkImageGenerator* gen_picture(const SkImageInfo& info) { 343 static SkImageGenerator* gen_picture(const SkImageInfo& info) {
350 SkPictureRecorder recorder; 344 SkPictureRecorder recorder;
351 draw_opaque_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), i nfo.height()))); 345 draw_opaque_contents(recorder.beginRecording(SkRect::MakeIWH(info.width(), i nfo.height())));
352 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 346 SkAutoTUnref<SkPicture> pict(recorder.endRecording());
353 return SkImageGenerator::NewFromPicture(info.dimensions(), pict, nullptr, nu llptr); 347 return SkImageGenerator::NewFromPicture(info.dimensions(), pict, nullptr, nu llptr);
354 } 348 }
355 349
356 static SkImageGenerator* gen_png(const SkImageInfo& info) { 350 static SkImageGenerator* gen_png(const SkImageInfo& info) {
357 SkAutoTUnref<SkImage> image(make_raster(info, nullptr, draw_opaque_contents) ); 351 sk_sp<SkImage> image(make_raster(info, nullptr, draw_opaque_contents));
358 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100)); 352 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kPNG_Type, 100));
359 return SkImageGenerator::NewFromEncoded(data); 353 return SkImageGenerator::NewFromEncoded(data);
360 } 354 }
361 355
362 static SkImageGenerator* gen_jpg(const SkImageInfo& info) { 356 static SkImageGenerator* gen_jpg(const SkImageInfo& info) {
363 SkAutoTUnref<SkImage> image(make_raster(info, nullptr, draw_opaque_contents) ); 357 sk_sp<SkImage> image(make_raster(info, nullptr, draw_opaque_contents));
364 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kJPEG_Type, 100)); 358 SkAutoTUnref<SkData> data(image->encode(SkImageEncoder::kJPEG_Type, 100));
365 return SkImageGenerator::NewFromEncoded(data); 359 return SkImageGenerator::NewFromEncoded(data);
366 } 360 }
367 361
368 typedef SkImageGenerator* (*GeneratorMakerProc)(const SkImageInfo&); 362 typedef SkImageGenerator* (*GeneratorMakerProc)(const SkImageInfo&);
369 363
370 static void show_scaled_generator(SkCanvas* canvas, SkImageGenerator* gen) { 364 static void show_scaled_generator(SkCanvas* canvas, SkImageGenerator* gen) {
371 const SkImageInfo genInfo = gen->getInfo(); 365 const SkImageInfo genInfo = gen->getInfo();
372 366
373 SkAutoCanvasRestore acr(canvas, true); 367 SkAutoCanvasRestore acr(canvas, true);
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 paint.setColor(SK_ColorCYAN); 453 paint.setColor(SK_ColorCYAN);
460 canvas->drawRect(SkRect::MakeXYWH(30.f,30.f,10.f,10.f), paint); 454 canvas->drawRect(SkRect::MakeXYWH(30.f,30.f,10.f,10.f), paint);
461 }; 455 };
462 456
463 static const int kSize = 50; 457 static const int kSize = 50;
464 SkBitmap bmp; 458 SkBitmap bmp;
465 bmp.allocN32Pixels(kSize, kSize); 459 bmp.allocN32Pixels(kSize, kSize);
466 SkCanvas bmpCanvas(bmp); 460 SkCanvas bmpCanvas(bmp);
467 render_image(&bmpCanvas); 461 render_image(&bmpCanvas);
468 462
469 std::function<SkImage*()> imageFactories[] = { 463 std::function<sk_sp<SkImage>()> imageFactories[] = {
470 // Create sw raster image. 464 // Create sw raster image.
471 [bmp] { 465 [bmp] {
472 return SkImage::NewFromBitmap(bmp); 466 return SkImage::MakeFromBitmap(bmp);
473 }, 467 },
474 // Create encoded image. 468 // Create encoded image.
475 [bmp] { 469 [bmp] {
476 SkAutoTUnref<SkData> src( 470 sk_sp<SkData> src(
477 SkImageEncoder::EncodeData(bmp, SkImageEncoder::kPNG_Type, 100)) ; 471 SkImageEncoder::EncodeData(bmp, SkImageEncoder::kPNG_Type, 100)) ;
478 return SkImage::NewFromEncoded(src); 472 return SkImage::MakeFromEncoded(std::move(src));
479 }, 473 },
480 // Create a picture image. 474 // Create a picture image.
481 [render_image] { 475 [render_image] {
482 SkPictureRecorder recorder; 476 SkPictureRecorder recorder;
483 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kSize), SkI ntToScalar(kSize)); 477 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(kSize), SkI ntToScalar(kSize));
484 render_image(canvas); 478 render_image(canvas);
485 SkAutoTUnref<SkPicture> picture(recorder.endRecording()); 479 SkAutoTUnref<SkPicture> picture(recorder.endRecording());
486 return SkImage::NewFromPicture(picture, SkISize::Make(kSize, kSize), nullptr, nullptr); 480 return SkImage::MakeFromPicture(sk_ref_sp(picture.get()), SkISize::M ake(kSize, kSize),
481 nullptr, nullptr);
487 }, 482 },
488 // Create a texture image 483 // Create a texture image
489 [context, render_image]() -> SkImage* { 484 [context, render_image]() -> sk_sp<SkImage> {
490 SkAutoTUnref<SkSurface> surface( 485 SkAutoTUnref<SkSurface> surface(
491 SkSurface::NewRenderTarget(context, SkBudgeted::kYes, 486 SkSurface::NewRenderTarget(context, SkBudgeted::kYes,
492 SkImageInfo::MakeN32Premul(kSize, kSi ze))); 487 SkImageInfo::MakeN32Premul(kSize, kSi ze)));
493 if (!surface) { 488 if (!surface) {
494 return nullptr; 489 return nullptr;
495 } 490 }
496 render_image(surface->getCanvas()); 491 render_image(surface->getCanvas());
497 return surface->newImageSnapshot(); 492 return surface->makeImageSnapshot();
498 } 493 }
499 }; 494 };
500 495
501 static const SkScalar kPad = 5.f; 496 static const SkScalar kPad = 5.f;
502 canvas->translate(kPad, kPad); 497 canvas->translate(kPad, kPad);
503 for (auto factory : imageFactories) { 498 for (auto factory : imageFactories) {
504 SkAutoTUnref<SkImage> image(factory()); 499 auto image(factory());
505 if (!image) { 500 if (!image) {
506 continue; 501 continue;
507 } 502 }
508 if (context) { 503 if (context) {
509 SkAutoTUnref<SkImage> texImage(image->newTextureImage(context)); 504 sk_sp<SkImage> texImage(image->makeTextureImage(context));
510 if (texImage) { 505 if (texImage) {
511 canvas->drawImage(texImage, 0, 0); 506 canvas->drawImage(texImage, 0, 0);
512 } 507 }
513 } 508 }
514 canvas->translate(image->width() + kPad, 0); 509 canvas->translate(image->width() + kPad, 0);
515 } 510 }
516 } 511 }
OLDNEW
« no previous file with comments | « gm/grayscalejpg.cpp ('k') | gm/image_pict.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698