| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "Test.h" | 8 #include "Test.h" |
| 9 | 9 |
| 10 #include "../include/core/SkCanvas.h" | 10 #include "../include/core/SkCanvas.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 fCircleBM.allocPixels(SkImageInfo::MakeN32Premul(100, 100)); | 27 fCircleBM.allocPixels(SkImageInfo::MakeN32Premul(100, 100)); |
| 28 SkCanvas canvas(fCircleBM); | 28 SkCanvas canvas(fCircleBM); |
| 29 canvas.clear(0xffffffff); | 29 canvas.clear(0xffffffff); |
| 30 SkPaint circlePaint; | 30 SkPaint circlePaint; |
| 31 circlePaint.setColor(0xff000000); | 31 circlePaint.setColor(0xff000000); |
| 32 canvas.drawCircle(50, 50, 50, circlePaint); | 32 canvas.drawCircle(50, 50, 50, circlePaint); |
| 33 } | 33 } |
| 34 | 34 |
| 35 const SkImageInfo& imageInfo() const { return fImageInfo; } | 35 const SkImageInfo& imageInfo() const { return fImageInfo; } |
| 36 | 36 |
| 37 void draw(SkCanvas* canvas, const SkRect& clipRect, SkXfermode::Mode mode) c
onst { | 37 void draw(SkCanvas* canvas, const SkRect& clipRect, SkBlendMode mode) const
{ |
| 38 SkPaint greenPaint; | 38 SkPaint greenPaint; |
| 39 greenPaint.setColor(0xff008000); | 39 greenPaint.setColor(0xff008000); |
| 40 SkPaint blackPaint; | 40 SkPaint blackPaint; |
| 41 blackPaint.setColor(0xff000000); | 41 blackPaint.setColor(0xff000000); |
| 42 SkPaint whitePaint; | 42 SkPaint whitePaint; |
| 43 whitePaint.setColor(0xffffffff); | 43 whitePaint.setColor(0xffffffff); |
| 44 SkPaint layerPaint; | 44 SkPaint layerPaint; |
| 45 layerPaint.setColor(0xff000000); | 45 layerPaint.setColor(0xff000000); |
| 46 layerPaint.setXfermodeMode(mode); | 46 layerPaint.setBlendMode(mode); |
| 47 SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fImageInfo.width()), | 47 SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fImageInfo.width()), |
| 48 SkIntToScalar(fImageInfo.height()))); | 48 SkIntToScalar(fImageInfo.height()))); |
| 49 | 49 |
| 50 canvas->clipRect(clipRect); | 50 canvas->clipRect(clipRect); |
| 51 canvas->clear(0xff000000); | 51 canvas->clear(0xff000000); |
| 52 | 52 |
| 53 canvas->saveLayer(nullptr, &blackPaint); | 53 canvas->saveLayer(nullptr, &blackPaint); |
| 54 canvas->drawRect(canvasRect, greenPaint); | 54 canvas->drawRect(canvasRect, greenPaint); |
| 55 canvas->saveLayer(nullptr, &layerPaint); | 55 canvas->saveLayer(nullptr, &layerPaint); |
| 56 canvas->drawBitmapRect(fCircleBM, SkRect::MakeXYWH(20,20,60,60),
&blackPaint); | 56 canvas->drawBitmapRect(fCircleBM, SkRect::MakeXYWH(20,20,60,60),
&blackPaint); |
| 57 canvas->restore(); | 57 canvas->restore(); |
| 58 canvas->restore(); | 58 canvas->restore(); |
| 59 } | 59 } |
| 60 | 60 |
| 61 private: | 61 private: |
| 62 const SkImageInfo fImageInfo; | 62 const SkImageInfo fImageInfo; |
| 63 SkBitmap fCircleBM; | 63 SkBitmap fCircleBM; |
| 64 }; | 64 }; |
| 65 | 65 |
| 66 class RecordingStrategy { | 66 class RecordingStrategy { |
| 67 public: | 67 public: |
| 68 virtual ~RecordingStrategy() {} | 68 virtual ~RecordingStrategy() {} |
| 69 virtual const SkBitmap& recordAndReplay(const Drawer& drawer, | 69 virtual const SkBitmap& recordAndReplay(const Drawer& drawer, |
| 70 const SkRect& intoClip, | 70 const SkRect& intoClip, |
| 71 SkXfermode::Mode) = 0; | 71 SkBlendMode) = 0; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 class BitmapBackedCanvasStrategy : public RecordingStrategy { | 74 class BitmapBackedCanvasStrategy : public RecordingStrategy { |
| 75 // This version just draws into a bitmap-backed canvas. | 75 // This version just draws into a bitmap-backed canvas. |
| 76 public: | 76 public: |
| 77 BitmapBackedCanvasStrategy(const SkImageInfo& imageInfo) { | 77 BitmapBackedCanvasStrategy(const SkImageInfo& imageInfo) { |
| 78 fBitmap.allocPixels(imageInfo); | 78 fBitmap.allocPixels(imageInfo); |
| 79 } | 79 } |
| 80 | 80 |
| 81 virtual const SkBitmap& recordAndReplay(const Drawer& drawer, | 81 const SkBitmap& recordAndReplay(const Drawer& drawer, const SkRect& intoClip
, |
| 82 const SkRect& intoClip, | 82 SkBlendMode mode) override { |
| 83 SkXfermode::Mode mode) { | |
| 84 SkCanvas canvas(fBitmap); | 83 SkCanvas canvas(fBitmap); |
| 85 canvas.clear(0xffffffff); | 84 canvas.clear(0xffffffff); |
| 86 // Note that the scene is drawn just into the clipped region! | 85 // Note that the scene is drawn just into the clipped region! |
| 87 canvas.clipRect(intoClip); | 86 canvas.clipRect(intoClip); |
| 88 drawer.draw(&canvas, intoClip, mode); // Shouild be canvas-wide... | 87 drawer.draw(&canvas, intoClip, mode); // Shouild be canvas-wide... |
| 89 return fBitmap; | 88 return fBitmap; |
| 90 } | 89 } |
| 91 | 90 |
| 92 private: | 91 private: |
| 93 SkBitmap fBitmap; | 92 SkBitmap fBitmap; |
| 94 }; | 93 }; |
| 95 | 94 |
| 96 class PictureStrategy : public RecordingStrategy { | 95 class PictureStrategy : public RecordingStrategy { |
| 97 // This version draws the entire scene into an SkPictureRecorder. | 96 // This version draws the entire scene into an SkPictureRecorder. |
| 98 // Then it then replays the scene through a clip rectangle. | 97 // Then it then replays the scene through a clip rectangle. |
| 99 // This backend proved to be buggy. | 98 // This backend proved to be buggy. |
| 100 public: | 99 public: |
| 101 PictureStrategy(const SkImageInfo& imageInfo) { | 100 PictureStrategy(const SkImageInfo& imageInfo) { |
| 102 fBitmap.allocPixels(imageInfo); | 101 fBitmap.allocPixels(imageInfo); |
| 103 fWidth = imageInfo.width(); | 102 fWidth = imageInfo.width(); |
| 104 fHeight = imageInfo.height(); | 103 fHeight = imageInfo.height(); |
| 105 } | 104 } |
| 106 | 105 |
| 107 virtual const SkBitmap& recordAndReplay(const Drawer& drawer, | 106 const SkBitmap& recordAndReplay(const Drawer& drawer, const SkRect& intoClip
, |
| 108 const SkRect& intoClip, | 107 SkBlendMode mode) override { |
| 109 SkXfermode::Mode mode) { | |
| 110 SkRTreeFactory factory; | 108 SkRTreeFactory factory; |
| 111 SkPictureRecorder recorder; | 109 SkPictureRecorder recorder; |
| 112 SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fWidth),SkIntToScalar(fHe
ight))); | 110 SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fWidth),SkIntToScalar(fHe
ight))); |
| 113 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(fWidth), | 111 SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(fWidth), |
| 114 SkIntToScalar(fHeight), | 112 SkIntToScalar(fHeight), |
| 115 &factory); | 113 &factory); |
| 116 drawer.draw(canvas, canvasRect, mode); | 114 drawer.draw(canvas, canvasRect, mode); |
| 117 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); | 115 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); |
| 118 | 116 |
| 119 SkCanvas replayCanvas(fBitmap); | 117 SkCanvas replayCanvas(fBitmap); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 137 const Drawer drawer; | 135 const Drawer drawer; |
| 138 | 136 |
| 139 BitmapBackedCanvasStrategy golden(drawer.imageInfo()); | 137 BitmapBackedCanvasStrategy golden(drawer.imageInfo()); |
| 140 PictureStrategy picture(drawer.imageInfo()); | 138 PictureStrategy picture(drawer.imageInfo()); |
| 141 | 139 |
| 142 #if !FINEGRAIN | 140 #if !FINEGRAIN |
| 143 unsigned numErrors = 0; | 141 unsigned numErrors = 0; |
| 144 SkString errors; | 142 SkString errors; |
| 145 #endif | 143 #endif |
| 146 | 144 |
| 147 for (int iMode = 0; iMode < int(SkXfermode::kLastMode); iMode++) { | 145 for (int iMode = 0; iMode < int(SkBlendMode::kLastMode); iMode++) { |
| 148 const SkRect& clip = SkRect::MakeXYWH(100, 0, 100, 100); | 146 const SkRect& clip = SkRect::MakeXYWH(100, 0, 100, 100); |
| 149 SkXfermode::Mode mode = SkXfermode::Mode(iMode); | 147 SkBlendMode mode = SkBlendMode(iMode); |
| 150 | 148 |
| 151 const SkBitmap& goldenBM = golden.recordAndReplay(drawer, clip, mode); | 149 const SkBitmap& goldenBM = golden.recordAndReplay(drawer, clip, mode); |
| 152 const SkBitmap& pictureBM = picture.recordAndReplay(drawer, clip, mode); | 150 const SkBitmap& pictureBM = picture.recordAndReplay(drawer, clip, mode); |
| 153 | 151 |
| 154 size_t pixelsSize = goldenBM.getSize(); | 152 size_t pixelsSize = goldenBM.getSize(); |
| 155 REPORTER_ASSERT(reporter, pixelsSize == pictureBM.getSize()); | 153 REPORTER_ASSERT(reporter, pixelsSize == pictureBM.getSize()); |
| 156 | 154 |
| 157 // The pixel arrays should match. | 155 // The pixel arrays should match. |
| 158 #if FINEGRAIN | 156 #if FINEGRAIN |
| 159 REPORTER_ASSERT(reporter, | 157 REPORTER_ASSERT(reporter, |
| 160 0 == memcmp(goldenBM.getPixels(), pictureBM.getPixels(),
pixelsSize)); | 158 0 == memcmp(goldenBM.getPixels(), pictureBM.getPixels(),
pixelsSize)); |
| 161 #else | 159 #else |
| 162 if (memcmp(goldenBM.getPixels(), pictureBM.getPixels(), pixelsSize)) { | 160 if (memcmp(goldenBM.getPixels(), pictureBM.getPixels(), pixelsSize)) { |
| 163 numErrors++; | 161 numErrors++; |
| 164 errors.appendf("For SkXfermode %d %s: SkPictureRecorder bitmap is
wrong\n", | 162 errors.appendf("For SkXfermode %d %s: SkPictureRecorder bitmap is
wrong\n", |
| 165 iMode, SkXfermode::ModeName(mode)); | 163 iMode, SkXfermode::ModeName(mode)); |
| 166 } | 164 } |
| 167 #endif | 165 #endif |
| 168 } | 166 } |
| 169 | 167 |
| 170 #if !FINEGRAIN | 168 #if !FINEGRAIN |
| 171 REPORTER_ASSERT_MESSAGE(reporter, 0 == numErrors, errors.c_str()); | 169 REPORTER_ASSERT_MESSAGE(reporter, 0 == numErrors, errors.c_str()); |
| 172 #endif | 170 #endif |
| 173 } | 171 } |
| OLD | NEW |