OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |