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