Index: experimental/fiddle/fiddle_main.cpp |
diff --git a/experimental/fiddle/fiddle_main.cpp b/experimental/fiddle/fiddle_main.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca0302d9be95a63c85f1bbe52b4ed343316c4d55 |
--- /dev/null |
+++ b/experimental/fiddle/fiddle_main.cpp |
@@ -0,0 +1,145 @@ |
+/* |
+ * 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 <stdio.h> |
+ |
+#include "base64.h" |
+#include "fiddle_main.h" |
+#include "OSMesaContextHolder.h" |
+ |
+// Globals externed in fiddle_main.h |
+SkBitmap source; |
+SkImage* image(nullptr); |
mtklein
2015/09/17 13:58:22
Just curious: you seem to be managing this manuall
|
+ |
+const char* FLAGS_source(nullptr); |
mtklein
2015/09/17 13:58:22
Any reason these FLAGS_ guys aren't static?
|
+int32_t FLAGS_width(256); |
+int32_t FLAGS_height(256); |
+bool FLAGS_gpu(false); |
+bool FLAGS_noraster(false); |
+bool FLAGS_pdf(false); |
+ |
+static void help() { |
+ const char options[] = |
+ "\nOptions:\n" |
+ " --width WIDTH Set the canvas width (default is 256).\n" |
+ " --height HEIGHT Set the canvas height (default is 256).\n" |
+ " --source PATH Set the source image file.\n" |
+ " --noraster Disable the raster backend.\n" |
mtklein
2015/09/17 13:58:22
Why are any of these options? Let's just run them
|
+ " --gpu Enable the GPU backend.\n" |
+ " --pdf Enable the PDF backend.\n\n"; |
+ fputs(options, stderr); |
mtklein
2015/09/17 13:58:22
If you use fprintf you can keep your (default is %
|
+ exit(2); |
+} |
+ |
+static void parse_flags(int, char** argv) { |
+ ++argv; // skip argv[0] |
+ while (*argv) { // argv is always NULL-terminated |
+ if (0 == strcmp(*argv, "--width")) { |
+ if (!*++argv) { |
+ help(); |
+ } |
+ FLAGS_width = atoi(*argv); |
+ } else if (0 == strcmp(*argv, "--height")) { |
+ if (!*++argv) { |
+ help(); |
+ } |
+ FLAGS_height = atoi(*argv); |
+ } else if (0 == strcmp(*argv, "--source")) { |
+ if (!*++argv) { |
+ help(); |
+ } |
+ FLAGS_source = *argv; |
+ } else if (0 == strcmp(*argv, "--gpu")) { |
+ FLAGS_gpu = true; |
+ } else if (0 == strcmp(*argv, "--noraster")) { |
+ FLAGS_noraster = true; |
+ } else if (0 == strcmp(*argv, "--pdf")) { |
+ FLAGS_pdf = true; |
+ } else { |
+ help(); |
+ } |
+ ++argv; |
+ } |
+} |
+ |
+static void dump_output(SkData* pngData, const char* name, bool last = true) { |
+ if (pngData) { |
+ printf("\t\"%s\": \"", name); |
+ EncodeToBase64(pngData->data(), pngData->size(), stdout); |
+ fputs(last ? "\"\n" : "\",\n", stdout); |
+ } |
+} |
+ |
+static SkData* encode_snapshot(SkSurface* surface) { |
+ SkAutoTUnref<SkImage> img(surface->newImageSnapshot()); |
+ return img ? img->encode() : nullptr; |
+} |
+ |
+static GrContext* create_mesa_grcontext() { |
+ SkAutoTUnref<const GrGLInterface> mesa(GrGLCreateMesaInterface()); |
+ intptr_t backend = reinterpret_cast<intptr_t>(mesa.get()); |
+ return backend ? GrContext::Create(kOpenGL_GrBackend, backend) : nullptr; |
+} |
+ |
+int main(int argc, char** argv) { |
+ parse_flags(argc, argv); |
+ if (FLAGS_source) { |
+ SkAutoTUnref<SkData> data(SkData::NewFromFileName(FLAGS_source)); |
+ if (!data) { |
+ perror("Unable to open the source image file."); |
mtklein
2015/09/17 13:58:22
I don't think you mean to be using perror. perror
|
+ } else { |
+ image = SkImage::NewFromEncoded(data); |
+ bool success = SkInstallDiscardablePixelRef(data, &source); |
+ if (!image || !success) { |
+ perror("Unable to decode the source image."); |
+ } |
+ } |
+ } |
+ SkISize size = SkISize::Make(FLAGS_width, FLAGS_height); |
+ SkAutoTUnref<SkData> rasterData, gpuData, pdfData; |
+ if (!FLAGS_noraster) { |
+ SkAutoTUnref<SkSurface> rasterSurface( |
+ SkSurface::NewRaster(SkImageInfo::MakeN32Premul(size))); |
+ draw(rasterSurface->getCanvas()); |
+ rasterData.reset(encode_snapshot(rasterSurface)); |
+ } |
+ if (FLAGS_gpu) { |
+ OSMesaContextHolder osMesaContextHolder; |
+ SkAutoTUnref<GrContext> grContext(create_mesa_grcontext()); |
+ if (!grContext) { |
+ fputs("Unable to get Mesa GrContext.\n", stderr); |
+ } else { |
+ SkAutoTUnref<SkSurface> surface( |
+ SkSurface::NewRenderTarget( |
+ grContext, |
+ SkSurface::kNo_Budgeted, |
+ SkImageInfo::MakeN32Premul(size))); |
+ if (!surface) { |
+ fputs("Unable to get render surface.\n", stderr); |
+ exit(1); |
+ } |
+ draw(surface->getCanvas()); |
+ gpuData.reset(encode_snapshot(surface)); |
+ } |
+ } |
+ if (FLAGS_pdf) { |
+ SkDynamicMemoryWStream pdfStream; |
+ SkAutoTUnref<SkDocument> document(SkDocument::CreatePDF(&pdfStream)); |
+ draw(document->beginPage(FLAGS_width, FLAGS_height)); |
+ document->close(); |
+ pdfData.reset(pdfStream.copyToData()); |
+ } |
+ |
+ printf("{\n"); |
+ dump_output(rasterData, "Raster", !gpuData && !pdfData); |
+ dump_output(gpuData, "Gpu", !pdfData); |
+ dump_output(pdfData, "Pdf"); |
+ printf("}\n"); |
+ |
+ SkSafeSetNull(image); |
+ return 0; |
+} |