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" 10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h" 1167d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com#include "SkBlurMaskFilter.h" 1258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkCanvas.h" 1358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkColor.h" 1458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkMatrix.h" 1558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkPath.h" 1658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkRect.h" 1758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkSize.h" 1858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com#include "SkString.h" 1958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comnamespace skiagm { 2158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comclass DrawBitmapMatrixGM : public GM { 2358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.compublic: 2458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com DrawBitmapMatrixGM() {} 2558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 2658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comprotected: 27a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 28a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 30a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 3158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com virtual SkString onShortName() SK_OVERRIDE { 3258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com return SkString("drawbitmapmatrix"); 3358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 3458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 35f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(1024, 256); } 3658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 3758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 3858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkBitmap bm; 3958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com this->setupBitmap(&bm); 4058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 4158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw normally. 4258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkMatrix matrix; 4358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 4458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPaint paint; 4558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setAntiAlias(true); 4658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setDither(true); 4758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 4858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 4958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw stretched horizontally and squished vertically. 5058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 5), 0); 5158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setScale(SkIntToScalar(2), SK_ScalarHalf); 5258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 5358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 5458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw rotated 5558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width()*2 + 5), 0); 5658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 5758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), 5858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkIntToScalar(bm.height() / 2)); 5958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->save(); 6058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(0, SkIntToScalar(10)); 6158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 6258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->restore(); 6358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 6458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with perspective 6558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 15), 0); 6658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 6758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setPerspX(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 6858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setPerspY(SkScalarDiv(SK_Scalar1, SkIntToScalar(1000))); 6958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 7058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with skew 7258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() + 5), 0); 7358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 7458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setSkew(SkIntToScalar(2), SkIntToScalar(2)); 7558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 7658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 7758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com // Draw with sin/cos 7858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->translate(SkIntToScalar(bm.width() * 4), 0); 7958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.reset(); 8058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com matrix.setSinCos(SK_ScalarHalf, SkIntToScalar(2)); 8158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 8267d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 8367d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com { 8467d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com // test the following code path: 8567d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com // SkGpuDevice::drawPath() -> SkGpuDevice::drawWithMaskFilter() 8667d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com SkPaint paint; 8767d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 884469938e92d779dff05e745559e67907bbf21e78reed@google.com paint.setFilterLevel(SkPaint::kLow_FilterLevel); 8967d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 9067d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com SkMaskFilter* mf = SkBlurMaskFilter::Create( 91e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org kNormal_SkBlurStyle, 92b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com SkBlurMask::ConvertRadiusToSigma(5), 9367d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com SkBlurMaskFilter::kHighQuality_BlurFlag | 9467d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com SkBlurMaskFilter::kIgnoreTransform_BlurFlag); 9567d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com paint.setMaskFilter(mf)->unref(); 9667d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 9767d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com canvas->translate(SkIntToScalar(bm.width()*2 + 20), 0); 9867d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 9967d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com matrix.reset(); 10067d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com matrix.setRotate(SkIntToScalar(45), SkIntToScalar(bm.width() / 2), 10167d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com SkIntToScalar(bm.height() / 2)); 10267d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 10367d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com canvas->save(); 10467d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com canvas->translate(0, SkIntToScalar(20)); 10567d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com canvas->drawBitmapMatrix(bm, matrix, &paint); 10667d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com canvas->restore(); 10767d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com } 10867d91be9bb64c532452f9d9d67b20f492ea0ad57robertphillips@google.com 10958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 11058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comprivate: 11158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com void setupBitmap(SkBitmap* bm) { 11258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkASSERT(bm); 11358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com static const int SIZE = 64; 114eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com bm->allocN32Pixels(SIZE, SIZE); 11558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkCanvas canvas(*bm); 11658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 11758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPaint paint; 11858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setColor(SK_ColorGREEN); 11958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas.drawPaint(paint); 12058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 12158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setColor(SK_ColorBLUE); 12258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com paint.setAntiAlias(true); 12358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkRect rect = SkRect::MakeWH(SkIntToScalar(SIZE), SkIntToScalar(SIZE)); 12458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com SkPath path; 12558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com path.addOval(rect); 12658be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com canvas.drawPath(path, paint); 12758be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com } 12858be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com}; 12958be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 13058be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com//////////////////////////////////////////////////////////////////////////////// 13158be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 13258be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comstatic GM* MyFactory(void*) { return new DrawBitmapMatrixGM; } 13358be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.comstatic GMRegistry reg(MyFactory); 13458be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com 13558be682c77c76d9a0caf23337f9b357798179b6cscroggo@google.com} 136