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