1f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org/* 2f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * Copyright 2011 Google Inc. 3f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * 4f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be 5f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org * found in the LICENSE file. 6f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org */ 7f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 8f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "gm.h" 9f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 10bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "Resources.h" 11bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapProcState.h" 12bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkBitmapScaler.h" 13bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkGradientShader.h" 14f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "SkImageDecoder.h" 15f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org#include "SkImageEncoder.h" 16bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkStream.h" 17bcbc1788b478b1e54079318ad073e8490aa66faetfarina#include "SkTypeface.h" 18f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 19f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgstatic SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) { 20f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()), 21f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkIntToScalar(bm.height())); 22f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org mat.mapRect(&bounds); 23f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org return SkSize::Make(bounds.width(), bounds.height()); 24f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org} 25f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 26f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgstatic void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) { 27f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkPaint paint; 28f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 29f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkAutoCanvasRestore acr(canvas, true); 30f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 31f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->drawBitmapMatrix(bm, mat, &paint); 32f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 33f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org paint.setFilterLevel(SkPaint::kLow_FilterLevel); 34f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->translate(dx, 0); 35f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->drawBitmapMatrix(bm, mat, &paint); 36f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 37f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org paint.setFilterLevel(SkPaint::kMedium_FilterLevel); 38f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->translate(dx, 0); 39f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->drawBitmapMatrix(bm, mat, &paint); 40f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 41f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org paint.setFilterLevel(SkPaint::kHigh_FilterLevel); 42f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->translate(dx, 0); 43f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->drawBitmapMatrix(bm, mat, &paint); 44f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org} 45f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 46f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgclass FilterIndiaBoxGM : public skiagm::GM { 47f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org void onOnceBeforeDraw() { 48f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org this->makeBitmap(); 49f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 50f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkScalar cx = SkScalarHalf(fBM.width()); 51f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkScalar cy = SkScalarHalf(fBM.height()); 52f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 53f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org float vertScale = 30.0f/55.0f; 54f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org float horizScale = 150.0f/200.0f; 55f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 56f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org fMatrix[0].setScale(horizScale, vertScale); 57f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale); 58f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 59f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 60f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgpublic: 61f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkBitmap fBM; 62f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkMatrix fMatrix[2]; 63f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkString fName; 64f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 65bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed FilterIndiaBoxGM() { 66f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org this->setBGColor(0xFFDDDDDD); 67f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 68f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 69bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed FilterIndiaBoxGM(const char filename[]) : fFilename(filename) { 70f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org fName.printf("filterindiabox"); 71f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 72f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 73f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgprotected: 74f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 75f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org return kSkipTiled_Flag; 76f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 77f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 78f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org virtual SkString onShortName() SK_OVERRIDE { 79f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org return fName; 80f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 81f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 82f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org virtual SkISize onISize() SK_OVERRIDE { 83f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org return SkISize::Make(1024, 768); 84f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 85f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 86f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 87f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->translate(10, 10); 88f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) { 89f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkSize size = computeSize(fBM, fMatrix[i]); 90f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org size.fWidth += 20; 91f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org size.fHeight += 20; 92f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 93f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org draw_row(canvas, fBM, fMatrix[i], size.fWidth); 94f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org canvas->translate(0, size.fHeight); 95f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 96f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 97f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 98f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org protected: 99f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkString fFilename; 100f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org int fSize; 101f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 102f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkScalar getScale() { 103f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org return 192.f/fSize; 104f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 105f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 106f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org void makeBitmap() { 107bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkString resourcePath = GetResourcePath(); 108bcbc1788b478b1e54079318ad073e8490aa66faetfarina resourcePath.append("/"); 109bcbc1788b478b1e54079318ad073e8490aa66faetfarina resourcePath.append(fFilename); 110f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 111bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkImageDecoder* codec = NULL; 112bcbc1788b478b1e54079318ad073e8490aa66faetfarina SkFILEStream stream(resourcePath.c_str()); 113f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org if (stream.isValid()) { 114f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org codec = SkImageDecoder::Factory(&stream); 115f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 116f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org if (codec) { 117f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org stream.rewind(); 118bfefc7c95fc0e8ebd5000c68f6d16e1a3ea0e71ereed codec->decode(&stream, &fBM, kN32_SkColorType, SkImageDecoder::kDecodePixels_Mode); 119f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org SkDELETE(codec); 120f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } else { 121f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org fBM.allocN32Pixels(1, 1); 122f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad 123f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 124f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org fSize = fBM.height(); 125f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org } 126f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org private: 127f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org typedef skiagm::GM INHERITED; 128f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org}; 129f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 130f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////// 131f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 132f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.org 133f449156bd00815eae1f1daea436f08068ef0f01ccommit-bot@chromium.orgDEF_GM( return new FilterIndiaBoxGM("box.gif"); ) 134