diff options
author | 2015-07-08 10:06:01 -0700 | |
---|---|---|
committer | 2015-07-08 10:06:01 -0700 | |
commit | 60c047557559e5410063452e59d65377e813e5f2 (patch) | |
tree | 1b2ed7dda6db8edac349e3cac21586658915d11e /tools | |
parent | b2456053c7e20e5439915cd2954c71f73bc85375 (diff) |
Add tools/flatten to flatten nested pictures in .skps.
Tested by running on skps/sp_desk_nytimes.skp.
The output .skp had no nested draw picture calls, and the files were both 9.3M.
BUG=skia:
Review URL: https://codereview.chromium.org/1221303020
Diffstat (limited to 'tools')
-rw-r--r-- | tools/flatten.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tools/flatten.cpp b/tools/flatten.cpp new file mode 100644 index 0000000000..832bd1426d --- /dev/null +++ b/tools/flatten.cpp @@ -0,0 +1,49 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkData.h" +#include "SkForceLinking.h" +#include "SkImageGenerator.h" +#include "SkPicture.h" +#include "SkPictureRecorder.h" +#include "SkStream.h" +#include <stdio.h> + +__SK_FORCE_IMAGE_DECODER_LINKING; + +#define ASSERTF(cond, fmt, ...) if (!(cond)) { fprintf(stderr, fmt"\n", __VA_ARGS__); exit(1); } + +static bool lazy_decode_bitmap(const void* src, size_t size, SkBitmap* dst) { + SkAutoTUnref<SkData> encoded(SkData::NewWithCopy(src, size)); + return encoded && SkInstallDiscardablePixelRef(encoded, dst); +} + +int main(int argc, char** argv) { + ASSERTF(argc == 3, "usage: %s nested.skp flat.skp", argv[0]); + const char *nestedPath = argv[1], + *flatPath = argv[2]; + + // Read nested.skp. + SkFILEStream stream(nestedPath); + ASSERTF(stream.isValid(), "Couldn't read %s.", nestedPath); + SkAutoTUnref<const SkPicture> nested(SkPicture::CreateFromStream(&stream, &lazy_decode_bitmap)); + ASSERTF(nested, "Couldn't parse %s as a picture.", nestedPath); + + // Play it back into a new picture using kPlaybackDrawPicture_RecordFlag. + SkPictureRecorder recorder; + uint32_t flags = SkPictureRecorder::kPlaybackDrawPicture_RecordFlag; + nested->playback(recorder.beginRecording(nested->cullRect(), nullptr, flags)); + SkAutoTUnref<const SkPicture> flat(recorder.endRecordingAsPicture()); + + // Write out that flat.skp + SkFILEWStream wstream(flatPath); + ASSERTF(wstream.isValid(), "Could not open %s.", flatPath); + flat->serialize(&wstream); + wstream.flush(); + + return 0; +} |