11803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org/* 21803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org * Copyright 2014 Google Inc. 31803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org * 41803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 51803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org * found in the LICENSE file. 61803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org */ 71803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 81803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "gm.h" 9bcbc1788b478b1e54079318ad073e8490aa66faetfarina 10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 111803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SampleCode.h" 121803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SkBlurMaskFilter.h" 131803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SkCanvas.h" 14bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkColorPriv.h" 151803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SkImageDecoder.h" 161803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SkRandom.h" 171803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org#include "SkStream.h" 181803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 191803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org// Intended to exercise pixel snapping observed with scaled images (and 201803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org// with non-scaled images, but for a different reason): Bug 1145 211803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 221803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.orgclass SubpixelTranslateView : public SampleView { 231803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.orgpublic: 241803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SubpixelTranslateView(const char imageFilename[], 251803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org float horizontalVelocity, 261803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org float verticalVelocity) 271803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org : fFilename(imageFilename), 281803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fHorizontalVelocity(horizontalVelocity), 291803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fVerticalVelocity(verticalVelocity) { 30bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString resourcePath = GetResourcePath(); 31bcbc1788b478b1e54079318ad073e8490aa66faetfarina resourcePath.append("/"); 32bcbc1788b478b1e54079318ad073e8490aa66faetfarina resourcePath.append(fFilename); 331803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 34bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkImageDecoder* codec = NULL; 35bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkFILEStream stream(resourcePath.c_str()); 361803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org if (stream.isValid()) { 371803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org codec = SkImageDecoder::Factory(&stream); 381803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 391803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org if (codec) { 401803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org stream.rewind(); 41bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); 421803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkDELETE(codec); 431803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } else { 441803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fBM.allocN32Pixels(1, 1); 451803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad 461803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 471803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fCurPos = SkPoint::Make(0,0); 481803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fSize = 200; 491803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 501803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 511803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.orgprotected: 521803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkBitmap fBM; 531803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkString fFilename; 54687a26defaa28ce1ede534bf199bbbfc92cee5a3reed@google.com SkScalar fSize; 551803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org float fHorizontalVelocity, fVerticalVelocity; 561803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 571803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPoint fCurPos; 581803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 591803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org // overrides from SkEventSink 601803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 611803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org if (SampleCode::TitleQ(*evt)) { 621803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SampleCode::TitleR(evt, "SubpixelTranslate"); 631803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org return true; 641803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 651803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org return this->INHERITED::onQuery(evt); 661803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 671803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 681803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { 691803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 701803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org static const SkPaint::FilterLevel gLevels[] = { 711803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPaint::kNone_FilterLevel, 721803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPaint::kLow_FilterLevel, 731803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPaint::kMedium_FilterLevel, 741803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPaint::kHigh_FilterLevel 751803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org }; 761803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 771803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkPaint paint; 781803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setTextSize(48); 791803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 801803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setAntiAlias(true); 811803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gLevels); ++i) { 821803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setFilterLevel(gLevels[i]); 831803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY, fSize, fSize ); 841803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawBitmapRect( fBM, r, &paint ); 851803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 861803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 871803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawText( "AA Scaled", strlen("AA Scaled"), fCurPos.fX + SK_ARRAY_COUNT(gLevels) * (fSize + 10), fCurPos.fY + fSize/2, paint ); 881803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 891803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setAntiAlias(false); 901803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gLevels); ++i) { 911803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setFilterLevel(gLevels[i]); 921803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org SkRect r = SkRect::MakeXYWH( fCurPos.fX + i * (fSize + 10), fCurPos.fY + fSize + 10, fSize, fSize ); 931803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawBitmapRect( fBM, r, &paint ); 941803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 951803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawText( "Scaled", strlen("Scaled"), fCurPos.fX + SK_ARRAY_COUNT(gLevels) * (fSize + 10), fCurPos.fY + fSize + 10 + fSize/2, paint ); 961803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 971803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setAntiAlias(true); 981803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gLevels); ++i) { 991803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setFilterLevel(gLevels[i]); 1001803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10), &paint ); 1011803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 1021803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1031803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawText( "AA No Scale", strlen("AA No Scale"), fCurPos.fX + SK_ARRAY_COUNT(gLevels) * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10) + fSize/2, paint ); 1041803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1051803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setAntiAlias(false); 1061803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(gLevels); ++i) { 1071803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org paint.setFilterLevel(gLevels[i]); 1081803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawBitmap( fBM, fCurPos.fX + i * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10, &paint ); 1091803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 1101803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1111803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org canvas->drawText( "No Scale", strlen("No Scale"), fCurPos.fX + SK_ARRAY_COUNT(gLevels) * (fBM.width() + 10), fCurPos.fY + 2*(fSize + 10) + fBM.height() + 10 + fSize/2, paint ); 1121803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1131803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1141803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fCurPos.fX += fHorizontalVelocity; 1151803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org fCurPos.fY += fVerticalVelocity; 1161803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org this->inval(NULL); 1171803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org } 1181803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1191803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.orgprivate: 1201803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org typedef SampleView INHERITED; 1211803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org}; 1221803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 1231803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 1241803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.org 125687a26defaa28ce1ede534bf199bbbfc92cee5a3reed@google.comstatic SkView* MyFactory() { return new SubpixelTranslateView("mandrill_256.png", .05f, .05f); } 1261803f4eb341dd0209dde8cc7ee0fa4b409fb2704commit-bot@chromium.orgstatic SkViewRegister reg(MyFactory); 127