1/*
2 * Copyright 2012 The Android Open Source Project
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#ifndef SkDeviceImageFilterProxy_DEFINED
9#define SkDeviceImageFilterProxy_DEFINED
10
11#include "SkBitmapDevice.h"
12#include "SkDevice.h"
13#include "SkImageFilter.h"
14#include "SkSurfaceProps.h"
15
16class SkDeviceImageFilterProxy : public SkImageFilter::Proxy {
17public:
18    SkDeviceImageFilterProxy(SkBaseDevice* device, const SkSurfaceProps& props)
19        : fDevice(device)
20        , fProps(props.flags(), kUnknown_SkPixelGeometry)
21    {}
22
23    SkBaseDevice* createDevice(int w, int h) override {
24        SkBaseDevice::CreateInfo cinfo(SkImageInfo::MakeN32Premul(w, h),
25                                       SkBaseDevice::kNever_TileUsage,
26                                       kUnknown_SkPixelGeometry,
27                                       true /*forImageFilter*/);
28        SkBaseDevice* dev = fDevice->onCreateDevice(cinfo, NULL);
29        if (NULL == dev) {
30            dev = SkBitmapDevice::Create(cinfo.fInfo);
31        }
32        return dev;
33    }
34    bool canHandleImageFilter(const SkImageFilter* filter) override {
35        return fDevice->canHandleImageFilter(filter);
36    }
37    virtual bool filterImage(const SkImageFilter* filter, const SkBitmap& src,
38                             const SkImageFilter::Context& ctx,
39                             SkBitmap* result, SkIPoint* offset) override {
40        return fDevice->filterImage(filter, src, ctx, result, offset);
41    }
42
43    const SkSurfaceProps* surfaceProps() const override {
44        return &fProps;
45    }
46
47private:
48    SkBaseDevice*  fDevice;
49    const SkSurfaceProps fProps;
50};
51
52#endif
53