• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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  */
7 
8 #include "SkTestImageFilters.h"
9 #include "SkCanvas.h"
10 #include "SkDevice.h"
11 #include "SkReadBuffer.h"
12 #include "SkWriteBuffer.h"
13 
14 // 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);
19 //  SkAutoTUnref<SkBaseDevice> aur(device);
20 //
21 class OwnDeviceCanvas : public SkCanvas {
22 public:
OwnDeviceCanvas(SkBaseDevice * device)23     OwnDeviceCanvas(SkBaseDevice* device) : SkCanvas(device) {
24         SkSafeUnref(device);
25     }
26 };
27 
28 ///////////////////////////////////////////////////////////////////////////////
29 
onFilterImageDeprecated(Proxy * proxy,const SkBitmap & src,const Context &,SkBitmap * result,SkIPoint *) const30 bool SkDownSampleImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src,
31                                                       const Context&,
32                                                       SkBitmap* result, SkIPoint*) const {
33     SkScalar scale = fScale;
34     if (scale > SK_Scalar1 || scale <= 0) {
35         return false;
36     }
37 
38     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     }
46 
47     SkBitmap tmp;
48 
49     // downsample
50     {
51         SkBaseDevice* dev = proxy->createDevice(dstW, dstH);
52         if (nullptr == dev) {
53             return false;
54         }
55         OwnDeviceCanvas canvas(dev);
56         SkPaint paint;
57 
58         paint.setFilterQuality(kLow_SkFilterQuality);
59         canvas.scale(scale, scale);
60         canvas.drawBitmap(src, 0, 0, &paint);
61         tmp = dev->accessBitmap(false);
62     }
63 
64     // upscale
65     {
66         SkBaseDevice* dev = proxy->createDevice(src.width(), src.height());
67         if (nullptr == dev) {
68             return false;
69         }
70         OwnDeviceCanvas canvas(dev);
71 
72         canvas.drawBitmapRect(tmp, SkRect::MakeIWH(src.width(), src.height()), nullptr);
73         *result = dev->accessBitmap(false);
74     }
75     return true;
76 }
77 
CreateProc(SkReadBuffer & buffer)78 SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) {
79     SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
80     return Create(buffer.readScalar(), common.getInput(0));
81 }
82 
flatten(SkWriteBuffer & buffer) const83 void SkDownSampleImageFilter::flatten(SkWriteBuffer& buffer) const {
84     this->INHERITED::flatten(buffer);
85     buffer.writeScalar(fScale);
86 }
87 
88 #ifndef SK_IGNORE_TO_STRING
toString(SkString * str) const89 void SkDownSampleImageFilter::toString(SkString* str) const {
90     str->appendf("SkDownSampleImageFilter: (");
91     str->append(")");
92 }
93 #endif
94