142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/* 242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * Copyright 2011 Google Inc. 342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * 442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com * found in the LICENSE file. 642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com */ 783f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org 842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 1042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkCanvas.h" 1142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkGradientShader.h" 1242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 1342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comnamespace skiagm { 1442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 15dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.orgstatic void makebm(SkBitmap* bm, int w, int h) { 16dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm->allocN32Pixels(w, h); 17dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bm->eraseColor(SK_ColorTRANSPARENT); 1842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 1942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkCanvas canvas(*bm); 2042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkScalar s = SkIntToScalar(SkMin32(w, h)); 21dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const SkPoint kPts0[] = { { 0, 0 }, { s, s } }; 22dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const SkPoint kPts1[] = { { s/2, 0 }, { s/2, s } }; 23dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const SkScalar kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; 24dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 }; 25dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 }; 26f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 2742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 2842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint paint; 2942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 301a9b9640843a64af8d9d90337ec3b3fea663196areed paint.setShader(SkGradientShader::MakeLinear(kPts0, kColors0, kPos, 311a9b9640843a64af8d9d90337ec3b3fea663196areed SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode)); 3242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas.drawPaint(paint); 331a9b9640843a64af8d9d90337ec3b3fea663196areed paint.setShader(SkGradientShader::MakeLinear(kPts1, kColors1, kPos, 341a9b9640843a64af8d9d90337ec3b3fea663196areed SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode)); 3542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas.drawPaint(paint); 3642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com} 3742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 3842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 3942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 4042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstruct LabeledMatrix { 4142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkMatrix fMatrix; 4242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com const char* fLabel; 4342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}; 4442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 45dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr char kText[] = "B"; 46dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kTextLen = SK_ARRAY_COUNT(kText) - 1; 47dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr int kPointSize = 300; 48a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org 4942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comclass ShaderText3GM : public GM { 5042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.compublic: 5142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com ShaderText3GM() { 5265cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 5342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 5442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 5542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprotected: 5642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 5736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 5842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com return SkString("shadertext3"); 5942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 6042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 616dc14aab5ea6be87b5b10f17a19737f586708768reed SkISize onISize() override{ return SkISize::Make(820, 930); } 6242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 6336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 64a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org makebm(&fBmp, kPointSize / 4, kPointSize / 4); 65a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org } 6642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 6736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 68f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 6942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint bmpPaint; 7042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com bmpPaint.setAntiAlias(true); 7193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed bmpPaint.setFilterQuality(kLow_SkFilterQuality); 7242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com bmpPaint.setAlpha(0x80); 73a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint); 7442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 7542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint outlinePaint; 7642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setAntiAlias(true); 771818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&outlinePaint); 7842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setTextSize(SkIntToScalar(kPointSize)); 7942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setStyle(SkPaint::kStroke_Style); 8042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setStrokeWidth(0.f); 81f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 8242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(15.f, 15.f); 83f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 8442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com // draw glyphs scaled up 8542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->scale(2.f, 2.f); 8642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 87dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr SkShader::TileMode kTileModes[] = { 8842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkShader::kRepeat_TileMode, 8942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkShader::kMirror_TileMode, 9042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com }; 91f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 9242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com // position the baseline of the first run 9342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(0.f, 0.75f * kPointSize); 94f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 9542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->save(); 9642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com int i = 0; 97f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) { 9842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) { 9942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkMatrix localM; 10042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.setTranslate(5.f, 5.f); 10142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.postRotate(20); 10242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.postScale(1.15f, .85f); 1039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 10442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint fillPaint; 10542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com fillPaint.setAntiAlias(true); 1061818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&fillPaint); 10742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com fillPaint.setTextSize(SkIntToScalar(kPointSize)); 10893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fillPaint.setFilterQuality(kLow_SkFilterQuality); 1091a9b9640843a64af8d9d90337ec3b3fea663196areed fillPaint.setShader(SkShader::MakeBitmapShader(fBmp, kTileModes[tm0], 1101a9b9640843a64af8d9d90337ec3b3fea663196areed kTileModes[tm1], &localM)); 11142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 11242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->drawText(kText, kTextLen, 0, 0, fillPaint); 11342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->drawText(kText, kTextLen, 0, 0, outlinePaint); 114ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com SkScalar w = fillPaint.measureText(kText, kTextLen); 11542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(w + 10.f, 0.f); 11642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com ++i; 11742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com if (!(i % 2)) { 11842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->restore(); 11942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(0, 0.75f * kPointSize); 12042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->save(); 12142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->restore(); 12542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 12742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprivate: 128a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org SkBitmap fBmp; 12942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com typedef GM INHERITED; 13042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}; 13142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 13242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 13342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 13442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GM* MyFactory(void*) { return new ShaderText3GM; } 13542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GMRegistry reg(MyFactory); 13642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com} 137