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" 942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkCanvas.h" 1042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com#include "SkGradientShader.h" 1142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 1242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comnamespace skiagm { 1342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 14dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.orgstatic void makebm(SkBitmap* bm, int w, int h) { 15dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm->allocN32Pixels(w, h); 16dbfac8a72393eaf01670aeb3244de0e18d8faf98junov@google.com bm->eraseColor(SK_ColorTRANSPARENT); 1742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 1842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkCanvas canvas(*bm); 1942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkScalar s = SkIntToScalar(SkMin32(w, h)); 2042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkPoint kPts0[] = { { 0, 0 }, { s, s } }; 2142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkPoint kPts1[] = { { s/2, 0 }, { s/2, s } }; 2242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkScalar kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; 2342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 }; 2442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 }; 25f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 2642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 2742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint paint; 2842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 2942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com paint.setShader(SkGradientShader::CreateLinear(kPts0, kColors0, kPos, 3083f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SK_ARRAY_COUNT(kColors0), SkShader::kClamp_TileMode))->unref(); 3142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas.drawPaint(paint); 3242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com paint.setShader(SkGradientShader::CreateLinear(kPts1, kColors1, kPos, 3342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SK_ARRAY_COUNT(kColors1), SkShader::kClamp_TileMode))->unref(); 3442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas.drawPaint(paint); 3542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com} 3642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 3742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 3842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 3942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstruct LabeledMatrix { 4042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkMatrix fMatrix; 4142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com const char* fLabel; 4242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}; 4342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 44a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.orgstatic const char kText[] = "B"; 45a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.orgstatic const int kTextLen = SK_ARRAY_COUNT(kText) - 1; 46a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.orgstatic const int kPointSize = 300; 47a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org 4842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comclass ShaderText3GM : public GM { 4942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.compublic: 5042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com ShaderText3GM() { 5142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com this->setBGColor(0xFFDDDDDD); 5242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 5342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 5442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprotected: 5542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkString onShortName() override { 5742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com return SkString("shadertext3"); 5842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 5942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 6036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein SkISize onISize() override{ return SkISize::Make(800, 1000); } 6142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 6236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 63a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org makebm(&fBmp, kPointSize / 4, kPointSize / 4); 64a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org } 6542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 6636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onDraw(SkCanvas* canvas) override { 67f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 6842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint bmpPaint; 6942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com bmpPaint.setAntiAlias(true); 7093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed bmpPaint.setFilterQuality(kLow_SkFilterQuality); 7142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com bmpPaint.setAlpha(0x80); 72a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org canvas->drawBitmap(fBmp, 5.f, 5.f, &bmpPaint); 7342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 7442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint outlinePaint; 7542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setAntiAlias(true); 76992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&outlinePaint); 7742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setTextSize(SkIntToScalar(kPointSize)); 7842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setStyle(SkPaint::kStroke_Style); 7942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com outlinePaint.setStrokeWidth(0.f); 80f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 8142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(15.f, 15.f); 82f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 8342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com // draw glyphs scaled up 8442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->scale(2.f, 2.f); 8542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 8642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com static const SkShader::TileMode kTileModes[] = { 8742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkShader::kRepeat_TileMode, 8842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkShader::kMirror_TileMode, 8942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com }; 90f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 9142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com // position the baseline of the first run 9242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(0.f, 0.75f * kPointSize); 93f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 9442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->save(); 9542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com int i = 0; 96f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com for (size_t tm0 = 0; tm0 < SK_ARRAY_COUNT(kTileModes); ++tm0) { 9742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com for (size_t tm1 = 0; tm1 < SK_ARRAY_COUNT(kTileModes); ++tm1) { 9842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkMatrix localM; 9942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.setTranslate(5.f, 5.f); 10042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.postRotate(20); 10142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com localM.postScale(1.15f, .85f); 1029c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org 1039c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(fBmp, 1049c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org kTileModes[tm0], 1059c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org kTileModes[tm1], 1069c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org &localM)); 10742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 10842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com SkPaint fillPaint; 10942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com fillPaint.setAntiAlias(true); 110992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&fillPaint); 11142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com fillPaint.setTextSize(SkIntToScalar(kPointSize)); 11293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fillPaint.setFilterQuality(kLow_SkFilterQuality); 11342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com fillPaint.setShader(shader); 11442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 11542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->drawText(kText, kTextLen, 0, 0, fillPaint); 11642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->drawText(kText, kTextLen, 0, 0, outlinePaint); 117ca47aae7ecfdafb5e88baee13737908b79a4c716robertphillips@google.com SkScalar w = fillPaint.measureText(kText, kTextLen); 11842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(w + 10.f, 0.f); 11942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com ++i; 12042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com if (!(i % 2)) { 12142316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->restore(); 12242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->translate(0, 0.75f * kPointSize); 12342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->save(); 12442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com canvas->restore(); 12842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com } 12942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 13042316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comprivate: 131a54abdccbd9e9b8917f7c7b0af5d9fe39d879a9acommit-bot@chromium.org SkBitmap fBmp; 13242316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com typedef GM INHERITED; 13342316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com}; 13442316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 13542316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com/////////////////////////////////////////////////////////////////////////////// 13642316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com 13742316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GM* MyFactory(void*) { return new ShaderText3GM; } 13842316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.comstatic GMRegistry reg(MyFactory); 13942316095ecb795a2cc086490c7eae61ca8949c01bsalomon@google.com} 140