diff options
Diffstat (limited to 'tests/RecordingXfermodeTest.cpp')
-rw-r--r-- | tests/RecordingXfermodeTest.cpp | 129 |
1 files changed, 32 insertions, 97 deletions
diff --git a/tests/RecordingXfermodeTest.cpp b/tests/RecordingXfermodeTest.cpp index 8da81b3680..aa6bf687a1 100644 --- a/tests/RecordingXfermodeTest.cpp +++ b/tests/RecordingXfermodeTest.cpp @@ -20,20 +20,17 @@ // This arose from http://crbug.com/401593 which has // https://code.google.com/p/skia/issues/detail?id=1291 as its root cause. - namespace { class Drawer { public: - explicit Drawer() - : fImageInfo(SkImageInfo::MakeN32Premul(200,100)) - { - fCircleBM.allocPixels( SkImageInfo::MakeN32Premul(100,100) ); + explicit Drawer() : fImageInfo(SkImageInfo::MakeN32Premul(200, 100)) { + fCircleBM.allocPixels(SkImageInfo::MakeN32Premul(100, 100)); SkCanvas canvas(fCircleBM); canvas.clear(0xffffffff); SkPaint circlePaint; circlePaint.setColor(0xff000000); - canvas.drawCircle(50,50,50,circlePaint); + canvas.drawCircle(50, 50, 50, circlePaint); } const SkImageInfo& imageInfo() const { return fImageInfo; } @@ -48,15 +45,16 @@ class Drawer { SkPaint layerPaint; layerPaint.setColor(0xff000000); layerPaint.setXfermodeMode(mode); - SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fImageInfo.width()),SkIntToScalar(fImageInfo.height()))); + SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fImageInfo.width()), + SkIntToScalar(fImageInfo.height()))); canvas->clipRect(clipRect); canvas->clear(0xff000000); - canvas->saveLayer(NULL,&blackPaint); - canvas->drawRect(canvasRect,greenPaint); - canvas->saveLayer(NULL,&layerPaint); - canvas->drawBitmapRect(fCircleBM,SkRect::MakeXYWH(20,20,60,60),&blackPaint); + canvas->saveLayer(NULL, &blackPaint); + canvas->drawRect(canvasRect, greenPaint); + canvas->saveLayer(NULL, &layerPaint); + canvas->drawBitmapRect(fCircleBM, SkRect::MakeXYWH(20,20,60,60), &blackPaint); canvas->restore(); canvas->restore(); } @@ -69,7 +67,6 @@ class Drawer { class RecordingStrategy { public: virtual ~RecordingStrategy() {} - virtual void init(const SkImageInfo&) = 0; virtual const SkBitmap& recordAndReplay(const Drawer& drawer, const SkRect& intoClip, SkXfermode::Mode) = 0; @@ -78,9 +75,7 @@ class RecordingStrategy { class BitmapBackedCanvasStrategy : public RecordingStrategy { // This version just draws into a bitmap-backed canvas. public: - BitmapBackedCanvasStrategy() {} - - virtual void init(const SkImageInfo& imageInfo) { + BitmapBackedCanvasStrategy(const SkImageInfo& imageInfo) { fBitmap.allocPixels(imageInfo); } @@ -99,57 +94,15 @@ class BitmapBackedCanvasStrategy : public RecordingStrategy { SkBitmap fBitmap; }; -class DeprecatedRecorderStrategy : public RecordingStrategy { - // This version draws the entire scene into an SkPictureRecorder, - // using the deprecated recording backend. - // Then it then replays the scene through a clip rectangle. - // This backend proved to be buggy. - public: - DeprecatedRecorderStrategy() {} - - virtual void init(const SkImageInfo& imageInfo) { - fBitmap.allocPixels(imageInfo); - fWidth = imageInfo.width(); - fHeight= imageInfo.height(); - } - - virtual const SkBitmap& recordAndReplay(const Drawer& drawer, - const SkRect& intoClip, - SkXfermode::Mode mode) { - SkTileGridFactory::TileGridInfo tileGridInfo = { {100,100}, {0,0}, {0,0} }; - SkTileGridFactory factory(tileGridInfo); - SkPictureRecorder recorder; - SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fWidth),SkIntToScalar(fHeight))); - SkCanvas* canvas = recorder.DEPRECATED_beginRecording( SkIntToScalar(fWidth), SkIntToScalar(fHeight), &factory); - drawer.draw(canvas, canvasRect, mode); - SkAutoTDelete<SkPicture> picture(recorder.endRecording()); - - SkCanvas replayCanvas(fBitmap); - replayCanvas.clear(0xffffffff); - replayCanvas.clipRect(intoClip); - picture->playback(&replayCanvas); - - return fBitmap; - } - - private: - SkBitmap fBitmap; - int fWidth; - int fHeight; -}; - -class NewRecordingStrategy : public RecordingStrategy { - // This version draws the entire scene into an SkPictureRecorder, - // using the new recording backend. +class PictureStrategy : public RecordingStrategy { + // This version draws the entire scene into an SkPictureRecorder. // Then it then replays the scene through a clip rectangle. // This backend proved to be buggy. public: - NewRecordingStrategy() {} - - virtual void init(const SkImageInfo& imageInfo) { + PictureStrategy(const SkImageInfo& imageInfo) { fBitmap.allocPixels(imageInfo); - fWidth = imageInfo.width(); - fHeight= imageInfo.height(); + fWidth = imageInfo.width(); + fHeight = imageInfo.height(); } virtual const SkBitmap& recordAndReplay(const Drawer& drawer, @@ -159,8 +112,9 @@ class NewRecordingStrategy : public RecordingStrategy { SkTileGridFactory factory(tileGridInfo); SkPictureRecorder recorder; SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(fWidth),SkIntToScalar(fHeight))); - SkCanvas* canvas = recorder.EXPERIMENTAL_beginRecording( SkIntToScalar(fWidth), SkIntToScalar(fHeight), &factory); - + SkCanvas* canvas = recorder.beginRecording(SkIntToScalar(fWidth), + SkIntToScalar(fHeight), + &factory); drawer.draw(canvas, canvasRect, mode); SkAutoTDelete<SkPicture> picture(recorder.endRecording()); @@ -177,64 +131,45 @@ class NewRecordingStrategy : public RecordingStrategy { int fHeight; }; -} - +} // namespace DEF_TEST(SkRecordingAccuracyXfermode, reporter) { #define FINEGRAIN 0 - const Drawer drawer; - BitmapBackedCanvasStrategy golden; // This is the expected result. - DeprecatedRecorderStrategy deprecatedRecording; - NewRecordingStrategy newRecording; - - golden.init(drawer.imageInfo()); - deprecatedRecording.init(drawer.imageInfo()); - newRecording.init(drawer.imageInfo()); + BitmapBackedCanvasStrategy golden(drawer.imageInfo()); + PictureStrategy picture(drawer.imageInfo()); #if !FINEGRAIN unsigned numErrors = 0; SkString errors; #endif - for (int iMode = 0; iMode < int(SkXfermode::kLastMode) ; iMode++ ) { - const SkRect& clip = SkRect::MakeXYWH(100,0,100,100); + for (int iMode = 0; iMode < int(SkXfermode::kLastMode); iMode++) { + const SkRect& clip = SkRect::MakeXYWH(100, 0, 100, 100); SkXfermode::Mode mode = SkXfermode::Mode(iMode); const SkBitmap& goldenBM = golden.recordAndReplay(drawer, clip, mode); - const SkBitmap& deprecatedBM = deprecatedRecording.recordAndReplay(drawer, clip, mode); - const SkBitmap& newRecordingBM = newRecording.recordAndReplay(drawer, clip, mode); + const SkBitmap& pictureBM = picture.recordAndReplay(drawer, clip, mode); size_t pixelsSize = goldenBM.getSize(); - REPORTER_ASSERT( reporter, pixelsSize == deprecatedBM.getSize() ); - REPORTER_ASSERT( reporter, pixelsSize == newRecordingBM.getSize() ); + REPORTER_ASSERT(reporter, pixelsSize == pictureBM.getSize()); // The pixel arrays should match. #if FINEGRAIN - REPORTER_ASSERT_MESSAGE( reporter, - 0==memcmp( goldenBM.getPixels(), deprecatedBM.getPixels(), pixelsSize ), - "Tiled bitmap is wrong"); - REPORTER_ASSERT_MESSAGE( reporter, - 0==memcmp( goldenBM.getPixels(), recordingBM.getPixels(), pixelsSize ), - "SkRecorder bitmap is wrong"); + REPORTER_ASSERT(reporter, + 0 == memcmp(goldenBM.getPixels(), pictureBM.getPixels(), pixelsSize)); #else - if ( memcmp( goldenBM.getPixels(), deprecatedBM.getPixels(), pixelsSize ) ) { + if (memcmp(goldenBM.getPixels(), pictureBM.getPixels(), pixelsSize)) { numErrors++; - SkString str; - str.printf("For SkXfermode %d %s: Deprecated recorder bitmap is wrong\n", iMode, SkXfermode::ModeName(mode)); - errors.append(str); - } - if ( memcmp( goldenBM.getPixels(), newRecordingBM.getPixels(), pixelsSize ) ) { - numErrors++; - SkString str; - str.printf("For SkXfermode %d %s: SkPictureRecorder bitmap is wrong\n", iMode, SkXfermode::ModeName(mode)); - errors.append(str); + errors.appendf("For SkXfermode %d %s: SkPictureRecorder bitmap is wrong\n", + iMode, SkXfermode::ModeName(mode)); } #endif } + #if !FINEGRAIN - REPORTER_ASSERT_MESSAGE( reporter, 0==numErrors, errors.c_str() ); + REPORTER_ASSERT_MESSAGE(reporter, 0 == numErrors, errors.c_str()); #endif } |