diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp index 25c552c5e0..42428b44b0 100644 --- a/bench/benchmain.cpp +++ b/bench/benchmain.cpp @@ -490,9 +490,6 @@ int tool_main(int argc, char** argv) { SkPictureRecorder recorderTo; const SkIPoint dim = bench->getSize(); - const SkPicture::RecordingFlags kRecordFlags = - SkPicture::kUsePathBoundsForClip_RecordingFlag; - SkAutoTUnref surface; if (SkBenchmark::kNonRendering_Backend != config.backend) { surface.reset(make_surface(config.fColorType, @@ -512,16 +509,13 @@ int tool_main(int argc, char** argv) { canvas.reset(SkDeferredCanvas::Create(surface.get())); break; case kRecord_BenchMode: - canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY, - NULL, kRecordFlags))); + canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY))); break; case kPictureRecord_BenchMode: { SkPictureRecorder recorderFrom; - bench->draw(1, recorderFrom.beginRecording(dim.fX, dim.fY, - NULL, kRecordFlags)); + bench->draw(1, recorderFrom.beginRecording(dim.fX, dim.fY)); recordFrom.reset(recorderFrom.endRecording()); - canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY, - NULL, kRecordFlags))); + canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY))); break; } case kNormal_BenchMode: @@ -587,8 +581,7 @@ int tool_main(int argc, char** argv) { if ((benchMode == kRecord_BenchMode || benchMode == kPictureRecord_BenchMode)) { // Clear the recorded commands so that they do not accumulate. - canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY, - NULL, kRecordFlags))); + canvas.reset(SkRef(recorderTo.beginRecording(dim.fX, dim.fY))); } timer.start(); diff --git a/expectations/gm/ignored-tests.txt b/expectations/gm/ignored-tests.txt index 9cbcdeea5b..a724250f8a 100644 --- a/expectations/gm/ignored-tests.txt +++ b/expectations/gm/ignored-tests.txt @@ -52,3 +52,7 @@ tilemodes shadertext3 drawbitmaprect coloremoji + +# Added by robertphillips for https://codereview.chromium.org/316143003/ +# This CL actually fixes this GM's image +distantclip diff --git a/gm/gmmain.cpp b/gm/gmmain.cpp index 6d3f619b98..37237695c0 100644 --- a/gm/gmmain.cpp +++ b/gm/gmmain.cpp @@ -1669,8 +1669,7 @@ ErrorCombination run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &co // result that can be validated against comparisonBitmap. SkScalar recordScale = SkScalarInvert(replayScale); SkPicture* pict = gmmain.generate_new_picture( - gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFlag, - recordScale); + gm, kTileGrid_BbhType, 0, recordScale); SkAutoUnref aur(pict); SkBitmap bitmap; // We cannot yet pass 'true' to generate_image_from_picture to diff --git a/include/core/SkPicture.h b/include/core/SkPicture.h index fb5e7ffd03..793a2e4793 100644 --- a/include/core/SkPicture.h +++ b/include/core/SkPicture.h @@ -132,6 +132,7 @@ public: */ void clone(SkPicture* pictures, int count) const; +#ifdef SK_SUPPORT_LEGACY_RECORDING_FLAG // TODO: kUsePathBoundsForClip_RecordingFlag no longer belongs in // SkPicture. It should be moved to SkPictureRecorder (or just made // the default behavior). @@ -146,6 +147,7 @@ public: */ kUsePathBoundsForClip_RecordingFlag = 0x01 }; +#endif /** Replays the drawing commands on the specified canvas. @param canvas the canvas receiving the drawing commands. diff --git a/include/core/SkPictureRecorder.h b/include/core/SkPictureRecorder.h index d9372d89d0..e9ddcf5958 100644 --- a/include/core/SkPictureRecorder.h +++ b/include/core/SkPictureRecorder.h @@ -29,10 +29,9 @@ public: @param recordFlags optional flags that control recording. @return the canvas. */ - // TODO: allow default parameters once the other beginRecoding entry point is gone SkCanvas* beginRecording(int width, int height, - SkBBHFactory* bbhFactory /* = NULL */, - uint32_t recordFlags /* = 0 */); + SkBBHFactory* bbhFactory = NULL, + uint32_t recordFlags = 0); /** Returns the recording canvas if one is active, or NULL if recording is not active. This does not alter the refcnt on the canvas (if present). diff --git a/src/core/SkPictureRecord.cpp b/src/core/SkPictureRecord.cpp index 0c59b13b86..1a1aecc600 100644 --- a/src/core/SkPictureRecord.cpp +++ b/src/core/SkPictureRecord.cpp @@ -863,11 +863,7 @@ void SkPictureRecord::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdg #else this->recordClipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); #endif - if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { - this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false); - } else { - this->INHERITED::onClipRRect(rrect, op, edgeStyle); - } + this->updateClipConservativelyUsingBounds(rrect.getBounds(), op, false); } size_t SkPictureRecord::recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) { @@ -899,12 +895,8 @@ void SkPictureRecord::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeSt this->recordClipPath(pathID, op, kSoft_ClipEdgeStyle == edgeStyle); #endif - if (fRecordFlags & SkPicture::kUsePathBoundsForClip_RecordingFlag) { - this->updateClipConservativelyUsingBounds(path.getBounds(), op, - path.isInverseFillType()); - } else { - this->INHERITED::onClipPath(path, op, edgeStyle); - } + this->updateClipConservativelyUsingBounds(path.getBounds(), op, + path.isInverseFillType()); } size_t SkPictureRecord::recordClipPath(int pathID, SkRegion::Op op, bool doAA) { diff --git a/tests/PictureTest.cpp b/tests/PictureTest.cpp index 706cc5c6ac..618ccfc4c0 100644 --- a/tests/PictureTest.cpp +++ b/tests/PictureTest.cpp @@ -315,7 +315,7 @@ static SkPicture* record_bitmaps(const SkBitmap bm[], int count, DrawBitmapProc proc) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(1000, 1000, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(1000, 1000); for (int i = 0; i < count; ++i) { analytic[i].rewind(); canvas->save(); @@ -671,17 +671,17 @@ static void test_gatherpixelrefsandrects(skiatest::Reporter* reporter) { static void test_deleting_empty_playback() { SkPictureRecorder recorder; // Creates an SkPictureRecord - recorder.beginRecording(0, 0, NULL, 0); + recorder.beginRecording(0, 0); // Turns that into an SkPicturePlayback SkAutoTUnref picture(recorder.endRecording()); // Deletes the old SkPicturePlayback, and creates a new SkPictureRecord - recorder.beginRecording(0, 0, NULL, 0); + recorder.beginRecording(0, 0); } // Ensure that serializing an empty picture does not assert. Likewise only runs in debug mode. static void test_serializing_empty_picture() { SkPictureRecorder recorder; - recorder.beginRecording(0, 0, NULL, 0); + recorder.beginRecording(0, 0); SkAutoTUnref picture(recorder.endRecording()); SkDynamicMemoryWStream stream; picture->serialize(&stream); @@ -713,7 +713,7 @@ static void test_gpu_veto(skiatest::Reporter* reporter) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); { SkPath path; path.moveTo(0, 0); @@ -735,7 +735,7 @@ static void test_gpu_veto(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL, &reason)); REPORTER_ASSERT(reporter, NULL != reason); - canvas = recorder.beginRecording(100, 100, NULL, 0); + canvas = recorder.beginRecording(100, 100); { SkPath path; @@ -757,7 +757,7 @@ static void test_gpu_veto(skiatest::Reporter* reporter) { // A lot of AA concave paths currently render an SkPicture undesireable for GPU rendering REPORTER_ASSERT(reporter, !picture->suitableForGpuRasterization(NULL)); - canvas = recorder.beginRecording(100, 100, NULL, 0); + canvas = recorder.beginRecording(100, 100); { SkPath path; @@ -811,7 +811,7 @@ static void test_gpu_picture_optimization(skiatest::Reporter* reporter, { SkPictureRecorder recorder; - SkCanvas* c = recorder.beginRecording(kWidth, kHeight, NULL, 0); + SkCanvas* c = recorder.beginRecording(kWidth, kHeight); // 1) c->saveLayer(NULL, NULL); c->restore(); @@ -978,7 +978,7 @@ public: static SkPicture* Copy(SkPictureRecorder* recorder) { SkPictureRecorder recorder2; - SkCanvas* canvas = recorder2.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder2.beginRecording(10, 10); recorder->partialReplay(canvas); @@ -992,7 +992,7 @@ DEF_TEST(PictureRecorder_replay, reporter) { { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->saveLayer(NULL, NULL); @@ -1015,7 +1015,7 @@ DEF_TEST(PictureRecorder_replay, reporter) { { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); SkRect r = SkRect::MakeWH(5, 5); SkPaint p; @@ -1055,7 +1055,7 @@ static void test_unbalanced_save_restores(skiatest::Reporter* reporter) { { // Create picture with 2 unbalanced saves - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); canvas->save(); canvas->translate(10, 10); canvas->drawRect(rect, paint); @@ -1072,7 +1072,7 @@ static void test_unbalanced_save_restores(skiatest::Reporter* reporter) { { // Create picture with 2 unbalanced restores - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); canvas->save(); canvas->translate(10, 10); canvas->drawRect(rect, paint); @@ -1092,7 +1092,7 @@ static void test_unbalanced_save_restores(skiatest::Reporter* reporter) { set_canvas_to_save_count_4(&testCanvas); { - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); canvas->translate(10, 10); canvas->drawRect(rect, paint); SkAutoTUnref noSavePicture(recorder.endRecording()); @@ -1111,7 +1111,7 @@ static void test_peephole() { for (int j = 0; j < 100; j++) { SkRandom rand2(rand); // remember the seed - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); for (int i = 0; i < 1000; ++i) { rand_op(canvas, rand); @@ -1122,7 +1122,7 @@ static void test_peephole() { } { - SkCanvas* canvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(100, 100); SkRect rect = SkRect::MakeWH(50, 50); for (int i = 0; i < 100; ++i) { @@ -1145,7 +1145,7 @@ static void test_bad_bitmap() { SkBitmap bm; bm.setInfo(SkImageInfo::MakeN32Premul(100, 100)); SkPictureRecorder recorder; - SkCanvas* recordingCanvas = recorder.beginRecording(100, 100, NULL, 0); + SkCanvas* recordingCanvas = recorder.beginRecording(100, 100); recordingCanvas->drawBitmap(bm, 0, 0); SkAutoTUnref picture(recorder.endRecording()); @@ -1160,7 +1160,7 @@ static SkData* encode_bitmap_to_data(size_t*, const SkBitmap& bm) { static SkData* serialized_picture_from_bitmap(const SkBitmap& bitmap) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(bitmap.width(), bitmap.height(), NULL, 0); + SkCanvas* canvas = recorder.beginRecording(bitmap.width(), bitmap.height()); canvas->drawBitmap(bitmap, 0, 0); SkAutoTUnref picture(recorder.endRecording()); @@ -1226,7 +1226,7 @@ static void test_clone_empty(skiatest::Reporter* reporter) { // had a picture with no paints. This test passes by not crashing. { SkPictureRecorder recorder; - recorder.beginRecording(1, 1, NULL, 0); + recorder.beginRecording(1, 1); SkAutoTUnref picture(recorder.endRecording()); SkAutoTUnref destPicture(picture->clone()); REPORTER_ASSERT(reporter, NULL != destPicture); @@ -1242,7 +1242,7 @@ static void test_draw_empty(skiatest::Reporter* reporter) { { // stock SkPicture SkPictureRecorder recorder; - recorder.beginRecording(1, 1, NULL, 0); + recorder.beginRecording(1, 1); SkAutoTUnref picture(recorder.endRecording()); canvas.drawPicture(picture); @@ -1257,7 +1257,7 @@ static void test_draw_empty(skiatest::Reporter* reporter) { SkTileGridFactory factory(gridInfo); SkPictureRecorder recorder; - recorder.beginRecording(1, 1, &factory, 0); + recorder.beginRecording(1, 1, &factory); SkAutoTUnref picture(recorder.endRecording()); canvas.drawPicture(picture); @@ -1267,7 +1267,7 @@ static void test_draw_empty(skiatest::Reporter* reporter) { // RTree SkRTreeFactory factory; SkPictureRecorder recorder; - recorder.beginRecording(1, 1, &factory, 0); + recorder.beginRecording(1, 1, &factory); SkAutoTUnref picture(recorder.endRecording()); canvas.drawPicture(picture); @@ -1277,7 +1277,7 @@ static void test_draw_empty(skiatest::Reporter* reporter) { // quad tree SkQuadTreeFactory factory; SkPictureRecorder recorder; - recorder.beginRecording(1, 1, &factory, 0); + recorder.beginRecording(1, 1, &factory); SkAutoTUnref picture(recorder.endRecording()); canvas.drawPicture(picture); @@ -1305,8 +1305,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { // Minimalist test set for 100% code coverage of // SkPictureRecord::updateClipConservativelyUsingBounds { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(invPath, SkRegion::kIntersect_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); REPORTER_ASSERT(reporter, true == nonEmpty); @@ -1316,8 +1315,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(path, SkRegion::kIntersect_Op); canvas->clipPath(invPath, SkRegion::kIntersect_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); @@ -1328,8 +1326,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(path, SkRegion::kIntersect_Op); canvas->clipPath(invPath, SkRegion::kUnion_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); @@ -1340,8 +1337,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(path, SkRegion::kDifference_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); REPORTER_ASSERT(reporter, true == nonEmpty); @@ -1351,8 +1347,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 10 == clipBounds.fRight); } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(path, SkRegion::kReverseDifference_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); // True clip is actually empty in this case, but the best @@ -1365,8 +1360,7 @@ static void test_clip_bound_opt(skiatest::Reporter* reporter) { REPORTER_ASSERT(reporter, 8 == clipBounds.fRight); } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, - SkPicture::kUsePathBoundsForClip_RecordingFlag); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipPath(path, SkRegion::kIntersect_Op); canvas->clipPath(path2, SkRegion::kXOR_Op); bool nonEmpty = canvas->getClipDeviceBounds(&clipBounds); @@ -1424,7 +1418,7 @@ private: static void test_clip_expansion(skiatest::Reporter* reporter) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->clipRect(SkRect::MakeEmpty(), SkRegion::kReplace_Op); // The following expanding clip should not be skipped. @@ -1448,35 +1442,35 @@ static void test_hierarchical(skiatest::Reporter* reporter) { SkPictureRecorder recorder; - recorder.beginRecording(10, 10, NULL, 0); + recorder.beginRecording(10, 10); SkAutoTUnref childPlain(recorder.endRecording()); REPORTER_ASSERT(reporter, !childPlain->willPlayBackBitmaps()); // 0 - recorder.beginRecording(10, 10, NULL, 0)->drawBitmap(bm, 0, 0); + recorder.beginRecording(10, 10)->drawBitmap(bm, 0, 0); SkAutoTUnref childWithBitmap(recorder.endRecording()); REPORTER_ASSERT(reporter, childWithBitmap->willPlayBackBitmaps()); // 1 { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->drawPicture(childPlain); SkAutoTUnref parentPP(recorder.endRecording()); REPORTER_ASSERT(reporter, !parentPP->willPlayBackBitmaps()); // 0 } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->drawPicture(childWithBitmap); SkAutoTUnref parentPWB(recorder.endRecording()); REPORTER_ASSERT(reporter, parentPWB->willPlayBackBitmaps()); // 1 } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->drawBitmap(bm, 0, 0); canvas->drawPicture(childPlain); SkAutoTUnref parentWBP(recorder.endRecording()); REPORTER_ASSERT(reporter, parentWBP->willPlayBackBitmaps()); // 1 } { - SkCanvas* canvas = recorder.beginRecording(10, 10, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(10, 10); canvas->drawBitmap(bm, 0, 0); canvas->drawPicture(childWithBitmap); SkAutoTUnref parentWBWB(recorder.endRecording()); @@ -1493,7 +1487,7 @@ static void test_gen_id(skiatest::Reporter* reporter) { SkPictureRecorder recorder; - SkCanvas* canvas = recorder.beginRecording(1, 1, NULL, 0); + SkCanvas* canvas = recorder.beginRecording(1, 1); canvas->drawARGB(255, 255, 255, 255); SkAutoTUnref hasData(recorder.endRecording()); // picture should have a non-zero id after recording @@ -1580,7 +1574,7 @@ static void test_draw_bitmaps(SkCanvas* canvas) { DEF_TEST(Picture_EmptyBitmap, r) { SkPictureRecorder recorder; - test_draw_bitmaps(recorder.beginRecording(10, 10, NULL, 0)); + test_draw_bitmaps(recorder.beginRecording(10, 10)); SkAutoTUnref picture(recorder.endRecording()); } diff --git a/tools/PictureRenderer.cpp b/tools/PictureRenderer.cpp index 0343460e32..d337a5ebb7 100644 --- a/tools/PictureRenderer.cpp +++ b/tools/PictureRenderer.cpp @@ -256,12 +256,6 @@ void PictureRenderer::purgeTextures() { #endif } -uint32_t PictureRenderer::recordFlags() { - return (kNone_BBoxHierarchyType == fBBoxHierarchyType) - ? 0 - : SkPicture::kUsePathBoundsForClip_RecordingFlag; -} - /** * Write the canvas to an image file and/or JSON summary. * diff --git a/tools/PictureRenderer.h b/tools/PictureRenderer.h index 57d73cf334..efe118ff08 100644 --- a/tools/PictureRenderer.h +++ b/tools/PictureRenderer.h @@ -413,7 +413,7 @@ protected: void scaleToScaleFactor(SkCanvas*); SkBBHFactory* getFactory(); - uint32_t recordFlags(); + uint32_t recordFlags() const { return 0; } SkCanvas* setupCanvas(); virtual SkCanvas* setupCanvas(int width, int height); diff --git a/tools/bench_playback.cpp b/tools/bench_playback.cpp index 435dd77fb9..ffe9e23e55 100644 --- a/tools/bench_playback.cpp +++ b/tools/bench_playback.cpp @@ -39,8 +39,7 @@ static SkPicture* rerecord_with_tilegrid(SkPicture& src) { SkTileGridFactory factory(info); SkPictureRecorder recorder; - src.draw(recorder.beginRecording(src.width(), src.height(), &factory, - SkPicture::kUsePathBoundsForClip_RecordingFlag)); + src.draw(recorder.beginRecording(src.width(), src.height(), &factory)); return recorder.endRecording(); } diff --git a/tools/bench_record.cpp b/tools/bench_record.cpp index c7941eda98..271597f52a 100644 --- a/tools/bench_record.cpp +++ b/tools/bench_record.cpp @@ -25,7 +25,7 @@ __SK_FORCE_IMAGE_DECODER_LINKING; DEFINE_string2(skps, r, "skps", "Directory containing SKPs to read and re-record."); DEFINE_int32(loops, 900, "Number of times to re-record each SKP."); -DEFINE_int32(flags, SkPicture::kUsePathBoundsForClip_RecordingFlag, "RecordingFlags to use."); +DEFINE_int32(flags, 0, "RecordingFlags to use."); DEFINE_bool(endRecording, true, "If false, don't time SkPicture::endRecording()"); DEFINE_int32(nullSize, 1000, "Pretend dimension of null source picture."); DEFINE_int32(tileGridSize, 512, "Set the tile grid size. Has no effect if bbh is not set to tilegrid.");