Modifying the behavior of render_pictures --validate to test the effect of bbh.
authorjunov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 13 Mar 2013 17:27:16 +0000 (17:27 +0000)
committerjunov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 13 Mar 2013 17:27:16 +0000 (17:27 +0000)
The new behavior consists in using the same renderer, with bbh disabled, as a reference
renderer when the current renderer has a bbh.
Review URL: https://codereview.chromium.org/12801002

git-svn-id: http://skia.googlecode.com/svn/trunk@8132 2bbb7eff-a529-9590-31e7-b0007b416f81

tools/PictureRenderer.h
tools/render_pictures_main.cpp

index b073252199243c23da25f34f6eccc4a4e5e492a8..3fa7a3c3c41ba716af5da1366f1aa79182f40421 100644 (file)
@@ -171,6 +171,8 @@ public:
         fBBoxHierarchyType = bbhType;
     }
 
+    BBoxHierarchyType getBBoxHierarchyType() { return fBBoxHierarchyType; }
+
     void setGridSize(int width, int height) {
         fGridInfo.fTileInterval.set(width, height);
     }
index e5cb74eb99126280c1290dd5656165b9b1b2a45e..dabce4288bf0c0659a96a64d6f7d4fda07aca09d 100644 (file)
@@ -35,7 +35,8 @@ DEFINE_string(w, "", "Directory to write the rendered images.");
 DEFINE_bool(writeWholeImage, false, "In tile mode, write the entire rendered image to a "
             "file, instead of an image for each tile.");
 DEFINE_bool(validate, false, "Verify that the rendered image contains the same pixels as "
-            "the picture rendered in simple mode.");
+            "the picture rendered in simple mode. When used in conjunction with --bbh, results "
+            "are validated against the picture rendered in the same mode, but without the bbh.");
 
 static void make_output_filepath(SkString* path, const SkString& dir,
                                  const SkString& name) {
@@ -142,6 +143,32 @@ static int MaxByteDiff(uint32_t v1, uint32_t v2) {
                    SkMax32(abs(getByte(v1, 2) - getByte(v2, 2)), abs(getByte(v1, 3) - getByte(v2, 3))));
 }
 
+namespace {
+class AutoRestoreBbhType {
+public:
+    AutoRestoreBbhType() {
+        fRenderer = NULL;
+    }
+
+    void set(sk_tools::PictureRenderer* renderer,
+             sk_tools::PictureRenderer::BBoxHierarchyType bbhType) {
+        fRenderer = renderer;
+        fSavedBbhType = renderer->getBBoxHierarchyType();
+        renderer->setBBoxHierarchyType(bbhType);
+    }
+
+    ~AutoRestoreBbhType() {
+        if (NULL != fRenderer) {
+            fRenderer->setBBoxHierarchyType(fSavedBbhType);
+        }
+    }
+
+private:
+    sk_tools::PictureRenderer* fRenderer;
+    sk_tools::PictureRenderer::BBoxHierarchyType fSavedBbhType;
+};
+}
+
 static bool render_picture(const SkString& inputPath, const SkString* outputDir,
                            sk_tools::PictureRenderer& renderer) {
     int diffs[256] = {0};
@@ -159,8 +186,21 @@ static bool render_picture(const SkString& inputPath, const SkString* outputDir,
 
     if (FLAGS_validate) {
         SkBitmap* referenceBitmap = NULL;
-        sk_tools::SimplePictureRenderer referenceRenderer;
-        success = render_picture(inputPath, NULL, referenceRenderer,
+        sk_tools::PictureRenderer* referenceRenderer;
+        // If the renderer uses a BBoxHierarchy, then the reference renderer
+        // will be the same renderer, without the bbh. 
+        AutoRestoreBbhType arbbh;
+        if (sk_tools::PictureRenderer::kNone_BBoxHierarchyType !=
+            renderer.getBBoxHierarchyType()) {
+            referenceRenderer = &renderer;
+            referenceRenderer->ref();  // to match auto unref below
+            arbbh.set(referenceRenderer, sk_tools::PictureRenderer::kNone_BBoxHierarchyType);
+        } else {
+            referenceRenderer = SkNEW(sk_tools::SimplePictureRenderer);
+        }
+        SkAutoTUnref<sk_tools::PictureRenderer> aurReferenceRenderer(referenceRenderer);
+
+        success = render_picture(inputPath, NULL, *referenceRenderer,
                                  &referenceBitmap);
 
         if (!success || NULL == referenceBitmap || NULL == referenceBitmap->getPixels()) {