11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger#include "gm.h" 940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergernamespace skiagm { 1140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerclass Poly2PolyGM : public GM { 1340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerpublic: 1440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger Poly2PolyGM() {} 1540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 1640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerprotected: 1740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger virtual SkString onShortName() { 1840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return SkString("poly2poly"); 1940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 2040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger virtual SkISize onISize() { 2240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger return make_isize(835, 840); 2340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 2440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 2540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger static void doDraw(SkCanvas* canvas, SkPaint* paint, const int isrc[], 2640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int idst[], int count) { 2740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkMatrix matrix; 2840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkPoint src[4], dst[4]; 2940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger for (int i = 0; i < count; i++) { 3140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger src[i].set(SkIntToScalar(isrc[2*i+0]), SkIntToScalar(isrc[2*i+1])); 3240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger dst[i].set(SkIntToScalar(idst[2*i+0]), SkIntToScalar(idst[2*i+1])); 3340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 3440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->save(); 3640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger matrix.setPolyToPoly(src, dst, count); 3740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->concat(matrix); 3840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 3940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint->setColor(SK_ColorGRAY); 4040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint->setStyle(SkPaint::kStroke_Style); 4140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const SkScalar D = SkIntToScalar(64); 4240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawRectCoords(0, 0, D, D, *paint); 4340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawLine(0, 0, D, D, *paint); 4440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawLine(0, D, D, 0, *paint); 4540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 4640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkPaint::FontMetrics fm; 4740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint->getFontMetrics(&fm); 4840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint->setColor(SK_ColorRED); 4940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint->setStyle(SkPaint::kFill_Style); 5040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkScalar x = D/2; 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkScalar y = D/2 - (fm.fAscent + fm.fDescent)/2; 5240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkString str; 5340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger str.appendS32(count); 5440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->drawText(str.c_str(), str.size(), x, y, *paint); 5540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 5640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->restore(); 5740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 5840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void onDraw(SkCanvas* canvas) { 6040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger SkPaint paint; 6140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint.setAntiAlias(true); 6240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint.setStrokeWidth(SkIntToScalar(4)); 6340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint.setTextSize(SkIntToScalar(40)); 6440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger paint.setTextAlign(SkPaint::kCenter_Align); 6540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 6640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->save(); 6740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->translate(SkIntToScalar(10), SkIntToScalar(10)); 6840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // translate (1 point) 6940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int src1[] = { 0, 0 }; 7040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int dst1[] = { 5, 5 }; 7140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger doDraw(canvas, &paint, src1, dst1, 1); 7240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->restore(); 7340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 7440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->save(); 7540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->translate(SkIntToScalar(160), SkIntToScalar(10)); 7640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // rotate/uniform-scale (2 points) 7740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int src2[] = { 32, 32, 64, 32 }; 7840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int dst2[] = { 32, 32, 64, 48 }; 7940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger doDraw(canvas, &paint, src2, dst2, 2); 8040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->restore(); 8140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 8240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->save(); 8340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->translate(SkIntToScalar(10), SkIntToScalar(110)); 8440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // rotate/skew (3 points) 8540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int src3[] = { 0, 0, 64, 0, 0, 64 }; 8640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int dst3[] = { 0, 0, 96, 0, 24, 64 }; 8740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger doDraw(canvas, &paint, src3, dst3, 3); 8840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->restore(); 8940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 9040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->save(); 9140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->translate(SkIntToScalar(160), SkIntToScalar(110)); 9240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger // perspective (4 points) 9340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int src4[] = { 0, 0, 64, 0, 64, 64, 0, 64 }; 9440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger const int dst4[] = { 0, 0, 96, 0, 64, 96, 0, 64 }; 9540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger doDraw(canvas, &paint, src4, dst4, 4); 9640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger canvas->restore(); 9740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger } 9840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 9940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerprivate: 10040528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger typedef GM INHERITED; 10140528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger}; 10240528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 10340528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger////////////////////////////////////////////////////////////////////////////// 10440528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 10540528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerstatic GM* MyFactory(void*) { return new Poly2PolyGM; } 10640528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenbergerstatic GMRegistry reg(MyFactory); 10740528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 10840528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger} 10940528743dbb9ce7f39f093e0cdc47849ac8887cfDerek Sollenberger 110