Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index aca86968c90eda0b22330b356300782e318912fd..c9bdcf6706771a6b253756ed7827d8d354eb3c56 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -1004,6 +1004,36 @@ static Error draw_to_canvas(Sink* sink, SkBitmap* bitmap, SkWStream* stream, SkS |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+DEFINE_bool(check, true, "If true, have most Via- modes fail if they affect the output."); |
+ |
+// Is *bitmap identical to what you get drawing src into sink? |
+static Error check_against_reference(const SkBitmap* bitmap, const Src& src, Sink* sink) { |
+ // We can only check raster outputs. |
+ // (Non-raster outputs like .pdf, .skp, .svg may differ but still draw identically.) |
+ if (FLAGS_check && bitmap) { |
+ SkBitmap reference; |
+ SkString log; |
+ Error err = sink->draw(src, &reference, nullptr, &log); |
+ // If we can draw into this Sink via some pipeline, we should be able to draw directly. |
+ SkASSERT(err.isEmpty()); |
+ if (!err.isEmpty()) { |
+ return err; |
+ } |
+ // The dimensions are a property of the Src only, and so should be identical. |
+ SkASSERT(reference.getSize() == bitmap->getSize()); |
+ if (reference.getSize() != bitmap->getSize()) { |
+ return "Dimensions don't match reference"; |
+ } |
+ // All SkBitmaps in DM are pre-locked and tight, so this comparison is easy. |
+ if (0 != memcmp(reference.getPixels(), bitmap->getPixels(), reference.getSize())) { |
+ return "Pixels don't match reference"; |
+ } |
+ } |
+ return ""; |
+} |
+ |
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+ |
static SkISize auto_compute_translate(SkMatrix* matrix, int srcW, int srcH) { |
SkRect bounds = SkRect::MakeIWH(srcW, srcH); |
matrix->mapRect(&bounds); |
@@ -1073,15 +1103,6 @@ Error ViaRemote::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStr |
Error ViaSerialization::draw( |
const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { |
- // Draw the Src directly as a reference. |
- SkBitmap reference; |
- if (bitmap) { |
- Error err = fSink->draw(src, &reference, nullptr, log); |
- if (!err.isEmpty()) { |
- return err; |
- } |
- } |
- |
// Record our Src into a picture. |
auto size = src.size(); |
SkPictureRecorder recorder; |
@@ -1100,16 +1121,7 @@ Error ViaSerialization::draw( |
return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) { |
canvas->drawPicture(deserialized); |
- // Check against the reference if we have one. |
- if (bitmap) { |
- if (reference.getSize() != bitmap->getSize()) { |
- return "Serialized and direct have different dimensions."; |
- } |
- if (0 != memcmp(reference.getPixels(), bitmap->getPixels(), reference.getSize())) { |
- return "Serialized and direct have different pixels."; |
- } |
- } |
- return ""; |
+ return check_against_reference(bitmap, src, fSink); |
}); |
} |
@@ -1169,6 +1181,24 @@ Error ViaTiles::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+Error ViaPicture::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkString* log) const { |
+ auto size = src.size(); |
+ return draw_to_canvas(fSink, bitmap, stream, log, size, [&](SkCanvas* canvas) -> Error { |
+ SkPictureRecorder recorder; |
+ SkAutoTUnref<SkPicture> pic; |
+ Error err = src.draw(recorder.beginRecording(SkIntToScalar(size.width()), |
+ SkIntToScalar(size.height()))); |
+ if (!err.isEmpty()) { |
+ return err; |
+ } |
+ pic.reset(recorder.endRecordingAsPicture()); |
+ canvas->drawPicture(pic); |
+ return check_against_reference(bitmap, src, fSink); |
+ }); |
+} |
+ |
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+ |
// Draw the Src into two pictures, then draw the second picture into the wrapped Sink. |
// This tests that any shortcuts we may take while recording that second picture are legal. |
Error ViaSecondPicture::draw( |
@@ -1186,7 +1216,7 @@ Error ViaSecondPicture::draw( |
pic.reset(recorder.endRecordingAsPicture()); |
} |
canvas->drawPicture(pic); |
- return ""; |
+ return check_against_reference(bitmap, src, fSink); |
}); |
} |
@@ -1203,7 +1233,7 @@ Error ViaTwice::draw(const Src& src, SkBitmap* bitmap, SkWStream* stream, SkStri |
return err; |
} |
} |
- return ""; |
+ return check_against_reference(bitmap, src, fSink); |
}); |
} |
@@ -1273,7 +1303,7 @@ Error ViaSingletonPictures::draw( |
SkAutoTUnref<SkPicture> macroPic(macroRec.endRecordingAsPicture()); |
canvas->drawPicture(macroPic); |
- return ""; |
+ return check_against_reference(bitmap, src, fSink); |
}); |
} |