1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "DecodeFile.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurMaskFilter.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorPriv.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTime.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h"
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// Intended to exercise pixel snapping observed with scaled images (and
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// with non-scaled images, but for a different reason):  Bug 1145
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass IdentityScaleView : public SampleView {
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    IdentityScaleView(const char imageFilename[]) {
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (!DecodeDataToBitmap(GetResourceAsData(imageFilename), &fBM)) {
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fBM.allocN32Pixels(1, 1);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkBitmap fBM;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // overrides from SkEventSink
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onQuery(SkEvent* evt) override {
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (SampleCode::TitleQ(*evt)) {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SampleCode::TitleR(evt, "IdentityScale");
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return true;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return this->INHERITED::onQuery(evt);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawContent(SkCanvas* canvas) override {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(true);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setTextSize(48);
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setFilterQuality(kHigh_SkFilterQuality);
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkTime::DateTime time;
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkTime::GetDateTime(&time);
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bool use_scale = (time.fSecond % 2 == 1);
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const char *text;
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->save();
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (use_scale) {
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          text = "Scaled = 1";
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          SkRect r = { 100, 100, 356, 356 };
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          SkPath clipPath;
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          clipPath.addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5));
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          canvas->clipPath(clipPath, kIntersect_SkClipOp, true);
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot          text = "Scaled = 0";
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawBitmap( fBM, 100, 100, &paint );
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->restore();
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->drawString(text, 100, 400, paint );
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SampleView INHERITED;
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkView* MyFactory() { return new IdentityScaleView("images/mandrill_256.png"); }
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkViewRegister reg(MyFactory);
84