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"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
11bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h"
12bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapProcState.h"
13bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapScaler.h"
14bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkGradientShader.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
26c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malitastatic void draw_cell(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx,
2793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed                      SkFilterQuality lvl) {
28f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkPaint paint;
2993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    paint.setFilterQuality(lvl);
30f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
31f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkAutoCanvasRestore acr(canvas, true);
32f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
33f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    canvas->translate(dx, 0);
34c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malita    canvas->concat(mat);
35c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malita    canvas->drawBitmap(bm, 0, 0, &paint);
36c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malita}
37f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
38c54d8db4d169ea5f2af2a9a2349df007bd428475Florin Malitastatic void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) {
3993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    draw_cell(canvas, bm, mat, 0 * dx, kNone_SkFilterQuality);
4093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    draw_cell(canvas, bm, mat, 1 * dx, kLow_SkFilterQuality);
4193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    draw_cell(canvas, bm, mat, 2 * dx, kMedium_SkFilterQuality);
4293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    draw_cell(canvas, bm, mat, 3 * dx, kHigh_SkFilterQuality);
43f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org}
44f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
45f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgclass FilterIndiaBoxGM : public skiagm::GM {
4636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
47f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        this->makeBitmap();
48f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
49f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        SkScalar cx = SkScalarHalf(fBM.width());
50f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        SkScalar cy = SkScalarHalf(fBM.height());
51f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
52f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        float vertScale = 30.0f/55.0f;
53f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        float horizScale = 150.0f/200.0f;
54f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
55f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fMatrix[0].setScale(horizScale, vertScale);
56f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale);
57f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
58f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
59f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgpublic:
60f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkBitmap    fBM;
61f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkMatrix    fMatrix[2];
62f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    SkString    fName;
63f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
64bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed    FilterIndiaBoxGM() {
6565cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        this->setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
66f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
67f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
68bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed    FilterIndiaBoxGM(const char filename[]) : fFilename(filename) {
69f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        fName.printf("filterindiabox");
70f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
71f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
72f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgprotected:
7336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkString onShortName() override {
74f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        return fName;
75f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
76f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
7736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkISize onISize() override {
78f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        return SkISize::Make(1024, 768);
79f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
80f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
8136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDraw(SkCanvas* canvas) override {
82f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        canvas->translate(10, 10);
83f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) {
84f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            SkSize size = computeSize(fBM, fMatrix[i]);
85f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            size.fWidth += 20;
86f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            size.fHeight += 20;
87f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
88f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            draw_row(canvas, fBM, fMatrix[i], size.fWidth);
89f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org            canvas->translate(0, size.fHeight);
90f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org        }
91f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    }
92f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
93f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org  protected:
94f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      SkString fFilename;
95f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      int fSize;
96f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
97f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      SkScalar getScale() {
98f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org          return 192.f/fSize;
99f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      }
100f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
101f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      void makeBitmap() {
102e820dfebbc652bfc4a653f07a29f5fe371eb019bmsarett        if (!GetResourceAsBitmap(fFilename.c_str(), &fBM)) {
103e820dfebbc652bfc4a653f07a29f5fe371eb019bmsarett            fBM.allocN32Pixels(1, 1);
104e820dfebbc652bfc4a653f07a29f5fe371eb019bmsarett            fBM.eraseARGB(255, 255, 0 , 0); // red == bad
105e820dfebbc652bfc4a653f07a29f5fe371eb019bmsarett        }
106e820dfebbc652bfc4a653f07a29f5fe371eb019bmsarett        fSize = fBM.height();
107f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org      }
108f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org  private:
109f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org    typedef skiagm::GM INHERITED;
110f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org};
111f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
112f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org//////////////////////////////////////////////////////////////////////////////
113f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
114f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org
115f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgDEF_GM( return new FilterIndiaBoxGM("box.gif"); )
116