1d1d3baeb986732d02987546401d5a4c19705f02ahumper/*
2d1d3baeb986732d02987546401d5a4c19705f02ahumper * Copyright 2014 Google Inc.
3d1d3baeb986732d02987546401d5a4c19705f02ahumper *
4d1d3baeb986732d02987546401d5a4c19705f02ahumper * Use of this source code is governed by a BSD-style license that can be
5d1d3baeb986732d02987546401d5a4c19705f02ahumper * found in the LICENSE file.
6d1d3baeb986732d02987546401d5a4c19705f02ahumper */
7d1d3baeb986732d02987546401d5a4c19705f02ahumper
8d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "gm.h"
9d1d3baeb986732d02987546401d5a4c19705f02ahumper
10d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "Resources.h"
11d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SampleCode.h"
12d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkBlurMaskFilter.h"
13d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkCanvas.h"
14d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkColorPriv.h"
15d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkImageDecoder.h"
16d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkRandom.h"
17d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkStream.h"
18d1d3baeb986732d02987546401d5a4c19705f02ahumper#include "SkTime.h"
19d1d3baeb986732d02987546401d5a4c19705f02ahumper
20d1d3baeb986732d02987546401d5a4c19705f02ahumper// Intended to exercise pixel snapping observed with scaled images (and
21d1d3baeb986732d02987546401d5a4c19705f02ahumper// with non-scaled images, but for a different reason):  Bug 1145
22d1d3baeb986732d02987546401d5a4c19705f02ahumper
23d1d3baeb986732d02987546401d5a4c19705f02ahumperclass IdentityScaleView : public SampleView {
24d1d3baeb986732d02987546401d5a4c19705f02ahumperpublic:
25d1d3baeb986732d02987546401d5a4c19705f02ahumper    IdentityScaleView(const char imageFilename[]) {
26d1d3baeb986732d02987546401d5a4c19705f02ahumper      SkString resourcePath = GetResourcePath(imageFilename);
27d1d3baeb986732d02987546401d5a4c19705f02ahumper      SkImageDecoder* codec = NULL;
28d1d3baeb986732d02987546401d5a4c19705f02ahumper      SkFILEStream stream(resourcePath.c_str());
29d1d3baeb986732d02987546401d5a4c19705f02ahumper      if (stream.isValid()) {
30d1d3baeb986732d02987546401d5a4c19705f02ahumper          codec = SkImageDecoder::Factory(&stream);
31d1d3baeb986732d02987546401d5a4c19705f02ahumper      }
32d1d3baeb986732d02987546401d5a4c19705f02ahumper      if (codec) {
33d1d3baeb986732d02987546401d5a4c19705f02ahumper          stream.rewind();
34d1d3baeb986732d02987546401d5a4c19705f02ahumper          codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode);
35d1d3baeb986732d02987546401d5a4c19705f02ahumper          SkDELETE(codec);
36d1d3baeb986732d02987546401d5a4c19705f02ahumper      } else {
37d1d3baeb986732d02987546401d5a4c19705f02ahumper          fBM.allocN32Pixels(1, 1);
38d1d3baeb986732d02987546401d5a4c19705f02ahumper          *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad
39d1d3baeb986732d02987546401d5a4c19705f02ahumper      }
40d1d3baeb986732d02987546401d5a4c19705f02ahumper    }
41d1d3baeb986732d02987546401d5a4c19705f02ahumper
42d1d3baeb986732d02987546401d5a4c19705f02ahumperprotected:
43d1d3baeb986732d02987546401d5a4c19705f02ahumper    SkBitmap fBM;
44d1d3baeb986732d02987546401d5a4c19705f02ahumper
45d1d3baeb986732d02987546401d5a4c19705f02ahumper    // overrides from SkEventSink
46d1d3baeb986732d02987546401d5a4c19705f02ahumper    virtual bool onQuery(SkEvent* evt) SK_OVERRIDE {
47d1d3baeb986732d02987546401d5a4c19705f02ahumper        if (SampleCode::TitleQ(*evt)) {
48d1d3baeb986732d02987546401d5a4c19705f02ahumper            SampleCode::TitleR(evt, "IdentityScale");
49d1d3baeb986732d02987546401d5a4c19705f02ahumper            return true;
50d1d3baeb986732d02987546401d5a4c19705f02ahumper        }
51d1d3baeb986732d02987546401d5a4c19705f02ahumper        return this->INHERITED::onQuery(evt);
52d1d3baeb986732d02987546401d5a4c19705f02ahumper    }
53d1d3baeb986732d02987546401d5a4c19705f02ahumper
54d1d3baeb986732d02987546401d5a4c19705f02ahumper    virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE {
55d1d3baeb986732d02987546401d5a4c19705f02ahumper
56d1d3baeb986732d02987546401d5a4c19705f02ahumper        SkPaint paint;
57d1d3baeb986732d02987546401d5a4c19705f02ahumper
58d1d3baeb986732d02987546401d5a4c19705f02ahumper        paint.setAntiAlias(true);
59d1d3baeb986732d02987546401d5a4c19705f02ahumper        paint.setTextSize(48);
60d1d3baeb986732d02987546401d5a4c19705f02ahumper        paint.setFilterLevel(SkPaint::kHigh_FilterLevel);
61d1d3baeb986732d02987546401d5a4c19705f02ahumper
62d1d3baeb986732d02987546401d5a4c19705f02ahumper        SkTime::DateTime time;
63d1d3baeb986732d02987546401d5a4c19705f02ahumper        SkTime::GetDateTime(&time);
64d1d3baeb986732d02987546401d5a4c19705f02ahumper
65d1d3baeb986732d02987546401d5a4c19705f02ahumper        bool use_scale = (time.fSecond % 2 == 1);
66d1d3baeb986732d02987546401d5a4c19705f02ahumper        const char *text;
67d1d3baeb986732d02987546401d5a4c19705f02ahumper
68d1d3baeb986732d02987546401d5a4c19705f02ahumper        canvas->save();
69d1d3baeb986732d02987546401d5a4c19705f02ahumper        if (use_scale) {
70d1d3baeb986732d02987546401d5a4c19705f02ahumper          text = "Scaled = 1";
71d1d3baeb986732d02987546401d5a4c19705f02ahumper        } else {
72d1d3baeb986732d02987546401d5a4c19705f02ahumper
73d1d3baeb986732d02987546401d5a4c19705f02ahumper          SkRect r = { 100, 100, 356, 356 };
74d1d3baeb986732d02987546401d5a4c19705f02ahumper          SkPath clipPath;
75d1d3baeb986732d02987546401d5a4c19705f02ahumper          clipPath.addRoundRect(r, SkIntToScalar(5), SkIntToScalar(5));
76d1d3baeb986732d02987546401d5a4c19705f02ahumper          canvas->clipPath(clipPath, SkRegion::kIntersect_Op, SkToBool(1));
77d1d3baeb986732d02987546401d5a4c19705f02ahumper          text = "Scaled = 0";
78d1d3baeb986732d02987546401d5a4c19705f02ahumper        }
79d1d3baeb986732d02987546401d5a4c19705f02ahumper        canvas->drawBitmap( fBM, 100, 100, &paint );
80d1d3baeb986732d02987546401d5a4c19705f02ahumper        canvas->restore();
81d1d3baeb986732d02987546401d5a4c19705f02ahumper        canvas->drawText( text, strlen(text), 100, 400, paint );
82d1d3baeb986732d02987546401d5a4c19705f02ahumper        this->inval(NULL);
83d1d3baeb986732d02987546401d5a4c19705f02ahumper    }
84d1d3baeb986732d02987546401d5a4c19705f02ahumper
85d1d3baeb986732d02987546401d5a4c19705f02ahumperprivate:
86d1d3baeb986732d02987546401d5a4c19705f02ahumper    typedef SampleView INHERITED;
87d1d3baeb986732d02987546401d5a4c19705f02ahumper};
88d1d3baeb986732d02987546401d5a4c19705f02ahumper
89d1d3baeb986732d02987546401d5a4c19705f02ahumper//////////////////////////////////////////////////////////////////////////////
90d1d3baeb986732d02987546401d5a4c19705f02ahumper
91d1d3baeb986732d02987546401d5a4c19705f02ahumperstatic SkView* MyFactory() { return new IdentityScaleView("mandrill_256.png"); }
92d1d3baeb986732d02987546401d5a4c19705f02ahumperstatic SkViewRegister reg(MyFactory);
93