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