bitmapmatrix.cpp revision 58be682c77c76d9a0caf23337f9b357798179b6c
158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com/* 358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com * Copyright 2012 Google Inc. 458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com * 558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com * Use of this source code is governed by a BSD-style license that can be 658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com * found in the LICENSE file. 758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com */ 858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "gm.h" 958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkBitmap.h" 1058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkCanvas.h" 1158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkColor.h" 1258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkMatrix.h" 1358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkPath.h" 1458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkRect.h" 1558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkSize.h" 1658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkString.h" 1758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 1858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comnamespace skiagm { 1958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comclass DrawBitmapMatrixGM : public GM { 2158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.compublic: 2258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com DrawBitmapMatrixGM() {} 2358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comprotected: 2558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 2658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return SkString("drawbitmapmatrix"); 2758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 2858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com virtual SkISize onISize() SK_OVERRIDE { return make_isize(1024, 256); } 3058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 3158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 3258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkBitmap bm; 3358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com this->setupBitmap(&bm); 3458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 3558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw normally. 3658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkMatrix matrix; 3758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 3858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPaint paint; 3958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setAntiAlias(true); 4058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setDither(true); 4158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 4258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 4358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw stretched horizontally and squished vertically. 4458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 5), 0); 4558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setScale(SkIntToScalar(2), SK_ScalarHalf); 4658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 4758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 4858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw rotated 4958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width()*2 + 5), 0); 5058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 5158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), 5258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkIntToScalar(bm.height() / 2)); 5358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->save(); 5458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(0, SkIntToScalar(10)); 5558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 5658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->restore(); 5758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 5858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with perspective 5958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 15), 0); 6058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 6158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setPerspX(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 6258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 6358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 6458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 6558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with skew 6658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 5), 0); 6758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 6858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setSkew(SkIntToScalar(2), SkIntToScalar(2)); 6958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 7058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with sin/cos 7258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() * 4), 0); 7358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 7458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setSinCos(SK_ScalarHalf, SkIntToScalar(2)); 7558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 7658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 7758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comprivate: 7858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com void setupBitmap(SkBitmap* bm) { 7958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkASSERT(bm); 8058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com static const int SIZE = 64; 8158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com bm->setConfig(SkBitmap::kARGB_8888_Config, SIZE, SIZE); 8258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com bm->allocPixels(); 8358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkCanvas canvas(*bm); 8458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 8558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPaint paint; 8658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setColor(SK_ColorGREEN); 8758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas.drawPaint(paint); 8858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 8958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setColor(SK_ColorBLUE); 9058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setAntiAlias(true); 9158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkRect rect = SkRect::MakeWH(SkIntToScalar(SIZE), SkIntToScalar(SIZE)); 9258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPath path; 9358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com path.addOval(rect); 9458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas.drawPath(path, paint); 9558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 9658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com}; 9758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 9858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com//////////////////////////////////////////////////////////////////////////////// 9958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 10058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comstatic GM* MyFactory(void*) { return new DrawBitmapMatrixGM; } 10158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comstatic GMRegistry reg(MyFactory); 10258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 10358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 104