11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SkImageFilter_DEFINED
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SkImageFilter_DEFINED
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkFlattenable.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkBitmap;
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkDevice;
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkMatrix;
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstruct SkPoint;
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  Experimental.
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  Base class for image filters. If one is installed in the paint, then
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  all drawing occurs as usual, but it is as if the drawing happened into an
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  offscreen (before the xfermode is applied). This offscreen bitmap will
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  then be handed to the imagefilter, who in turn creates a new bitmap which
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  is what will finally be drawn to the device (using the original xfermode).
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  THIS SIGNATURE IS TEMPORARY
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  There are several weaknesses in this function signature:
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  1. Does not expose the destination/target device, so filters that can draw
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *     directly to it are unable to take advantage of that optimization.
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  2. Does not expose a way to create a "compabitible" image (i.e. gpu -> gpu)
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  3. As with #1, the filter is unable to "read" the dest (which would be slow)
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  Therefore, we should not create any real dependencies on this API yet -- it
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  is being checked in as a check-point so we can explore these and other
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  considerations.
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SK_API SkImageFilter : public SkFlattenable {
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    class Proxy {
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    public:
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        virtual SkDevice* createDevice(int width, int height) = 0;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // returns true if the proxy handled the filter itself. if this returns
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // false then the filter's code will be called.
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        virtual bool filterImage(SkImageFilter*, const SkBitmap& src,
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 const SkMatrix& ctm,
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                 SkBitmap* result, SkIPoint* offset) = 0;
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        virtual ~Proxy() {};
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Request a new (result) image to be created from the src image.
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the src has no pixels (isNull()) then the request just wants to
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  receive the config and width/height of the result.
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The matrix is the current matrix on the canvas.
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Offset is the amount to translate the resulting image relative to the
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  src when it is drawn.
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the result image cannot be created, return false, in which case both
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  the result and offset parameters will be ignored by the caller.
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool filterImage(Proxy*, const SkBitmap& src, const SkMatrix& ctm,
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     SkBitmap* result, SkIPoint* offset);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Given the src bounds of an image, this returns the bounds of the result
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  image after the filter has been applied.
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool filterBounds(const SkIRect& src, const SkMatrix& ctm, SkIRect* dst);
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Experimental.
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  If the filter can be expressed as a gaussian-blur, return true and
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  set the sigma to the values for horizontal and vertical.
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool asABlur(SkSize* sigma) const;
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
834f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /**
844f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  Experimental.
854f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *
864f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  If the filter can be expressed as an erode, return true and
874f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  set the radius in X and Y.
884f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     */
894f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual bool asAnErode(SkISize* radius) const;
904f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
914f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    /**
924f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  Experimental.
934f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *
944f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  If the filter can be expressed as a dilation, return true and
954f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     *  set the radius in X and Y.
964f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger     */
974f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger    virtual bool asADilate(SkISize* radius) const;
984f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkImageFilter() {}
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkImageFilter(SkFlattenableReadBuffer& rb) : INHERITED(rb) {}
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Default impl returns false
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterImage(Proxy*, const SkBitmap& src, const SkMatrix&,
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkBitmap* result, SkIPoint* offset);
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // Default impl copies src into dst and returns true
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual bool onFilterBounds(const SkIRect&, const SkMatrix&, SkIRect*);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkFlattenable INHERITED;
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
114