blob: 4d0e0bde68fffcb756454a4a1bb89b044c7e859c [file] [log] [blame]
tfarina20108912014-06-21 10:54:17 -07001/*
2 * 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
tfarina20108912014-06-21 10:54:17 -070011#include "SkBitmap.h"
12#include "SkCanvas.h"
halcanaryb0cce2c2015-01-26 12:49:00 -080013#include "SkShader.h"
Cary Clark992c7b02014-07-31 08:58:44 -040014#include "SkTestScalerContext.h"
joshualitt9e36c1a2015-04-14 12:17:27 -070015#include "SkTextBlob.h"
Cary Clark992c7b02014-07-31 08:58:44 -040016
17DEFINE_bool(portableFonts, false, "Use portable fonts");
18DEFINE_bool(resourceFonts, false, "Use resource fonts");
tfarina20108912014-06-21 10:54:17 -070019
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +000020namespace sk_tool_utils {
21
commit-bot@chromium.orga713f9c2014-03-17 21:31:26 +000022const char* colortype_name(SkColorType ct) {
23 switch (ct) {
24 case kUnknown_SkColorType: return "Unknown";
25 case kAlpha_8_SkColorType: return "Alpha_8";
26 case kIndex_8_SkColorType: return "Index_8";
27 case kARGB_4444_SkColorType: return "ARGB_4444";
28 case kRGB_565_SkColorType: return "RGB_565";
29 case kRGBA_8888_SkColorType: return "RGBA_8888";
30 case kBGRA_8888_SkColorType: return "BGRA_8888";
31 default:
32 SkASSERT(false);
33 return "unexpected colortype";
34 }
35}
36
caryclark65cdba62015-06-15 06:51:08 -070037SkColor color_to_565(SkColor color) {
38 SkPMColor pmColor = SkPreMultiplyColor(color);
caryclarkd85093c2015-06-12 11:49:04 -070039 U16CPU color16 = SkPixel32ToPixel16(pmColor);
caryclark65cdba62015-06-15 06:51:08 -070040 return SkPixel16ToColor(color16);
caryclarkd85093c2015-06-12 11:49:04 -070041}
42
Cary Clark992c7b02014-07-31 08:58:44 -040043SkTypeface* create_portable_typeface(const char* name, SkTypeface::Style style) {
44 SkTypeface* face;
45 if (FLAGS_portableFonts) {
46 face = create_font(name, style);
47 } else if (FLAGS_resourceFonts) {
48 face = resource_font(name, style);
49 } else {
50 face = SkTypeface::CreateFromName(name, style);
caryclark5fb6bd42014-06-23 11:25:00 -070051 }
Cary Clark992c7b02014-07-31 08:58:44 -040052 return face;
53}
54
caryclark83ca6282015-06-10 09:31:09 -070055SkTypeface* create_portable_typeface_always(const char* name, SkTypeface::Style style) {
56 return create_font(name, style);
57}
58
Cary Clark992c7b02014-07-31 08:58:44 -040059void set_portable_typeface(SkPaint* paint, const char* name, SkTypeface::Style style) {
60 SkTypeface* face = create_portable_typeface(name, style);
61 SkSafeUnref(paint->setTypeface(face));
caryclark5fb6bd42014-06-23 11:25:00 -070062}
63
caryclark83ca6282015-06-10 09:31:09 -070064void set_portable_typeface_always(SkPaint* paint, const char* name, SkTypeface::Style style) {
65 SkTypeface* face = create_font(name, style);
66 SkSafeUnref(paint->setTypeface(face));
67}
68
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +000069void write_pixels(SkCanvas* canvas, const SkBitmap& bitmap, int x, int y,
70 SkColorType colorType, SkAlphaType alphaType) {
71 SkBitmap tmp(bitmap);
72 tmp.lockPixels();
skia.committer@gmail.come62513f2014-03-08 03:02:06 +000073
reede5ea5002014-09-03 11:54:58 -070074 const SkImageInfo info = SkImageInfo::Make(tmp.width(), tmp.height(), colorType, alphaType);
skia.committer@gmail.come62513f2014-03-08 03:02:06 +000075
commit-bot@chromium.org4cd9e212014-03-07 03:25:16 +000076 canvas->writePixels(info, tmp.getPixels(), tmp.rowBytes(), x, y);
77}
78
halcanaryb0cce2c2015-01-26 12:49:00 -080079SkShader* create_checkerboard_shader(SkColor c1, SkColor c2, int size) {
80 SkBitmap bm;
81 bm.allocN32Pixels(2 * size, 2 * size);
82 bm.eraseColor(c1);
83 bm.eraseArea(SkIRect::MakeLTRB(0, 0, size, size), c2);
84 bm.eraseArea(SkIRect::MakeLTRB(size, size, 2 * size, 2 * size), c2);
85 return SkShader::CreateBitmapShader(
86 bm, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode);
87}
88
89void draw_checkerboard(SkCanvas* canvas, SkColor c1, SkColor c2, int size) {
90 SkPaint paint;
91 paint.setShader(create_checkerboard_shader(c1, c2, size))->unref();
halcanaryf77365f2015-01-27 08:38:35 -080092 paint.setXfermodeMode(SkXfermode::kSrc_Mode);
halcanaryb0cce2c2015-01-26 12:49:00 -080093 canvas->drawPaint(paint);
94}
95
joshualitt9e36c1a2015-04-14 12:17:27 -070096void add_to_text_blob(SkTextBlobBuilder* builder, const char* text, const SkPaint& origPaint,
97 SkScalar x, SkScalar y) {
98 SkPaint paint(origPaint);
99 SkTDArray<uint16_t> glyphs;
100
101 size_t len = strlen(text);
102 glyphs.append(paint.textToGlyphs(text, len, NULL));
103 paint.textToGlyphs(text, len, glyphs.begin());
104
105 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
106 const SkTextBlobBuilder::RunBuffer& run = builder->allocRun(paint, glyphs.count(), x, y,
107 NULL);
108 memcpy(run.glyphs, glyphs.begin(), glyphs.count() * sizeof(uint16_t));
109}
110
111
tfarina20108912014-06-21 10:54:17 -0700112} // namespace sk_tool_utils