aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/get_images_from_skps.cpp
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2016-02-29 09:05:32 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-02-29 09:05:32 -0800
commit2d225e3a0f968e866409e5b300dc1e053ba4a7b7 (patch)
tree7dc823a022ce9ebe9d6faa15c33f7820c891d7f3 /tools/get_images_from_skps.cpp
parent7b6d3a30cf18377935c800603fc00fe0966d15de (diff)
hack up get_images_from_skps
I couldn't get the version at head to give me any images, so I decided to rewrite it. Does something like this work for you? BUG=skia:5010,skia:5005 GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1737593003 Review URL: https://codereview.chromium.org/1737593003
Diffstat (limited to 'tools/get_images_from_skps.cpp')
-rw-r--r--tools/get_images_from_skps.cpp145
1 files changed, 54 insertions, 91 deletions
diff --git a/tools/get_images_from_skps.cpp b/tools/get_images_from_skps.cpp
index 02fbc457a4..64b39b0682 100644
--- a/tools/get_images_from_skps.cpp
+++ b/tools/get_images_from_skps.cpp
@@ -5,135 +5,98 @@
* found in the LICENSE file.
*/
-#include "SkCanvas.h"
#include "SkCodec.h"
#include "SkCommandLineFlags.h"
#include "SkData.h"
+#include "SkMD5.h"
#include "SkOSFile.h"
#include "SkPicture.h"
+#include "SkPixelSerializer.h"
#include "SkStream.h"
+#include "SkTHash.h"
-DEFINE_string2(skps, s, "", "A path to a directory of skps.");
-DEFINE_string2(out, o, "", "A path to an output directory.");
+DEFINE_string2(skps, s, "skps", "A path to a directory of skps.");
+DEFINE_string2(out, o, "img-out", "A path to an output directory.");
-static int gCtr = 0;
-static int gSuccessCtr = 0;
-static int gUnknownCtr = 0;
-static int gFailureCtr = 0;
+static int gKnown;
+static int gUnknown;
static const char* gOutputDir;
-void setup_output_dirs() {
- const char* exts[] = { "jpg", "png", "gif", "webp", "bmp", "wbmp", "ico", "dng", "unknown" };
- for (const char* ext : exts) {
- sk_mkdir(SkOSPath::Join(gOutputDir, ext).c_str());
- }
-}
+static SkTHashSet<SkMD5::Digest> gSeen;
+
+struct Sniffer : public SkPixelSerializer {
+
+ void sniff(const void* ptr, size_t len) {
+ SkMD5 md5;
+ md5.write(ptr, len);
+ SkMD5::Digest digest;
+ md5.finish(digest);
-bool store_encoded_to_file(const void* encoded, size_t length, SkBitmap* bitmap) {
- // Silence warnings about empty bitmaps.
- bitmap->allocN32Pixels(1, 1, true);
+ if (gSeen.contains(digest)) {
+ return;
+ }
+ gSeen.add(digest);
- SkString path;
- SkAutoTUnref<SkData> data(SkData::NewWithoutCopy(encoded, length));
- SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
- if (codec) {
+ SkAutoTUnref<SkData> data(SkData::NewWithoutCopy(ptr, len));
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(data));
+ if (!codec) {
+ gUnknown++;
+ return;
+ }
+ SkString ext;
switch (codec->getEncodedFormat()) {
- case SkEncodedFormat::kJPEG_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "jpg").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".jpg");
- break;
- case SkEncodedFormat::kPNG_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "png").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".png");
- break;
- case SkEncodedFormat::kGIF_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "gif").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".gif");
- break;
- case SkEncodedFormat::kWEBP_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "webp").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".webp");
- break;
- case SkEncodedFormat::kBMP_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "bmp").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".bmp");
- break;
- case SkEncodedFormat::kWBMP_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "wbmp").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".wbmp");
- break;
- case SkEncodedFormat::kICO_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "ico").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".ico");
- break;
- case SkEncodedFormat::kRAW_SkEncodedFormat:
- path = SkOSPath::Join(SkOSPath::Join(gOutputDir, "dng").c_str(), "");
- path.appendS32(gCtr++);
- path.append(".dng");
- break;
- default:
- path = SkOSPath::Join(gOutputDir, "unknown");
- path.appendS32(gUnknownCtr++);
- break;
+ case SkEncodedFormat::kBMP_SkEncodedFormat: ext = "bmp"; break;
+ case SkEncodedFormat::kGIF_SkEncodedFormat: ext = "gif"; break;
+ case SkEncodedFormat::kICO_SkEncodedFormat: ext = "ico"; break;
+ case SkEncodedFormat::kJPEG_SkEncodedFormat: ext = "jpg"; break;
+ case SkEncodedFormat::kPNG_SkEncodedFormat: ext = "png"; break;
+ case SkEncodedFormat::kRAW_SkEncodedFormat: ext = "dng"; break;
+ case SkEncodedFormat::kWBMP_SkEncodedFormat: ext = "wbmp"; break;
+ case SkEncodedFormat::kWEBP_SkEncodedFormat: ext = "webp"; break;
+ default: gUnknown++; return;
}
- } else {
- path = SkOSPath::Join(gOutputDir, "unknown");
- path.appendS32(gUnknownCtr++);
+
+ SkString path;
+ path.appendf("%s/%d.%s", gOutputDir, gKnown++, ext.c_str());
+
+ SkFILEWStream file(path.c_str());
+ file.write(ptr, len);
+
+ SkDebugf("%s\n", path.c_str());
}
- FILE* file = sk_fopen(path.c_str(), kWrite_SkFILE_Flag);
- if (file) {
- sk_fwrite(encoded, length, file);
- sk_fclose(file);
- gSuccessCtr++;
+ bool onUseEncodedData(const void* ptr, size_t len) override {
+ this->sniff(ptr, len);
return true;
}
+ SkData* onEncode(const SkPixmap&) override { return nullptr; }
+};
- gFailureCtr++;
- SkDebugf("Could not open %s\n", path.c_str());
- return false;
-}
int main(int argc, char** argv) {
SkCommandLineFlags::SetUsage(
"Usage: get_images_from_skps -s <dir of skps> -o <dir for output images>\n");
SkCommandLineFlags::Parse(argc, argv);
- if (FLAGS_skps.isEmpty() || FLAGS_out.isEmpty()) {
- SkCommandLineFlags::PrintUsage();
- return 1;
- }
-
const char* inputs = FLAGS_skps[0];
gOutputDir = FLAGS_out[0];
+
if (!sk_isdir(inputs) || !sk_isdir(gOutputDir)) {
SkCommandLineFlags::PrintUsage();
return 1;
}
- setup_output_dirs();
SkOSFile::Iter iter(inputs, "skp");
for (SkString file; iter.next(&file); ) {
SkAutoTDelete<SkStream> stream =
SkStream::NewFromFile(SkOSPath::Join(inputs, file.c_str()).c_str());
+ SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(stream));
- // Rather than passing in a function that actually decodes the encoded data,
- // we pass in a function that saves the encoded data to a file.
- SkAutoTUnref<SkPicture> picture(SkPicture::CreateFromStream(stream, store_encoded_to_file));
-
- SkCanvas canvas;
- canvas.drawPicture(picture);
+ SkDynamicMemoryWStream scratch;
+ Sniffer sniff;
+ picture->serialize(&scratch, &sniff);
}
+ SkDebugf("%d known, %d unknown\n", gKnown, gUnknown);
- SkDebugf("Successfully saved %d recognized images and %d unrecognized images\n", gSuccessCtr,
- gUnknownCtr);
- SkDebugf("Failed to write %d images\n", gFailureCtr);
return 0;
}