1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7e0e71afc66ee350383486c10e6c760a86663dfcctfarina@chromium.org
86413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com#include "SkCanvas.h"
9d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com#include "SkCommandLineFlags.h"
104b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkData.h"
1199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com#include "SkDocument.h"
12f78cdb4ba9bffb9335f1feffa10f878796a9e14escroggo@google.com#include "SkForceLinking.h"
136413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com#include "SkGraphics.h"
144b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkSurface.h"
154b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkImage.h"
164b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkStream.h"
176413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com#include "SkString.h"
186413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
19f78cdb4ba9bffb9335f1feffa10f878796a9e14escroggo@google.com__SK_FORCE_IMAGE_DECODER_LINKING;
20f78cdb4ba9bffb9335f1feffa10f878796a9e14escroggo@google.com
2199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comDEFINE_string2(outFile, o, "skhello", "The filename to write the image.");
22604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.comDEFINE_string2(text, t, "Hello", "The string to write.");
236413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
2499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic void doDraw(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
2599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkRect bounds;
2699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    canvas->getClipBounds(&bounds);
2799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
2899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    canvas->drawColor(SK_ColorWHITE);
2999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    canvas->drawText(text, strlen(text),
3099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                     bounds.centerX(), bounds.centerY(),
3199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                     paint);
3299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
3399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
3499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic bool do_surface(int w, int h, const char path[], const char text[],
3599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                       const SkPaint& paint) {
36702edbd4bc41230902b5fe69d14d15763c27faferobertphillips    SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
37702edbd4bc41230902b5fe69d14d15763c27faferobertphillips    SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(w, h, &props));
3899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    doDraw(surface->getCanvas(), paint, text);
396319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
4099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
4199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoDataUnref data(image->encode());
422880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    if (nullptr == data.get()) {
4399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return false;
4499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
4599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkFILEWStream stream(path);
4699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return stream.write(data->data(), data->size());
4799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
4899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
4999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic bool do_document(int w, int h, const char path[], const char text[],
5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                        const SkPaint& paint) {
5199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(path));
5299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    if (doc.get()) {
5399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar width = SkIntToScalar(w);
5499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar height = SkIntToScalar(h);
552880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        doDraw(doc->beginPage(width, height, nullptr), paint, text);
5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return true;
5799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
5899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return false;
5999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
6099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
615987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv);
625987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) {
63d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::SetUsage("");
64d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::Parse(argc, argv);
6531ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org
666413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkAutoGraphics ag;
6799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkString path("skhello");
686413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkString text("Hello");
696413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
70604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_outFile.isEmpty()) {
71604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        path.set(FLAGS_outFile[0]);
7231ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org    }
73604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_text.isEmpty()) {
74604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        text.set(FLAGS_text[0]);
756413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    }
766413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
776413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkPaint paint;
786413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setAntiAlias(true);
796413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setTextSize(SkIntToScalar(30));
804b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    paint.setTextAlign(SkPaint::kCenter_Align);
814b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com
826413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar width = paint.measureText(text.c_str(), text.size());
836413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar spacing = paint.getFontSpacing();
846413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
85e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int w = SkScalarRoundToInt(width) + 30;
86e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int h = SkScalarRoundToInt(spacing) + 30;
876413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    static const struct {
8999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        bool (*fProc)(int w, int h, const char path[], const char text[],
9099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                      const SkPaint&);
9199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        const char* fSuffix;
9299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    } gRec[] = {
9399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_surface, ".png" },
9499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_document, ".pdf" },
954b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    };
966319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
9899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkString file;
9999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        file.printf("%s%s", path.c_str(), gRec[i].fSuffix);
10099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        if (!gRec[i].fProc(w, h, file.c_str(), text.c_str(), paint)) {
10199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com            return -1;
10299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        }
1037def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com    }
10499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return 0;
1056413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com}
1065987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
1075987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#if !defined SK_BUILD_FOR_IOS
1085987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) {
1095987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com    return tool_main(argc, (char**) argv);
1105987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
1115987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
112