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