10c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org/* 20c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * Copyright 2013 Google Inc. 30c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * 40c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be 50c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org * found in the LICENSE file. 60c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org */ 70c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 80c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "gm.h" 90c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "SkCanvas.h" 100c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org#include "SkGradientShader.h" 112c326b7359272b149e8bc03a5a63fd6b52b0fe8cmike@reedtribe.org#include "SkRandom.h" 120c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 1385e143c33c214e54187aa28146aa7666961a0d17reed@google.comstatic SkShader* make_shader(SkScalar w, SkScalar h) { 1485e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkColor colors[] = { 1585e143c33c214e54187aa28146aa7666961a0d17reed@google.com SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, 1685e143c33c214e54187aa28146aa7666961a0d17reed@google.com SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW, 1785e143c33c214e54187aa28146aa7666961a0d17reed@google.com }; 1885e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkPoint pts[] = { { w/4, 0 }, { 3*w/4, h } }; 1985e143c33c214e54187aa28146aa7666961a0d17reed@google.com 2085e143c33c214e54187aa28146aa7666961a0d17reed@google.com return SkGradientShader::CreateLinear(pts, colors, NULL, 210c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SK_ARRAY_COUNT(colors), 220c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkShader::kMirror_TileMode); 230c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org} 240c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 250c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgclass VerticesGM : public skiagm::GM { 260c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkPoint fPts[9]; 270c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkPoint fTexs[9]; 280c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkColor fColors[9]; 290c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkShader* fShader; 3060da8f39522a7523063f4a0f58d05285c695b562reed@google.com unsigned fAlpha; 310c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 320c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgpublic: 3360da8f39522a7523063f4a0f58d05285c695b562reed@google.com VerticesGM(unsigned alpha) : fShader(NULL), fAlpha(alpha) { 340c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 350c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 360c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org virtual ~VerticesGM() { 370c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkSafeUnref(fShader); 380c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 390c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 400c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgprotected: 41a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 42a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 43a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 44a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 450c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org virtual void onOnceBeforeDraw() SK_OVERRIDE { 4685e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkScalar X = 150; 4785e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkScalar Y = 150; 4885e143c33c214e54187aa28146aa7666961a0d17reed@google.com 4985e143c33c214e54187aa28146aa7666961a0d17reed@google.com fPts[0].set(0, 0); fPts[1].set(X/2, 10); fPts[2].set(X, 0); 5085e143c33c214e54187aa28146aa7666961a0d17reed@google.com fPts[3].set(10, Y/2); fPts[4].set(X/2, Y/2); fPts[5].set(X-10, Y/2); 5185e143c33c214e54187aa28146aa7666961a0d17reed@google.com fPts[6].set(0, Y); fPts[7].set(X/2, Y-10); fPts[8].set(X, Y); 520c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 5385e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkScalar w = 200; 5485e143c33c214e54187aa28146aa7666961a0d17reed@google.com const SkScalar h = 200; 550c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 560c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org fTexs[0].set(0, 0); fTexs[1].set(w/2, 0); fTexs[2].set(w, 0); 570c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org fTexs[3].set(0, h/2); fTexs[4].set(w/2, h/2); fTexs[5].set(w, h/2); 580c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org fTexs[6].set(0, h); fTexs[7].set(w/2, h); fTexs[8].set(w, h); 590c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 600c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org fShader = make_shader(w, h); 610c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 620c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkRandom rand; 630c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org for (size_t i = 0; i < SK_ARRAY_COUNT(fColors); ++i) { 6485e143c33c214e54187aa28146aa7666961a0d17reed@google.com fColors[i] = rand.nextU() | 0xFF000000; 650c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 660c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 670c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 680c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org virtual SkString onShortName() SK_OVERRIDE { 6960da8f39522a7523063f4a0f58d05285c695b562reed@google.com SkString name("vertices"); 7060da8f39522a7523063f4a0f58d05285c695b562reed@google.com if (0xFF != fAlpha) { 7160da8f39522a7523063f4a0f58d05285c695b562reed@google.com name.appendf("_%02X", fAlpha); 7260da8f39522a7523063f4a0f58d05285c695b562reed@google.com } 7360da8f39522a7523063f4a0f58d05285c695b562reed@google.com return name; 740c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 750c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 760c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org virtual SkISize onISize() SK_OVERRIDE { 7785e143c33c214e54187aa28146aa7666961a0d17reed@google.com return SkISize::Make(600, 600); 780c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 790c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 800c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 8185e143c33c214e54187aa28146aa7666961a0d17reed@google.com // start with the center of a 3x3 grid 820c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org static const uint16_t fan[] = { 830c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 4, 840c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 0, 1, 2, 5, 8, 7, 6, 3, 0 850c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org }; 860c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 870c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org const struct { 880c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org const SkColor* fColors; 890c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org const SkPoint* fTexs; 900c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } rec[] = { 910c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org { fColors, NULL }, 920c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org { NULL, fTexs }, 930c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org { fColors, fTexs }, 940c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org }; 950c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 960c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org const SkXfermode::Mode modes[] = { 970c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkXfermode::kSrc_Mode, 980c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkXfermode::kDst_Mode, 990c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkXfermode::kModulate_Mode, 1000c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org }; 1014c9128664a4782ef40c5ccd856e87f9ed3b86172skia.committer@gmail.com 1020c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkPaint paint; 1030c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org paint.setShader(fShader); 10460da8f39522a7523063f4a0f58d05285c695b562reed@google.com paint.setAlpha(fAlpha); 1050c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 1060c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org canvas->translate(20, 20); 1070c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org for (size_t j = 0; j < SK_ARRAY_COUNT(modes); ++j) { 1080c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SkXfermode* xfer = SkXfermode::Create(modes[j]); 1090c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org canvas->save(); 1100c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) { 1110c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org canvas->drawVertices(SkCanvas::kTriangleFan_VertexMode, 1120c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org SK_ARRAY_COUNT(fPts), fPts, 1130c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org rec[i].fTexs, rec[i].fColors, 1140c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org xfer, fan, SK_ARRAY_COUNT(fan), paint); 11585e143c33c214e54187aa28146aa7666961a0d17reed@google.com canvas->translate(200, 0); 1160c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 1170c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org canvas->restore(); 11885e143c33c214e54187aa28146aa7666961a0d17reed@google.com canvas->translate(0, 200); 1190c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org xfer->unref(); 1200c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 1210c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org } 1220c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 1230c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.orgprivate: 1240c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org typedef skiagm::GM INHERITED; 1250c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org}; 1260c87ea8082919b324d3337c9b5c78fd0fac8a649mike@reedtribe.org 12760da8f39522a7523063f4a0f58d05285c695b562reed@google.com///////////////////////////////////////////////////////////////////////////////////// 12860da8f39522a7523063f4a0f58d05285c695b562reed@google.com 12960da8f39522a7523063f4a0f58d05285c695b562reed@google.comDEF_GM( return SkNEW_ARGS(VerticesGM, (0xFF)); ) 13060da8f39522a7523063f4a0f58d05285c695b562reed@google.comDEF_GM( return SkNEW_ARGS(VerticesGM, (0x80)); ) 131