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"
126413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com#include "SkGraphics.h"
134b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkSurface.h"
144b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkImage.h"
154b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com#include "SkStream.h"
166413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com#include "SkString.h"
176413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
1899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comDEFINE_string2(outFile, o, "skhello", "The filename to write the image.");
19604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.comDEFINE_string2(text, t, "Hello", "The string to write.");
206413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
2199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic void doDraw(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
22918e144408ba218df919528f8b48c544f4767883Mike Reed    SkRect bounds = canvas->getLocalClipBounds();
2399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
2499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    canvas->drawColor(SK_ColorWHITE);
2599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    canvas->drawText(text, strlen(text),
2699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                     bounds.centerX(), bounds.centerY(),
2799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                     paint);
2899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
2999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
3099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic bool do_surface(int w, int h, const char path[], const char text[],
3199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                       const SkPaint& paint) {
32702edbd4bc41230902b5fe69d14d15763c27faferobertphillips    SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
33e8f3062a36d3682f4019309a32b5b84dc9eddf8creed    sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(w, h, &props));
3499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    doDraw(surface->getCanvas(), paint, text);
356319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
369ce9d6772df650ceb0511f275e1a83dffa78ff72reed    sk_sp<SkImage> image(surface->makeImageSnapshot());
3738d909ec2875f79952de08f36adfaac5680d2c53bungeman    sk_sp<SkData> data(image->encode());
3838d909ec2875f79952de08f36adfaac5680d2c53bungeman    if (!data) {
3999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return false;
4099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
4199ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkFILEWStream stream(path);
4299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return stream.write(data->data(), data->size());
4399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
4499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
4599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.comstatic bool do_document(int w, int h, const char path[], const char text[],
4699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                        const SkPaint& paint) {
47676ab68b04597c997e3152f31c08090c0d2ccbe4halcanary    sk_sp<SkDocument> doc(SkDocument::MakePDF(path));
4899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    if (doc.get()) {
4999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar width = SkIntToScalar(w);
5099ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkScalar height = SkIntToScalar(h);
5196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        doDraw(doc->beginPage(width, height, nullptr), paint, text);
5299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        return true;
5399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    }
5499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return false;
5599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com}
5699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com
57be28ee2974474800323ce4fabf62a839018be591Mike Kleinint main(int argc, char** argv) {
58d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::SetUsage("");
59d9ba9a05d6f5766fdb1378b6ed84c0659009a8dascroggo@google.com    SkCommandLineFlags::Parse(argc, argv);
6031ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org
616413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkAutoGraphics ag;
6299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    SkString path("skhello");
636413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkString text("Hello");
646413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
65604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_outFile.isEmpty()) {
66604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        path.set(FLAGS_outFile[0]);
6731ea3394a03f010f31d512e753a9f30ca3313e23commit-bot@chromium.org    }
68604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com    if (!FLAGS_text.isEmpty()) {
69604e0c249ef0e11a1b8bc41195081363fd86d892scroggo@google.com        text.set(FLAGS_text[0]);
706413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    }
716413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
726413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkPaint paint;
736413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setAntiAlias(true);
746413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    paint.setTextSize(SkIntToScalar(30));
754b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    paint.setTextAlign(SkPaint::kCenter_Align);
764b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com
776413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar width = paint.measureText(text.c_str(), text.size());
786413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com    SkScalar spacing = paint.getFontSpacing();
796413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
80e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int w = SkScalarRoundToInt(width) + 30;
81e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com    int h = SkScalarRoundToInt(spacing) + 30;
826413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com
8399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    static const struct {
8499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        bool (*fProc)(int w, int h, const char path[], const char text[],
8599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com                      const SkPaint&);
8699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        const char* fSuffix;
8799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    } gRec[] = {
8899ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_surface, ".png" },
8999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        { do_document, ".pdf" },
904b0757b7489ee5d6bd7149bbcdb0b2af6b7a21cbreed@google.com    };
916319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
9299ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
9399ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        SkString file;
9499ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        file.printf("%s%s", path.c_str(), gRec[i].fSuffix);
9599ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        if (!gRec[i].fProc(w, h, file.c_str(), text.c_str(), paint)) {
9699ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com            return -1;
9799ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com        }
987def5e1630d47cdbfa4b58a9c86bc060693c4d79scroggo@google.com    }
9999ac02bb701c1e30b20f2174aac25ffbe487c0afreed@google.com    return 0;
1006413e79414b4a8e4111cfd4c35959d10d9312440reed@android.com}
101