blob: cd277ec225e9127c1cb23a9ed1612f8f2686850e [file] [log] [blame]
reedc15d9572015-06-09 13:13:16 -07001/*
2 * Copyright 2011 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
djsollen@google.comc73dd5c2012-08-07 15:54:32 +00007
reed@google.com32d25b62011-12-20 16:19:00 +00008#include "SkTestImageFilters.h"
9#include "SkCanvas.h"
reed@google.com76dd2772012-01-05 21:15:07 +000010#include "SkDevice.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000011#include "SkReadBuffer.h"
12#include "SkWriteBuffer.h"
reed@google.com32d25b62011-12-20 16:19:00 +000013
reed@google.come7639512012-08-07 14:25:44 +000014// Simple helper canvas that "takes ownership" of the provided device, so that
15// when this canvas goes out of scope, so will its device. Could be replaced
16// with the following:
17//
18// SkCanvas canvas(device);
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000019// SkAutoTUnref<SkBaseDevice> aur(device);
reed@google.come7639512012-08-07 14:25:44 +000020//
reed@google.com76dd2772012-01-05 21:15:07 +000021class OwnDeviceCanvas : public SkCanvas {
22public:
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000023 OwnDeviceCanvas(SkBaseDevice* device) : SkCanvas(device) {
reed@google.com76dd2772012-01-05 21:15:07 +000024 SkSafeUnref(device);
25 }
26};
27
reed@google.com32d25b62011-12-20 16:19:00 +000028///////////////////////////////////////////////////////////////////////////////
29
reed@google.com76dd2772012-01-05 21:15:07 +000030bool SkDownSampleImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
senorblanco@chromium.org4cb543d2014-03-14 15:44:01 +000031 const Context&,
commit-bot@chromium.orgae761f72014-02-05 22:32:02 +000032 SkBitmap* result, SkIPoint*) const {
reed@google.com32d25b62011-12-20 16:19:00 +000033 SkScalar scale = fScale;
34 if (scale > SK_Scalar1 || scale <= 0) {
35 return false;
36 }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000037
reed@google.com32d25b62011-12-20 16:19:00 +000038 int dstW = SkScalarRoundToInt(src.width() * scale);
39 int dstH = SkScalarRoundToInt(src.height() * scale);
40 if (dstW < 1) {
41 dstW = 1;
42 }
43 if (dstH < 1) {
44 dstH = 1;
45 }
reed@google.com76dd2772012-01-05 21:15:07 +000046
47 SkBitmap tmp;
48
reed@google.com32d25b62011-12-20 16:19:00 +000049 // downsample
50 {
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000051 SkBaseDevice* dev = proxy->createDevice(dstW, dstH);
reed@google.com76dd2772012-01-05 21:15:07 +000052 if (NULL == dev) {
53 return false;
54 }
55 OwnDeviceCanvas canvas(dev);
reed@google.com32d25b62011-12-20 16:19:00 +000056 SkPaint paint;
reed@google.com76dd2772012-01-05 21:15:07 +000057
reed93a12152015-03-16 10:08:34 -070058 paint.setFilterQuality(kLow_SkFilterQuality);
reed@google.com32d25b62011-12-20 16:19:00 +000059 canvas.scale(scale, scale);
60 canvas.drawBitmap(src, 0, 0, &paint);
reed@google.com76dd2772012-01-05 21:15:07 +000061 tmp = dev->accessBitmap(false);
reed@google.com32d25b62011-12-20 16:19:00 +000062 }
reed@google.com76dd2772012-01-05 21:15:07 +000063
reed@google.com32d25b62011-12-20 16:19:00 +000064 // upscale
65 {
robertphillips@google.com1f2f3382013-08-29 11:54:56 +000066 SkBaseDevice* dev = proxy->createDevice(src.width(), src.height());
reed@google.com76dd2772012-01-05 21:15:07 +000067 if (NULL == dev) {
68 return false;
69 }
70 OwnDeviceCanvas canvas(dev);
71
72 SkRect r = SkRect::MakeWH(SkIntToScalar(src.width()),
73 SkIntToScalar(src.height()));
reed84984ef2015-07-17 07:09:43 -070074 canvas.drawBitmapRect(tmp, r);
reed@google.com76dd2772012-01-05 21:15:07 +000075 *result = dev->accessBitmap(false);
reed@google.com32d25b62011-12-20 16:19:00 +000076 }
77 return true;
78}
79
reed9fa60da2014-08-21 07:59:51 -070080SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) {
81 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
82 return Create(buffer.readScalar(), common.getInput(0));
83}
84
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000085void SkDownSampleImageFilter::flatten(SkWriteBuffer& buffer) const {
reed@google.com32d25b62011-12-20 16:19:00 +000086 this->INHERITED::flatten(buffer);
reed@google.com32d25b62011-12-20 16:19:00 +000087 buffer.writeScalar(fScale);
88}
robertphillipsf3f5bad2014-12-19 13:49:15 -080089
90#ifndef SK_IGNORE_TO_STRING
91void SkDownSampleImageFilter::toString(SkString* str) const {
92 str->appendf("SkDownSampleImageFilter: (");
93 str->append(")");
94}
95#endif