dump_record.cpp revision ca2622ba051829fed5f30facd74c5b41cd4b931c
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" 102f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkPicture.h" 11ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkPictureRecorder.h" 12ff53af85f61327413adc7c32f0699132b60075a7reed#include "SkRecordDraw.h" 132f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecordOpts.h" 142f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkRecorder.h" 152f2903d7a0bad75014880753f4809c3b12788a82mtklein#include "SkStream.h" 162f2903d7a0bad75014880753f4809c3b12788a82mtklein#include <stdio.h> 172f2903d7a0bad75014880753f4809c3b12788a82mtklein 182f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string2(skps, r, "", ".SKPs to dump."); 192f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_string(match, "", "The usual filters on file names to dump."); 202f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool2(optimize, O, false, "Run SkRecordOptimize before dumping."); 21f38b0d86b888692f7d703916114781be43249600reedDEFINE_bool(optimize2, false, "Run SkRecordOptimize2 before dumping."); 222f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_int32(tile, 1000000000, "Simulated tile size."); 232f2903d7a0bad75014880753f4809c3b12788a82mtkleinDEFINE_bool(timeWithCommand, false, "If true, print time next to command, else in first column."); 24ff53af85f61327413adc7c32f0699132b60075a7reedDEFINE_string2(write, w, "", "Write the (optimized) picture to the named file."); 252f2903d7a0bad75014880753f4809c3b12788a82mtklein 262f2903d7a0bad75014880753f4809c3b12788a82mtkleinstatic void dump(const char* name, int w, int h, const SkRecord& record) { 272f2903d7a0bad75014880753f4809c3b12788a82mtklein SkBitmap bitmap; 282f2903d7a0bad75014880753f4809c3b12788a82mtklein bitmap.allocN32Pixels(w, h); 292f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCanvas canvas(bitmap); 302f2903d7a0bad75014880753f4809c3b12788a82mtklein canvas.clipRect(SkRect::MakeWH(SkIntToScalar(FLAGS_tile), 312f2903d7a0bad75014880753f4809c3b12788a82mtklein SkIntToScalar(FLAGS_tile))); 322f2903d7a0bad75014880753f4809c3b12788a82mtklein 332f2903d7a0bad75014880753f4809c3b12788a82mtklein printf("%s %s\n", FLAGS_optimize ? "optimized" : "not-optimized", name); 342f2903d7a0bad75014880753f4809c3b12788a82mtklein 352f2903d7a0bad75014880753f4809c3b12788a82mtklein DumpRecord(record, &canvas, FLAGS_timeWithCommand); 362f2903d7a0bad75014880753f4809c3b12788a82mtklein} 372f2903d7a0bad75014880753f4809c3b12788a82mtklein 382f2903d7a0bad75014880753f4809c3b12788a82mtkleinint tool_main(int argc, char** argv); 392f2903d7a0bad75014880753f4809c3b12788a82mtkleinint tool_main(int argc, char** argv) { 402f2903d7a0bad75014880753f4809c3b12788a82mtklein SkCommandLineFlags::Parse(argc, argv); 412f2903d7a0bad75014880753f4809c3b12788a82mtklein 422f2903d7a0bad75014880753f4809c3b12788a82mtklein for (int i = 0; i < FLAGS_skps.count(); i++) { 432f2903d7a0bad75014880753f4809c3b12788a82mtklein if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) { 442f2903d7a0bad75014880753f4809c3b12788a82mtklein continue; 452f2903d7a0bad75014880753f4809c3b12788a82mtklein } 462f2903d7a0bad75014880753f4809c3b12788a82mtklein 472f2903d7a0bad75014880753f4809c3b12788a82mtklein SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(FLAGS_skps[i])); 482f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!stream) { 492f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s.\n", FLAGS_skps[i]); 502f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 512f2903d7a0bad75014880753f4809c3b12788a82mtklein } 52ca2622ba051829fed5f30facd74c5b41cd4b931creed sk_sp<SkPicture> src(SkPicture::MakeFromStream(stream)); 532f2903d7a0bad75014880753f4809c3b12788a82mtklein if (!src) { 542f2903d7a0bad75014880753f4809c3b12788a82mtklein SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]); 552f2903d7a0bad75014880753f4809c3b12788a82mtklein return 1; 562f2903d7a0bad75014880753f4809c3b12788a82mtklein } 572f2903d7a0bad75014880753f4809c3b12788a82mtklein const int w = SkScalarCeilToInt(src->cullRect().width()); 582f2903d7a0bad75014880753f4809c3b12788a82mtklein const int h = SkScalarCeilToInt(src->cullRect().height()); 592f2903d7a0bad75014880753f4809c3b12788a82mtklein 602f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecord record; 612f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecorder canvas(&record, w, h); 622f2903d7a0bad75014880753f4809c3b12788a82mtklein src->playback(&canvas); 632f2903d7a0bad75014880753f4809c3b12788a82mtklein 642f2903d7a0bad75014880753f4809c3b12788a82mtklein if (FLAGS_optimize) { 652f2903d7a0bad75014880753f4809c3b12788a82mtklein SkRecordOptimize(&record); 662f2903d7a0bad75014880753f4809c3b12788a82mtklein } 67f38b0d86b888692f7d703916114781be43249600reed if (FLAGS_optimize2) { 68f38b0d86b888692f7d703916114781be43249600reed SkRecordOptimize2(&record); 69f38b0d86b888692f7d703916114781be43249600reed } 702f2903d7a0bad75014880753f4809c3b12788a82mtklein 712f2903d7a0bad75014880753f4809c3b12788a82mtklein dump(FLAGS_skps[i], w, h, record); 72ff53af85f61327413adc7c32f0699132b60075a7reed 73ff53af85f61327413adc7c32f0699132b60075a7reed if (FLAGS_write.count() > 0) { 74ff53af85f61327413adc7c32f0699132b60075a7reed SkPictureRecorder r; 75ff53af85f61327413adc7c32f0699132b60075a7reed SkRecordDraw(record, 76ff53af85f61327413adc7c32f0699132b60075a7reed r.beginRecording(SkRect::MakeIWH(w, h)), 77ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 78ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 79ff53af85f61327413adc7c32f0699132b60075a7reed 0, 80ff53af85f61327413adc7c32f0699132b60075a7reed nullptr, 81ff53af85f61327413adc7c32f0699132b60075a7reed nullptr); 82ca2622ba051829fed5f30facd74c5b41cd4b931creed sk_sp<SkPicture> dst(r.finishRecordingAsPicture()); 83ff53af85f61327413adc7c32f0699132b60075a7reed SkFILEWStream ostream(FLAGS_write[0]); 84ff53af85f61327413adc7c32f0699132b60075a7reed dst->serialize(&ostream); 85ff53af85f61327413adc7c32f0699132b60075a7reed } 862f2903d7a0bad75014880753f4809c3b12788a82mtklein } 872f2903d7a0bad75014880753f4809c3b12788a82mtklein 882f2903d7a0bad75014880753f4809c3b12788a82mtklein return 0; 892f2903d7a0bad75014880753f4809c3b12788a82mtklein} 902f2903d7a0bad75014880753f4809c3b12788a82mtklein 912f2903d7a0bad75014880753f4809c3b12788a82mtklein#if !defined SK_BUILD_FOR_IOS 922f2903d7a0bad75014880753f4809c3b12788a82mtkleinint main(int argc, char * const argv[]) { 932f2903d7a0bad75014880753f4809c3b12788a82mtklein return tool_main(argc, (char**) argv); 942f2903d7a0bad75014880753f4809c3b12788a82mtklein} 952f2903d7a0bad75014880753f4809c3b12788a82mtklein#endif 96