diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-09-18 12:59:44 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-09-18 12:59:44 +0000 |
commit | f1ab723033a186dc53434104a636c2dfac5fc863 (patch) | |
tree | b3e9f1224fdaa890072b22a953df589fdb80fd58 /gm/bitmaprect.cpp | |
parent | 54339a826e460c2371f946224cca4db8482d8f5b (diff) |
Change drawBitmapRect to take a float-src-rect instead of integer-src-rect. This
allows the client more control over the scaling. Because of virtual overrides
and wanting to keep the old call-sites up and running, this CL renames the
virtual entry-point to drawBitmapRectToRect, and downgrades drawBitmapRect to
a non-virtual helper function.
The implementation is to use the float-rect for computing the matrix, but still
cons-up an integer rect for the purposes of subsetting the original bitmap. We
do this by calling float_src->roundOut(&int_src) so that we include all
(partially) covered src pixels.
No change needed on SkDevice, since that signature is explicitly passed the
computed matrix.
Review URL: https://codereview.appspot.com/6501140
git-svn-id: http://skia.googlecode.com/svn/trunk@5578 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gm/bitmaprect.cpp')
-rw-r--r-- | gm/bitmaprect.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/gm/bitmaprect.cpp b/gm/bitmaprect.cpp new file mode 100644 index 0000000000..0e6c074e83 --- /dev/null +++ b/gm/bitmaprect.cpp @@ -0,0 +1,100 @@ + +/* + * 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 "SkCanvas.h" +#include "SkGradientShader.h" +#include "SkGraphics.h" +#include "SkPath.h" +#include "SkRegion.h" +#include "SkShader.h" + +static void make_bitmap(SkBitmap* bitmap) { + SkCanvas canvas; + + { + bitmap->setConfig(SkBitmap::kARGB_8888_Config, 64, 64); + bitmap->allocPixels(); + canvas.setBitmapDevice(*bitmap); + } + + canvas.drawColor(SK_ColorRED); + SkPaint paint; + paint.setAntiAlias(true); + const SkPoint pts[] = { { 0, 0 }, { 64, 64 } }; + const SkColor colors[] = { SK_ColorWHITE, SK_ColorBLUE }; + paint.setShader(SkGradientShader::CreateLinear(pts, colors, NULL, 2, + SkShader::kClamp_TileMode))->unref(); + canvas.drawCircle(32, 32, 32, paint); +} + +class DrawBitmapRect2 : public skiagm::GM { + bool fUseIRect; +public: + DrawBitmapRect2(bool useIRect) : fUseIRect(useIRect) { + } + +protected: + virtual SkString onShortName() SK_OVERRIDE { + SkString str; + str.printf("bitmaprect_%s", fUseIRect ? "i" : "s"); + return str; + } + + virtual SkISize onISize() SK_OVERRIDE { + return SkISize::Make(640, 480); + } + + virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { + canvas->drawColor(0xFFCCCCCC); + + const SkIRect src[] = { + { 0, 0, 32, 32 }, + { 0, 0, 80, 80 }, + { 32, 32, 96, 96 }, + { -32, -32, 32, 32, } + }; + + SkPaint paint; + paint.setStyle(SkPaint::kStroke_Style); +// paint.setColor(SK_ColorGREEN); + + SkBitmap bitmap; + make_bitmap(&bitmap); + + SkRect dstR = { 0, 200, 128, 380 }; + + canvas->translate(16, 40); + for (size_t i = 0; i < SK_ARRAY_COUNT(src); i++) { + SkRect srcR; + srcR.set(src[i]); + + canvas->drawBitmap(bitmap, 0, 0, &paint); + if (fUseIRect) { + canvas->drawBitmapRectToRect(bitmap, &srcR, dstR, &paint); + } else { + canvas->drawBitmapRect(bitmap, &src[i], dstR, &paint); + } + + canvas->drawRect(dstR, paint); + canvas->drawRect(srcR, paint); + + canvas->translate(160, 0); + } + } + +private: + typedef skiagm::GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static skiagm::GM* MyFactory0(void*) { return new DrawBitmapRect2(false); } +static skiagm::GM* MyFactory1(void*) { return new DrawBitmapRect2(true); } + +static skiagm::GMRegistry reg0(MyFactory0); +static skiagm::GMRegistry reg1(MyFactory1); |