1f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org/*
2f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * Copyright 2011 Google Inc.
3f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org *
4f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * found in the LICENSE file.
6f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org */
7f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
8f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "gm.h"
9f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h"
11bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapProcState.h"
12bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapScaler.h"
13bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkGradientShader.h"
14f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "SkImageDecoder.h"
15f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "SkImageEncoder.h"
16bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkStream.h"
17bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkTypeface.h"
18f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
19f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgstatic SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) {
20f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()),
21f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org                                   SkIntToScalar(bm.height()));
22f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    mat.mapRect(&bounds);
23f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    return SkSize::Make(bounds.width(), bounds.height());
24f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org}
25f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
26f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgstatic void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) {
27f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkPaint paint;
28f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
29f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkAutoCanvasRestore acr(canvas, true);
30f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
31f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->drawBitmapMatrix(bm, mat, &paint);
32f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
33f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    paint.setFilterLevel(SkPaint::kLow_FilterLevel);
34f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->translate(dx, 0);
35f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->drawBitmapMatrix(bm, mat, &paint);
36f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
37f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    paint.setFilterLevel(SkPaint::kMedium_FilterLevel);
38f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->translate(dx, 0);
39f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->drawBitmapMatrix(bm, mat, &paint);
40f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
41f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
42f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->translate(dx, 0);
43f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->drawBitmapMatrix(bm, mat, &paint);
44f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org}
45f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
46f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgclass FilterIndiaBoxGM : public skiagm::GM {
47f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    void onOnceBeforeDraw() {
48f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        this->makeBitmap();
49f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
50f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        SkScalar cx = SkScalarHalf(fBM.width());
51f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        SkScalar cy = SkScalarHalf(fBM.height());
52f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
53f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        float vertScale = 30.0f/55.0f;
54f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        float horizScale = 150.0f/200.0f;
55f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
56f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fMatrix[0].setScale(horizScale, vertScale);
57f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale);
58f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
59f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
60f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgpublic:
61f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkBitmap    fBM;
62f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkMatrix    fMatrix[2];
63f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkString    fName;
64f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
65bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed    FilterIndiaBoxGM() {
66f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        this->setBGColor(0xFFDDDDDD);
67f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
68f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
69bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed    FilterIndiaBoxGM(const char filename[]) : fFilename(filename) {
70f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fName.printf("filterindiabox");
71f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
72f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
73f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgprotected:
74f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
75f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        return kSkipTiled_Flag;
76f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
77f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
78f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    virtual SkString onShortName() SK_OVERRIDE {
79f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        return fName;
80f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
81f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
82f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    virtual SkISize onISize() SK_OVERRIDE {
83f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        return SkISize::Make(1024, 768);
84f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
85f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
86f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
87f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        canvas->translate(10, 10);
88f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) {
89f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            SkSize size = computeSize(fBM, fMatrix[i]);
90f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            size.fWidth += 20;
91f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            size.fHeight += 20;
92f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
93f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            draw_row(canvas, fBM, fMatrix[i], size.fWidth);
94f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            canvas->translate(0, size.fHeight);
95f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        }
96f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
97f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
98f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org  protected:
99f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      SkString fFilename;
100f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      int fSize;
101f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
102f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      SkScalar getScale() {
103f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          return 192.f/fSize;
104f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      }
105f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
106f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      void makeBitmap() {
107bcbc1788b478b1e54079318ad073e8490aa66faetfarina          SkString resourcePath = GetResourcePath();
108bcbc1788b478b1e54079318ad073e8490aa66faetfarina          resourcePath.append("/");
109bcbc1788b478b1e54079318ad073e8490aa66faetfarina          resourcePath.append(fFilename);
110f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
111bcbc1788b478b1e54079318ad073e8490aa66faetfarina          SkImageDecoder* codec = NULL;
112bcbc1788b478b1e54079318ad073e8490aa66faetfarina          SkFILEStream stream(resourcePath.c_str());
113f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          if (stream.isValid()) {
114f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org              codec = SkImageDecoder::Factory(&stream);
115f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          }
116f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          if (codec) {
117f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org              stream.rewind();
118bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed              codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode);
119f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org              SkDELETE(codec);
120f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          } else {
121f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org              fBM.allocN32Pixels(1, 1);
122f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org              *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
123f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          }
124f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          fSize = fBM.height();
125f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      }
126f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org  private:
127f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    typedef skiagm::GM INHERITED;
128f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org};
129f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
130f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
131f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
132f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
133f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgDEF_GM( return new FilterIndiaBoxGM("box.gif"); )
134