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