blob: b8b0e187ede4452ff3523e56fed8b445b3279fa2 [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
robertphillips48e78462016-02-17 13:57:16 -080030bool SkDownSampleImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src,
31 const Context&,
32 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);
halcanary96fcdcc2015-08-27 07:41:13 -070052 if (nullptr == dev) {
reed@google.com76dd2772012-01-05 21:15:07 +000053 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());
halcanary96fcdcc2015-08-27 07:41:13 -070067 if (nullptr == dev) {
reed@google.com76dd2772012-01-05 21:15:07 +000068 return false;
69 }
70 OwnDeviceCanvas canvas(dev);
71
reede47829b2015-08-06 10:02:53 -070072 canvas.drawBitmapRect(tmp, SkRect::MakeIWH(src.width(), src.height()), nullptr);
reed@google.com76dd2772012-01-05 21:15:07 +000073 *result = dev->accessBitmap(false);
reed@google.com32d25b62011-12-20 16:19:00 +000074 }
75 return true;
76}
77
reed9fa60da2014-08-21 07:59:51 -070078SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) {
79 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
80 return Create(buffer.readScalar(), common.getInput(0));
81}
82
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000083void SkDownSampleImageFilter::flatten(SkWriteBuffer& buffer) const {
reed@google.com32d25b62011-12-20 16:19:00 +000084 this->INHERITED::flatten(buffer);
reed@google.com32d25b62011-12-20 16:19:00 +000085 buffer.writeScalar(fScale);
86}
robertphillipsf3f5bad2014-12-19 13:49:15 -080087
88#ifndef SK_IGNORE_TO_STRING
89void SkDownSampleImageFilter::toString(SkString* str) const {
90 str->appendf("SkDownSampleImageFilter: (");
91 str->append(")");
92}
93#endif