1545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org/*
2545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org * Copyright 2014 Google Inc.
3545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org *
4545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org * found in the LICENSE file.
6545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org */
7545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
8545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include <stdio.h>
9545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
10545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkCommandLineFlags.h"
11545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkGraphics.h"
12545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkPicture.h"
13545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkRecordOpts.h"
14545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkRecorder.h"
15545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#include "SkStream.h"
16545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
1785fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org#include "DumpRecord.h"
1885fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org#include "LazyDecodeBitmap.h"
1985fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org
20545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgDEFINE_string2(skps, r, "", ".SKPs to dump.");
21545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgDEFINE_string(match, "", "The usual filters on file names to dump.");
22545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgDEFINE_bool2(optimize, O, false, "Run SkRecordOptimize before dumping.");
2327f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.orgDEFINE_int32(tile, 1000000000, "Simulated tile size.");
2427f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.orgDEFINE_bool(timeWithCommand, false, "If true, print time next to command, else in first column.");
25545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
2627f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.orgstatic void dump(const char* name, int w, int h, const SkRecord& record) {
2727f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.org    SkBitmap bitmap;
2827f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.org    bitmap.allocN32Pixels(w, h);
2927f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.org    SkCanvas canvas(bitmap);
3085fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org    canvas.clipRect(SkRect::MakeWH(SkIntToScalar(FLAGS_tile),
3185fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org                                   SkIntToScalar(FLAGS_tile)));
32545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
33545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    printf("%s %s\n", FLAGS_optimize ? "optimized" : "not-optimized", name);
3427f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.org
3585fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org    DumpRecord(record, &canvas, FLAGS_timeWithCommand);
36545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org}
37545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
3885fd1932231e21703fc4e1846a3769b5a5119c77commit-bot@chromium.org
39545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgint tool_main(int argc, char** argv);
40545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgint tool_main(int argc, char** argv) {
41545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    SkCommandLineFlags::Parse(argc, argv);
42545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    SkAutoGraphics ag;
43545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
44545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    for (int i = 0; i < FLAGS_skps.count(); i++) {
45545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) {
46545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            continue;
47545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        }
48545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
49a1193e4b0e34a7e4e1bd33e9708d7341679f8321scroggo        SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(FLAGS_skps[i]));
50545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        if (!stream) {
51545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            SkDebugf("Could not read %s.\n", FLAGS_skps[i]);
52545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            exit(1);
53545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        }
54545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        SkAutoTUnref<SkPicture> src(
55545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org                SkPicture::CreateFromStream(stream, sk_tools::LazyDecodeBitmap));
56545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        if (!src) {
57545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            SkDebugf("Could not read %s as an SkPicture.\n", FLAGS_skps[i]);
58545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            exit(1);
59545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        }
60a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips        const int w = SkScalarCeilToInt(src->cullRect().width());
61a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips        const int h = SkScalarCeilToInt(src->cullRect().height());
62545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
63545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        SkRecord record;
64a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org        SkRecorder canvas(&record, w, h);
65c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips        src->playback(&canvas);
66545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
67545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        if (FLAGS_optimize) {
68545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org            SkRecordOptimize(&record);
69545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org        }
70545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
7127f6b0d013572184dc980462cce8d0f3caec1c8ecommit-bot@chromium.org        dump(FLAGS_skps[i], w, h, record);
72545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    }
73545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
74545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    return 0;
75545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org}
76545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org
77545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#if !defined SK_BUILD_FOR_IOS
78545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.orgint main(int argc, char * const argv[]) {
79545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org    return tool_main(argc, (char**) argv);
80545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org}
81545a21a71419edcee015fbf7fecaded6bd1477c1commit-bot@chromium.org#endif
82