dump_record.cpp revision 1a3c4b8cce9b6b4024bca8814be61c94cebabc19
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" 92f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkCommandLineFlags.h" 10babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed#include "SkDeferredCanvas.h" 112f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkPicture.h" 12ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkPictureRecorder.h" 13ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkRecordDraw.h" 142f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecordOpts.h" 152f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecorder.h" 162f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkStream.h" 172f2903d7a0bad75014880753f4809c3b12788a82mtklein#include <stdio.h> 182f2903d7a0bad75014880753f4809c3b12788a82mtklein 192f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string2(skps, r, "", ".SKPs to dump."); 202f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string(match, "", "The usual filters on file names to dump."); 212f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool2(optimize, O, false, "Run SkRecordOptimize before dumping."); 22f38b0d86b888692f7d703916114781be43249600reedDEFINE_bool(optimize2, false, "Run SkRecordOptimize2 before dumping."); 232f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_int32(tile, 1000000000, "Simulated tile size."); 242f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool(timeWithCommand, false, "If true, print time next to command, else in first column."); 25ff53af85f61327413adc7c32f0699132b60075a7reedDEFINE_string2(write, w, "", "Write the (optimized) picture to the named file."); 26babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reedDEFINE_bool(defer, false, "Defer clips and translates"); 272f2903d7a0bad75014880753f4809c3b12788a82mtklein 282f2903d7a0bad75014880753f4809c3b12788a82mtkleinstatic void dump(const char* name, int w, int h, const SkRecord& record) { 292f2903d7a0bad75014880753f4809c3b12788a82mtklein SkBitmap bitmap; 302f2903d7a0bad75014880753f4809c3b12788a82mtklein bitmap.allocN32Pixels(w, h); 312f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCanvas canvas(bitmap); 322f2903d7a0bad75014880753f4809c3b12788a82mtklein canvas.clipRect(SkRect::MakeWH(SkIntToScalar(FLAGS_tile), 332f2903d7a0bad75014880753f4809c3b12788a82mtklein SkIntToScalar(FLAGS_tile))); 342f2903d7a0bad75014880753f4809c3b12788a82mtklein 352f2903d7a0bad75014880753f4809c3b12788a82mtklein printf("%s %s\n", FLAGS_optimize ? "optimized" : "not-optimized", name); 362f2903d7a0bad75014880753f4809c3b12788a82mtklein 372f2903d7a0bad75014880753f4809c3b12788a82mtklein DumpRecord(record, &canvas, FLAGS_timeWithCommand); 382f2903d7a0bad75014880753f4809c3b12788a82mtklein} 392f2903d7a0bad75014880753f4809c3b12788a82mtklein 40be28ee2974474800323ce4fabf62a839018be591Mike Kleinint main(int argc, char** argv) { 412f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCommandLineFlags::Parse(argc, argv); 422f2903d7a0bad75014880753f4809c3b12788a82mtklein 432f2903d7a0bad75014880753f4809c3b12788a82mtklein for (int i = 0; i < FLAGS_skps.count(); i++) { 442f2903d7a0bad75014880753f4809c3b12788a82mtklein if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) { 452f2903d7a0bad75014880753f4809c3b12788a82mtklein continue; 462f2903d7a0bad75014880753f4809c3b12788a82mtklein } 472f2903d7a0bad75014880753f4809c3b12788a82mtklein 48f93d71122e4fcfcdc674a0163455990b13855f2fbungeman std::unique_ptr<SkStream> stream = SkStream::MakeFromFile(FLAGS_skps[i]); 492f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!stream) { 502f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s.\n", FLAGS_skps[i]); 512f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 522f2903d7a0bad75014880753f4809c3b12788a82mtklein } 53f93d71122e4fcfcdc674a0163455990b13855f2fbungeman sk_sp<SkPicture> src(SkPicture::MakeFromStream(stream.get())); 542f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!src) { 552f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]); 562f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 572f2903d7a0bad75014880753f4809c3b12788a82mtklein } 58babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed if (FLAGS_defer) { 59babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed SkPictureRecorder recorder; 601a3c4b8cce9b6b4024bca8814be61c94cebabc19Herb Derby SkDeferredCanvas deferred(recorder.beginRecording(src->cullRect()), 611a3c4b8cce9b6b4024bca8814be61c94cebabc19Herb Derby SkDeferredCanvas::kEager); 62babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed src->playback(&deferred); 63babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed src = recorder.finishRecordingAsPicture(); 64babc3de2ce7c2f7b32b1b6b9f36d2ac4a4d8dee1reed } 652f2903d7a0bad75014880753f4809c3b12788a82mtklein const int w = SkScalarCeilToInt(src->cullRect().width()); 662f2903d7a0bad75014880753f4809c3b12788a82mtklein const int h = SkScalarCeilToInt(src->cullRect().height()); 672f2903d7a0bad75014880753f4809c3b12788a82mtklein 682f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecord record; 692f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecorder canvas(&record, w, h); 702f2903d7a0bad75014880753f4809c3b12788a82mtklein src->playback(&canvas); 712f2903d7a0bad75014880753f4809c3b12788a82mtklein 722f2903d7a0bad75014880753f4809c3b12788a82mtklein if (FLAGS_optimize) { 732f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecordOptimize(&record); 742f2903d7a0bad75014880753f4809c3b12788a82mtklein } 75f38b0d86b888692f7d703916114781be43249600reed if (FLAGS_optimize2) { 76f38b0d86b888692f7d703916114781be43249600reed SkRecordOptimize2(&record); 77f38b0d86b888692f7d703916114781be43249600reed } 782f2903d7a0bad75014880753f4809c3b12788a82mtklein 792f2903d7a0bad75014880753f4809c3b12788a82mtklein dump(FLAGS_skps[i], w, h, record); 80ff53af85f61327413adc7c32f0699132b60075a7reed 81ff53af85f61327413adc7c32f0699132b60075a7reed if (FLAGS_write.count() > 0) { 82ff53af85f61327413adc7c32f0699132b60075a7reed SkPictureRecorder r; 83ff53af85f61327413adc7c32f0699132b60075a7reed SkRecordDraw(record, 84ff53af85f61327413adc7c32f0699132b60075a7reed r.beginRecording(SkRect::MakeIWH(w, h)), 85ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 86ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 87ff53af85f61327413adc7c32f0699132b60075a7reed 0, 88ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 89ff53af85f61327413adc7c32f0699132b60075a7reed nullptr); 90ca2622ba051829fed5f30facd74c5b41cd4b931creed sk_sp<SkPicture> dst(r.finishRecordingAsPicture()); 91ff53af85f61327413adc7c32f0699132b60075a7reed SkFILEWStream ostream(FLAGS_write[0]); 92ff53af85f61327413adc7c32f0699132b60075a7reed dst->serialize(&ostream); 93ff53af85f61327413adc7c32f0699132b60075a7reed } 942f2903d7a0bad75014880753f4809c3b12788a82mtklein } 952f2903d7a0bad75014880753f4809c3b12788a82mtklein 962f2903d7a0bad75014880753f4809c3b12788a82mtklein return 0; 972f2903d7a0bad75014880753f4809c3b12788a82mtklein} 98