12f2903d7a0bad75014880753f4809c3b12788a82mtklein/* 22f2903d7a0bad75014880753f4809c3b12788a82mtklein * Copyright 2014 Google Inc. 32f2903d7a0bad75014880753f4809c3b12788a82mtklein * 42f2903d7a0bad75014880753f4809c3b12788a82mtklein * Use of this source code is governed by a BSD-style license that can be 52f2903d7a0bad75014880753f4809c3b12788a82mtklein * found in the LICENSE file. 62f2903d7a0bad75014880753f4809c3b12788a82mtklein */ 72f2903d7a0bad75014880753f4809c3b12788a82mtklein 82f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "DumpRecord.h" 9ab244f045a0740fa6106ed21a4e5824cd09f84f3Florin Malita#include "SkBitmap.h" 102f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkCommandLineFlags.h" 11babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed#include "SkDeferredCanvas.h" 122f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkPicture.h" 13ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkPictureRecorder.h" 14ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkRecordDraw.h" 152f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecordOpts.h" 162f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecorder.h" 172f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkStream.h" 182f2903d7a0bad75014880753f4809c3b12788a82mtklein#include <stdio.h> 192f2903d7a0bad75014880753f4809c3b12788a82mtklein 202f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string2(skps, r, "", ".SKPs to dump."); 212f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string(match, "", "The usual filters on file names to dump."); 222f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool2(optimize, O, false, "Run SkRecordOptimize before dumping."); 23f38b0d86b888692f7d703916114781be43249600reedDEFINE_bool(optimize2, false, "Run SkRecordOptimize2 before dumping."); 242f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_int32(tile, 1000000000, "Simulated tile size."); 252f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool(timeWithCommand, false, "If true, print time next to command, else in first column."); 26ff53af85f61327413adc7c32f0699132b60075a7reedDEFINE_string2(write, w, "", "Write the (optimized) picture to the named file."); 27babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reedDEFINE_bool(defer, false, "Defer clips and translates"); 282f2903d7a0bad75014880753f4809c3b12788a82mtklein 292f2903d7a0bad75014880753f4809c3b12788a82mtkleinstatic void dump(const char* name, int w, int h, const SkRecord& record) { 302f2903d7a0bad75014880753f4809c3b12788a82mtklein SkBitmap bitmap; 312f2903d7a0bad75014880753f4809c3b12788a82mtklein bitmap.allocN32Pixels(w, h); 322f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCanvas canvas(bitmap); 332f2903d7a0bad75014880753f4809c3b12788a82mtklein canvas.clipRect(SkRect::MakeWH(SkIntToScalar(FLAGS_tile), 342f2903d7a0bad75014880753f4809c3b12788a82mtklein SkIntToScalar(FLAGS_tile))); 352f2903d7a0bad75014880753f4809c3b12788a82mtklein 362f2903d7a0bad75014880753f4809c3b12788a82mtklein printf("%s %s\n", FLAGS_optimize ? "optimized" : "not-optimized", name); 372f2903d7a0bad75014880753f4809c3b12788a82mtklein 382f2903d7a0bad75014880753f4809c3b12788a82mtklein DumpRecord(record, &canvas, FLAGS_timeWithCommand); 392f2903d7a0bad75014880753f4809c3b12788a82mtklein} 402f2903d7a0bad75014880753f4809c3b12788a82mtklein 41be28ee2974474800323ce4fabf62a839018be591Mike Kleinint main(int argc, char** argv) { 422f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCommandLineFlags::Parse(argc, argv); 432f2903d7a0bad75014880753f4809c3b12788a82mtklein 442f2903d7a0bad75014880753f4809c3b12788a82mtklein for (int i = 0; i < FLAGS_skps.count(); i++) { 452f2903d7a0bad75014880753f4809c3b12788a82mtklein if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) { 462f2903d7a0bad75014880753f4809c3b12788a82mtklein continue; 472f2903d7a0bad75014880753f4809c3b12788a82mtklein } 482f2903d7a0bad75014880753f4809c3b12788a82mtklein 49f93d71122e4fcfcdc674a0163455990b13855f2fbungeman std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(FLAGS_skps[i]); 502f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!stream) { 512f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s.\n", FLAGS_skps[i]); 522f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 532f2903d7a0bad75014880753f4809c3b12788a82mtklein } 54f93d71122e4fcfcdc674a0163455990b13855f2fbungeman sk_sp<SkPicture> src(SkPicture::MakeFromStream(stream.get())); 552f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!src) { 562f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]); 572f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 582f2903d7a0bad75014880753f4809c3b12788a82mtklein } 59babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed if (FLAGS_defer) { 60babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed SkPictureRecorder recorder; 611a3c4b8cce9b6b4024bca8814be61c94cebabc19Herb Derby SkDeferredCanvas deferred(recorder.beginRecording(src->cullRect()), 621a3c4b8cce9b6b4024bca8814be61c94cebabc19Herb Derby SkDeferredCanvas::kEager); 63babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed src->playback(&deferred); 64babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed src = recorder.finishRecordingAsPicture(); 65babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed } 662f2903d7a0bad75014880753f4809c3b12788a82mtklein const int w = SkScalarCeilToInt(src->cullRect().width()); 672f2903d7a0bad75014880753f4809c3b12788a82mtklein const int h = SkScalarCeilToInt(src->cullRect().height()); 682f2903d7a0bad75014880753f4809c3b12788a82mtklein 692f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecord record; 702f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecorder canvas(&record, w, h); 712f2903d7a0bad75014880753f4809c3b12788a82mtklein src->playback(&canvas); 722f2903d7a0bad75014880753f4809c3b12788a82mtklein 732f2903d7a0bad75014880753f4809c3b12788a82mtklein if (FLAGS_optimize) { 742f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecordOptimize(&record); 752f2903d7a0bad75014880753f4809c3b12788a82mtklein } 76f38b0d86b888692f7d703916114781be43249600reed if (FLAGS_optimize2) { 77f38b0d86b888692f7d703916114781be43249600reed SkRecordOptimize2(&record); 78f38b0d86b888692f7d703916114781be43249600reed } 792f2903d7a0bad75014880753f4809c3b12788a82mtklein 802f2903d7a0bad75014880753f4809c3b12788a82mtklein dump(FLAGS_skps[i], w, h, record); 81ff53af85f61327413adc7c32f0699132b60075a7reed 82ff53af85f61327413adc7c32f0699132b60075a7reed if (FLAGS_write.count() > 0) { 83ff53af85f61327413adc7c32f0699132b60075a7reed SkPictureRecorder r; 84ff53af85f61327413adc7c32f0699132b60075a7reed SkRecordDraw(record, 85ff53af85f61327413adc7c32f0699132b60075a7reed r.beginRecording(SkRect::MakeIWH(w, h)), 86ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 87ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 88ff53af85f61327413adc7c32f0699132b60075a7reed 0, 89ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 90ff53af85f61327413adc7c32f0699132b60075a7reed nullptr); 91ca2622ba051829fed5f30facd74c5b41cd4b931creed sk_sp<SkPicture> dst(r.finishRecordingAsPicture()); 92ff53af85f61327413adc7c32f0699132b60075a7reed SkFILEWStream ostream(FLAGS_write[0]); 93ff53af85f61327413adc7c32f0699132b60075a7reed dst->serialize(&ostream); 94ff53af85f61327413adc7c32f0699132b60075a7reed } 952f2903d7a0bad75014880753f4809c3b12788a82mtklein } 962f2903d7a0bad75014880753f4809c3b12788a82mtklein 972f2903d7a0bad75014880753f4809c3b12788a82mtklein return 0; 982f2903d7a0bad75014880753f4809c3b12788a82mtklein} 99