Index: tools/get_images_from_skps.cpp |
diff --git a/tools/get_images_from_skps.cpp b/tools/get_images_from_skps.cpp |
index 02fbc457a4db7b24e55f493c64d73cb2c8ba4885..64b39b0682528d083dea3df616018f85df4cf609 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; |
} |