/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "gm.h" #include "SkGradientShader.h" #include "SkTypeface.h" #include "SkImageDecoder.h" #include "SkStream.h" #include "SkImageEncoder.h" #include "SkBitmapScaler.h" #include "SkBitmapProcState.h" static SkSize computeSize(const SkBitmap& bm, const SkMatrix& mat) { SkRect bounds = SkRect::MakeWH(SkIntToScalar(bm.width()), SkIntToScalar(bm.height())); mat.mapRect(&bounds); return SkSize::Make(bounds.width(), bounds.height()); } static void draw_row(SkCanvas* canvas, const SkBitmap& bm, const SkMatrix& mat, SkScalar dx) { SkPaint paint; SkAutoCanvasRestore acr(canvas, true); canvas->drawBitmapMatrix(bm, mat, &paint); paint.setFilterLevel(SkPaint::kLow_FilterLevel); canvas->translate(dx, 0); canvas->drawBitmapMatrix(bm, mat, &paint); paint.setFilterLevel(SkPaint::kMedium_FilterLevel); canvas->translate(dx, 0); canvas->drawBitmapMatrix(bm, mat, &paint); paint.setFilterLevel(SkPaint::kHigh_FilterLevel); canvas->translate(dx, 0); canvas->drawBitmapMatrix(bm, mat, &paint); } class FilterIndiaBoxGM : public skiagm::GM { void onOnceBeforeDraw() { this->makeBitmap(); SkScalar cx = SkScalarHalf(fBM.width()); SkScalar cy = SkScalarHalf(fBM.height()); float vertScale = 30.0f/55.0f; float horizScale = 150.0f/200.0f; fMatrix[0].setScale(horizScale, vertScale); fMatrix[1].setRotate(30, cx, cy); fMatrix[1].postScale(horizScale, vertScale); } public: SkBitmap fBM; SkMatrix fMatrix[2]; SkString fName; FilterIndiaBoxGM() { this->setBGColor(0xFFDDDDDD); } FilterIndiaBoxGM(const char filename[]) : fFilename(filename) { fName.printf("filterindiabox"); } protected: virtual uint32_t onGetFlags() const SK_OVERRIDE { return kSkipTiled_Flag; } virtual SkString onShortName() SK_OVERRIDE { return fName; } virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(1024, 768); } virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { canvas->translate(10, 10); for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrix); ++i) { SkSize size = computeSize(fBM, fMatrix[i]); size.fWidth += 20; size.fHeight += 20; draw_row(canvas, fBM, fMatrix[i], size.fWidth); canvas->translate(0, size.fHeight); } } protected: SkString fFilename; int fSize; SkScalar getScale() { return 192.f/fSize; } void makeBitmap() { SkString path(skiagm::GM::gResourcePath); path.append("/"); path.append(fFilename); SkImageDecoder *codec = NULL; SkFILEStream stream(path.c_str()); if (stream.isValid()) { codec = SkImageDecoder::Factory(&stream); } if (codec) { stream.rewind(); codec->decode(&stream, &fBM, SkBitmap::kARGB_8888_Config, SkImageDecoder::kDecodePixels_Mode); SkDELETE(codec); } else { fBM.allocN32Pixels(1, 1); *(fBM.getAddr32(0,0)) = 0xFF0000FF; // red == bad } fSize = fBM.height(); } private: typedef skiagm::GM INHERITED; }; ////////////////////////////////////////////////////////////////////////////// DEF_GM( return new FilterIndiaBoxGM("box.gif"); )