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