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