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