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