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) {
363054be16dfdb0d06233770cbfc338958edef44eareed    SkAutoTUnref<SkSurface> surface(SkSurface::NewRasterN32Premul(w, h));
3799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    doDraw(surface->getCanvas(), paint, text);
386319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
3999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
4099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoDataUnref data(image->encode());
4199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    if (NULL == data.get()) {
4299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return false;
4399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
4499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkFILEWStream stream(path);
4599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return stream.write(data->data(), data->size());
4699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
4799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
4899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic bool do_document(int w, int h, const char path[], const char text[],
4999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                        const SkPaint& paint) {
5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(path));
5199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    if (doc.get()) {
5299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar width = SkIntToScalar(w);
5399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar height = SkIntToScalar(h);
5499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        doDraw(doc->beginPage(width, height, NULL), paint, text);
5599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return true;
5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
5799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return false;
5899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
5999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
605987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv);
615987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint tool_main(int argc, char** argv) {
62d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::SetUsage("");
63d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::Parse(argc, argv);
6431ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org
656413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkAutoGraphics ag;
6699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkString path("skhello");
676413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkString text("Hello");
686413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
69604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_outFile.isEmpty()) {
70604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        path.set(FLAGS_outFile[0]);
7131ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org    }
72604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_text.isEmpty()) {
73604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        text.set(FLAGS_text[0]);
746413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    }
756413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
766413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkPaint paint;
776413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setAntiAlias(true);
786413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setTextSize(SkIntToScalar(30));
794b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    paint.setTextAlign(SkPaint::kCenter_Align);
804b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com
816413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar width = paint.measureText(text.c_str(), text.size());
826413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar spacing = paint.getFontSpacing();
836413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
84e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int w = SkScalarRoundToInt(width) + 30;
85e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int h = SkScalarRoundToInt(spacing) + 30;
866413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
8799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    static const struct {
8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        bool (*fProc)(int w, int h, const char path[], const char text[],
8999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                      const SkPaint&);
9099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        const char* fSuffix;
9199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    } gRec[] = {
9299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_surface, ".png" },
9399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_document, ".pdf" },
944b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    };
956319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
9699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkString file;
9899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        file.printf("%s%s", path.c_str(), gRec[i].fSuffix);
9999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        if (!gRec[i].fProc(w, h, file.c_str(), text.c_str(), paint)) {
10099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com            return -1;
10199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        }
1027def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com    }
10399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return 0;
1046413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com}
1055987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com
1065987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#if !defined SK_BUILD_FOR_IOS
1075987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.comint main(int argc, char * const argv[]) {
1085987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com    return tool_main(argc, (char**) argv);
1095987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com}
1105987f58036574ccf23049b5fe71f29a441d0641dcaryclark@google.com#endif
111