blob: b8b43f6fe7a7779d910dca09bbd517ff01f84c0a [file] [log] [blame]
caryclarkc3dcb672015-07-21 12:27:36 -07001ο»Ώ/*
tfarina20108912014-06-21 10:54:17 -07002 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +00008#include "sk_tool_utils.h"
Cary Clark992c7b02014-07-31 08:58:44 -04009#include "sk_tool_utils_flags.h"
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +000010
caryclarkc3dcb672015-07-21 12:27:36 -070011#include "Resources.h"
tfarina20108912014-06-21 10:54:17 -070012#include "SkBitmap.h"
13#include "SkCanvas.h"
caryclark6531c362015-07-20 13:38:56 -070014#include "SkCommonFlags.h"
halcanaryb0cce2c2015-01-26 12:49:00 -080015#include "SkShader.h"
Cary Clark992c7b02014-07-31 08:58:44 -040016#include "SkTestScalerContext.h"
joshualitt9e36c1a2015-04-14 12:17:27 -070017#include "SkTextBlob.h"
Cary Clark992c7b02014-07-31 08:58:44 -040018
19DEFINE_bool(portableFonts, false, "Use portable fonts");
20DEFINE_bool(resourceFonts, false, "Use resource fonts");
tfarina20108912014-06-21 10:54:17 -070021
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +000022namespace sk_tool_utils {
23
caryclarkc3dcb672015-07-21 12:27:36 -070024const char* platform_os_emoji() {
25 const char* osName = platform_os_name();
26 if (!strcmp(osName, "Android") || !strcmp(osName, "Unbuntu")) {
27 return "CBDT";
28 }
29 if (!strncmp(osName, "Mac", 3)) {
30 return "SBIX";
31 }
32 return "";
33}
34
35SkTypeface* emoji_typeface() {
36 if (!strcmp(sk_tool_utils::platform_os_emoji(), "CBDT")) {
37 return GetResourceAsTypeface("/fonts/Funkster.ttf");
38 }
39 if (!strcmp(sk_tool_utils::platform_os_emoji(), "SBIX")) {
40 return SkTypeface::CreateFromName("Apple Color Emoji", SkTypeface::kNormal);
41 }
42 return NULL;
43}
44
45const char* emoji_sample_text() {
46 if (!strcmp(sk_tool_utils::platform_os_emoji(), "CBDT")) {
47 return "Hamburgefons";
48 }
49 if (!strcmp(sk_tool_utils::platform_os_emoji(), "SBIX")) {
50 return "\xF0\x9F\x92\xB0" "\xF0\x9F\x8F\xA1" "\xF0\x9F\x8E\x85" // πŸ’°πŸ‘πŸŽ…
51 "\xF0\x9F\x8D\xAA" "\xF0\x9F\x8D\x95" "\xF0\x9F\x9A\x80" // πŸͺπŸ•πŸš€
52 "\xF0\x9F\x9A\xBB" "\xF0\x9F\x92\xA9" "\xF0\x9F\x93\xB7" // πŸš»πŸ’©πŸ“·
53 "\xF0\x9F\x93\xA6" // πŸ“¦
54 "\xF0\x9F\x87\xBA" "\xF0\x9F\x87\xB8" "\xF0\x9F\x87\xA6"; // πŸ‡ΊπŸ‡ΈπŸ‡¦
55 }
56 return "";
57}
58
caryclark6531c362015-07-20 13:38:56 -070059const char* platform_os_name() {
60 for (int index = 0; index < FLAGS_key.count(); index += 2) {
61 if (!strcmp("os", FLAGS_key[index])) {
62 return FLAGS_key[index + 1];
63 }
64 }
65 // when running SampleApp or dm without a --key pair, omit the platform name
66 return "";
67}
68
69const char* platform_extra_config(const char* config) {
70 for (int index = 0; index < FLAGS_key.count(); index += 2) {
71 if (!strcmp("extra_config", FLAGS_key[index]) && !strcmp(config, FLAGS_key[index + 1])) {
72 return config;
73 }
74 }
75 return "";
76}
77
commit-bot@chromium.orga713f9c2014-03-17 21:31:26 +000078const char* colortype_name(SkColorType ct) {
79 switch (ct) {
80 case kUnknown_SkColorType: return "Unknown";
81 case kAlpha_8_SkColorType: return "Alpha_8";
82 case kIndex_8_SkColorType: return "Index_8";
83 case kARGB_4444_SkColorType: return "ARGB_4444";
84 case kRGB_565_SkColorType: return "RGB_565";
85 case kRGBA_8888_SkColorType: return "RGBA_8888";
86 case kBGRA_8888_SkColorType: return "BGRA_8888";
87 default:
88 SkASSERT(false);
89 return "unexpected colortype";
90 }
91}
92
caryclark65cdba62015-06-15 06:51:08 -070093SkColor color_to_565(SkColor color) {
94 SkPMColor pmColor = SkPreMultiplyColor(color);
caryclarkd85093c2015-06-12 11:49:04 -070095 U16CPU color16 = SkPixel32ToPixel16(pmColor);
caryclark65cdba62015-06-15 06:51:08 -070096 return SkPixel16ToColor(color16);
caryclarkd85093c2015-06-12 11:49:04 -070097}
98
Cary Clark992c7b02014-07-31 08:58:44 -040099SkTypeface* create_portable_typeface(const char* name, SkTypeface::Style style) {
100 SkTypeface* face;
101 if (FLAGS_portableFonts) {
102 face = create_font(name, style);
103 } else if (FLAGS_resourceFonts) {
104 face = resource_font(name, style);
105 } else {
106 face = SkTypeface::CreateFromName(name, style);
caryclark5fb6bd42014-06-23 11:25:00 -0700107 }
Cary Clark992c7b02014-07-31 08:58:44 -0400108 return face;
109}
110
caryclark83ca6282015-06-10 09:31:09 -0700111SkTypeface* create_portable_typeface_always(const char* name, SkTypeface::Style style) {
112 return create_font(name, style);
113}
114
Cary Clark992c7b02014-07-31 08:58:44 -0400115void set_portable_typeface(SkPaint* paint, const char* name, SkTypeface::Style style) {
116 SkTypeface* face = create_portable_typeface(name, style);
117 SkSafeUnref(paint->setTypeface(face));
caryclark5fb6bd42014-06-23 11:25:00 -0700118}
119
caryclark83ca6282015-06-10 09:31:09 -0700120void set_portable_typeface_always(SkPaint* paint, const char* name, SkTypeface::Style style) {
121 SkTypeface* face = create_font(name, style);
122 SkSafeUnref(paint->setTypeface(face));
123}
124
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +0000125void write_pixels(SkCanvas* canvas, const SkBitmap& bitmap, int x, int y,
126 SkColorType colorType, SkAlphaType alphaType) {
127 SkBitmap tmp(bitmap);
128 tmp.lockPixels();
skia.committer@gmail.come62513f2014-03-08 03:02:06 +0000129
reede5ea5002014-09-03 11:54:58 -0700130 const SkImageInfo info = SkImageInfo::Make(tmp.width(), tmp.height(), colorType, alphaType);
skia.committer@gmail.come62513f2014-03-08 03:02:06 +0000131
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +0000132 canvas->writePixels(info, tmp.getPixels(), tmp.rowBytes(), x, y);
133}
134
halcanaryb0cce2c2015-01-26 12:49:00 -0800135SkShader* create_checkerboard_shader(SkColor c1, SkColor c2, int size) {
136 SkBitmap bm;
137 bm.allocN32Pixels(2 * size, 2 * size);
138 bm.eraseColor(c1);
139 bm.eraseArea(SkIRect::MakeLTRB(0, 0, size, size), c2);
140 bm.eraseArea(SkIRect::MakeLTRB(size, size, 2 * size, 2 * size), c2);
141 return SkShader::CreateBitmapShader(
142 bm, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
143}
144
145void draw_checkerboard(SkCanvas* canvas, SkColor c1, SkColor c2, int size) {
146 SkPaint paint;
147 paint.setShader(create_checkerboard_shader(c1, c2, size))->unref();
halcanaryf77365f2015-01-27 08:38:35 -0800148 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
halcanaryb0cce2c2015-01-26 12:49:00 -0800149 canvas->drawPaint(paint);
150}
151
joshualitt9e36c1a2015-04-14 12:17:27 -0700152void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint,
153 SkScalar x, SkScalar y) {
154 SkPaint paint(origPaint);
155 SkTDArray<uint16_t> glyphs;
156
157 size_t len = strlen(text);
158 glyphs.append(paint.textToGlyphs(text, len, NULL));
159 paint.textToGlyphs(text, len, glyphs.begin());
160
161 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
162 const SkTextBlobBuilder::RunBuffer& run = builder->allocRun(paint, glyphs.count(), x, y,
163 NULL);
164 memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
165}
166
167
tfarina20108912014-06-21 10:54:17 -0700168} // namespace sk_tool_utils