blob: 9e3929291213f2d303bfdce8c9ca9714e049d662 [file] [log] [blame]
halcanarydecb21e2015-12-10 07:52:45 -08001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include <stdio.h>
halcanaryf0270c32016-05-23 09:02:38 -07009#include <stdlib.h>
halcanarydecb21e2015-12-10 07:52:45 -080010
halcanarydecb21e2015-12-10 07:52:45 -080011#include "fiddle_main.h"
12
13// Globals externed in fiddle_main.h
14SkBitmap source;
halcanary7b8b2372016-04-18 08:17:56 -070015sk_sp<SkImage> image;
halcanarydecb21e2015-12-10 07:52:45 -080016
17static void encode_to_base64(const void* data, size_t size, FILE* out) {
18 const uint8_t* input = reinterpret_cast<const uint8_t*>(data);
19 const uint8_t* end = &input[size];
20 static const char codes[] =
21 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
22 "abcdefghijklmnopqrstuvwxyz0123456789+/";
23 while (input != end) {
24 uint8_t b = (*input & 0xFC) >> 2;
25 fputc(codes[b], out);
26 b = (*input & 0x03) << 4;
27 ++input;
28 if (input == end) {
29 fputc(codes[b], out);
30 fputs("==", out);
31 return;
32 }
33 b |= (*input & 0xF0) >> 4;
34 fputc(codes[b], out);
35 b = (*input & 0x0F) << 2;
36 ++input;
37 if (input == end) {
38 fputc(codes[b], out);
39 fputc('=', out);
40 return;
41 }
42 b |= (*input & 0xC0) >> 6;
43 fputc(codes[b], out);
44 b = *input & 0x3F;
45 fputc(codes[b], out);
46 ++input;
47 }
48}
49
halcanaryd0964592016-03-25 11:29:34 -070050static void dump_output(const sk_sp<SkData>& data,
51 const char* name, bool last = true) {
halcanarydecb21e2015-12-10 07:52:45 -080052 if (data) {
53 printf("\t\"%s\": \"", name);
54 encode_to_base64(data->data(), data->size(), stdout);
55 fputs(last ? "\"\n" : "\",\n", stdout);
56 }
57}
58
halcanaryd0964592016-03-25 11:29:34 -070059static SkData* encode_snapshot(const sk_sp<SkSurface>& surface) {
halcanary7b8b2372016-04-18 08:17:56 -070060 sk_sp<SkImage> img(surface->makeImageSnapshot());
halcanarydecb21e2015-12-10 07:52:45 -080061 return img ? img->encode() : nullptr;
62}
63
mtkleinf4197812016-08-25 08:44:49 -070064#if defined(__linux) && !defined(__ANDROID__)
mtklein7d10b9f2016-07-27 11:17:18 -070065 #include <GL/osmesa.h>
66 static sk_sp<GrContext> create_grcontext() {
67 // We just leak the OSMesaContext... the process will die soon anyway.
68 if (OSMesaContext osMesaContext = OSMesaCreateContextExt(OSMESA_BGRA, 0, 0, 0, nullptr)) {
69 static uint32_t buffer[16 * 16];
70 OSMesaMakeCurrent(osMesaContext, &buffer, GL_UNSIGNED_BYTE, 16, 16);
71 }
halcanarydecb21e2015-12-10 07:52:45 -080072
mtklein7d10b9f2016-07-27 11:17:18 -070073 auto osmesa_get = [](void* ctx, const char name[]) {
74 SkASSERT(nullptr == ctx);
75 SkASSERT(OSMesaGetCurrentContext());
76 return OSMesaGetProcAddress(name);
77 };
78 sk_sp<const GrGLInterface> mesa(GrGLAssembleInterface(nullptr, osmesa_get));
79 if (!mesa) {
80 return nullptr;
81 }
82 return sk_sp<GrContext>(GrContext::Create(
83 kOpenGL_GrBackend,
84 reinterpret_cast<intptr_t>(mesa.get())));
halcanarya5598a42016-03-31 10:35:13 -070085 }
mtklein7d10b9f2016-07-27 11:17:18 -070086#else
87 static sk_sp<GrContext> create_grcontext() { return nullptr; }
88#endif
halcanarydecb21e2015-12-10 07:52:45 -080089
halcanarydecb21e2015-12-10 07:52:45 -080090int main() {
91 const DrawOptions options = GetDrawOptions();
halcanarydecb21e2015-12-10 07:52:45 -080092 if (options.source) {
bungeman38d909e2016-08-02 14:40:46 -070093 sk_sp<SkData> data(SkData::MakeFromFileName(options.source));
halcanarydecb21e2015-12-10 07:52:45 -080094 if (!data) {
95 perror(options.source);
96 return 1;
97 } else {
halcanary7b8b2372016-04-18 08:17:56 -070098 image = SkImage::MakeFromEncoded(std::move(data));
halcanarydecb21e2015-12-10 07:52:45 -080099 if (!image) {
100 perror("Unable to decode the source image.");
101 return 1;
102 }
103 SkAssertResult(image->asLegacyBitmap(
104 &source, SkImage::kRO_LegacyBitmapMode));
105 }
106 }
halcanaryd0964592016-03-25 11:29:34 -0700107 sk_sp<SkData> rasterData, gpuData, pdfData, skpData;
halcanarydecb21e2015-12-10 07:52:45 -0800108 if (options.raster) {
halcanaryd0964592016-03-25 11:29:34 -0700109 auto rasterSurface =
110 SkSurface::MakeRaster(SkImageInfo::MakeN32Premul(options.size));
halcanaryf0270c32016-05-23 09:02:38 -0700111 srand(0);
halcanarydecb21e2015-12-10 07:52:45 -0800112 draw(rasterSurface->getCanvas());
113 rasterData.reset(encode_snapshot(rasterSurface));
114 }
115 if (options.gpu) {
mtklein7d10b9f2016-07-27 11:17:18 -0700116 auto grContext = create_grcontext();
halcanarydecb21e2015-12-10 07:52:45 -0800117 if (!grContext) {
mtklein7d10b9f2016-07-27 11:17:18 -0700118 fputs("Unable to get GrContext.\n", stderr);
halcanarydecb21e2015-12-10 07:52:45 -0800119 } else {
halcanaryd0964592016-03-25 11:29:34 -0700120 auto surface = SkSurface::MakeRenderTarget(
121 grContext.get(),
122 SkBudgeted::kNo,
123 SkImageInfo::MakeN32Premul(options.size));
halcanarydecb21e2015-12-10 07:52:45 -0800124 if (!surface) {
125 fputs("Unable to get render surface.\n", stderr);
126 exit(1);
127 }
halcanaryf0270c32016-05-23 09:02:38 -0700128 srand(0);
halcanarydecb21e2015-12-10 07:52:45 -0800129 draw(surface->getCanvas());
130 gpuData.reset(encode_snapshot(surface));
131 }
halcanarydecb21e2015-12-10 07:52:45 -0800132 }
133 if (options.pdf) {
134 SkDynamicMemoryWStream pdfStream;
halcanary676ab682016-05-03 12:10:04 -0700135 sk_sp<SkDocument> document(SkDocument::MakePDF(&pdfStream));
mtkleincd01b032016-08-31 04:58:19 -0700136 if (document) {
137 srand(0);
138 draw(document->beginPage(options.size.width(), options.size.height()));
139 document->close();
reed42943c82016-09-12 12:01:44 -0700140 pdfData = pdfStream.detachAsData();
mtkleincd01b032016-08-31 04:58:19 -0700141 }
halcanarydecb21e2015-12-10 07:52:45 -0800142 }
143 if (options.skp) {
144 SkSize size;
145 size = options.size;
146 SkPictureRecorder recorder;
halcanaryf0270c32016-05-23 09:02:38 -0700147 srand(0);
halcanarydecb21e2015-12-10 07:52:45 -0800148 draw(recorder.beginRecording(size.width(), size.height()));
halcanaryd0964592016-03-25 11:29:34 -0700149 auto picture = recorder.finishRecordingAsPicture();
halcanarydecb21e2015-12-10 07:52:45 -0800150 SkDynamicMemoryWStream skpStream;
151 picture->serialize(&skpStream);
reed42943c82016-09-12 12:01:44 -0700152 skpData = skpStream.detachAsData();
halcanarydecb21e2015-12-10 07:52:45 -0800153 }
154
155 printf("{\n");
156 dump_output(rasterData, "Raster", !gpuData && !pdfData && !skpData);
157 dump_output(gpuData, "Gpu", !pdfData && !skpData);
158 dump_output(pdfData, "Pdf", !skpData);
159 dump_output(skpData, "Skp");
160 printf("}\n");
161
halcanarydecb21e2015-12-10 07:52:45 -0800162 return 0;
163}