180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
9e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger#include "SkCommandLineFlags.h"
107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkData.h"
1158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkDocument.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkGraphics.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkSurface.h"
147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkImage.h"
157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkStream.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkString.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek SollenbergerDEFINE_string2(outFile, o, "skhello", "The filename to write the image.");
197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek SollenbergerDEFINE_string2(text, t, "Hello", "The string to write.");
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic void doDraw(SkCanvas* canvas, const SkPaint& paint, const char text[]) {
2258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkRect bounds;
2358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    canvas->getClipBounds(&bounds);
2458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
2558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    canvas->drawColor(SK_ColorWHITE);
2658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    canvas->drawText(text, strlen(text),
2758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                     bounds.centerX(), bounds.centerY(),
2858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                     paint);
2958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
3058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic bool do_surface(int w, int h, const char path[], const char text[],
3258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                       const SkPaint& paint) {
3358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkImage::Info info = {
3458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        w, h, SkImage::kPMColor_ColorType, SkImage::kPremul_AlphaType
3558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    };
3658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<SkSurface> surface(SkSurface::NewRaster(info));
3758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    doDraw(surface->getCanvas(), paint, text);
3858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
3958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<SkImage> image(surface->newImageSnapshot());
4058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoDataUnref data(image->encode());
4158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (NULL == data.get()) {
4258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return false;
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
4458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkFILEWStream stream(path);
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return stream.write(data->data(), data->size());
4658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
4758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
4858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenbergerstatic bool do_document(int w, int h, const char path[], const char text[],
4958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                        const SkPaint& paint) {
5058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkAutoTUnref<SkDocument> doc(SkDocument::CreatePDF(path));
5158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    if (doc.get()) {
5258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkScalar width = SkIntToScalar(w);
5358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkScalar height = SkIntToScalar(h);
5458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        doDraw(doc->beginPage(width, height, NULL), paint, text);
5558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        return true;
5658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
5758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return false;
5858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger}
5958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint tool_main(int argc, char** argv);
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint tool_main(int argc, char** argv) {
62e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    SkCommandLineFlags::SetUsage("");
63e2022cc36e47b9f0d219eb5cd24be61772c28d3bDerek Sollenberger    SkCommandLineFlags::Parse(argc, argv);
64096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkAutoGraphics ag;
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    SkString path("skhello");
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkString text("Hello");
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    if (!FLAGS_outFile.isEmpty()) {
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        path.set(FLAGS_outFile[0]);
71096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    if (!FLAGS_text.isEmpty()) {
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        text.set(FLAGS_text[0]);
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaint paint;
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setAntiAlias(true);
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    paint.setTextSize(SkIntToScalar(30));
797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    paint.setTextAlign(SkPaint::kCenter_Align);
807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar width = paint.measureText(text.c_str(), text.size());
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar spacing = paint.getFontSpacing();
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int w = SkScalarRound(width) + 30;
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int h = SkScalarRound(spacing) + 30;
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    static const struct {
8858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        bool (*fProc)(int w, int h, const char path[], const char text[],
8958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                      const SkPaint&);
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        const char* fSuffix;
9158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    } gRec[] = {
9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        { do_surface, ".png" },
9358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        { do_document, ".pdf" },
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    };
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) {
9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        SkString file;
9858190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        file.printf("%s%s", path.c_str(), gRec[i].fSuffix);
9958190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        if (!gRec[i].fProc(w, h, file.c_str(), text.c_str(), paint)) {
10058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger            return -1;
10158190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger        }
10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    }
10358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    return 0;
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#if !defined SK_BUILD_FOR_IOS
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruint main(int argc, char * const argv[]) {
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return tool_main(argc, (char**) argv);
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
111