Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(334)

Side by Side Diff: include/core/SkMaskFilter.h

Issue 109823012: Pass ctm when performing image filtering in GPU backend. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Rob's comments Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/core/SkMaskFilter.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2006 The Android Open Source Project 3 * Copyright 2006 The Android Open Source Project
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #ifndef SkMaskFilter_DEFINED 10 #ifndef SkMaskFilter_DEFINED
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 @param margin if not null, return the buffer dx/dy need when calculati ng the effect. Used when 56 @param margin if not null, return the buffer dx/dy need when calculati ng the effect. Used when
57 drawing a clipped object to know how much larger to allo cate the src before 57 drawing a clipped object to know how much larger to allo cate the src before
58 applying the filter. If returning false, ignore this par ameter. 58 applying the filter. If returning false, ignore this par ameter.
59 @return true if the dst mask was correctly created. 59 @return true if the dst mask was correctly created.
60 */ 60 */
61 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&, 61 virtual bool filterMask(SkMask* dst, const SkMask& src, const SkMatrix&,
62 SkIPoint* margin) const; 62 SkIPoint* margin) const;
63 63
64 #if SK_SUPPORT_GPU 64 #if SK_SUPPORT_GPU
65 /** 65 /**
66 * Returns true if the filter can be expressed a single-pass 66 * Returns true if the filter can be expressed a single-pass GrEffect witho ut requiring an
67 * GrEffect, used to process this filter on the GPU, or false if 67 * explicit input mask. Per-pixel, the effect receives the incoming mask's coverage as
68 * not. 68 * the input color and outputs the filtered covereage value. This means tha t each pixel's
69 * filtered coverage must only depend on the unfiltered mask value for that pixel and not on
70 * surrounding values.
69 * 71 *
70 * If effect is non-NULL, a new GrEffect instance is stored 72 * If effect is non-NULL, a new GrEffect instance is stored in it. The calle r assumes ownership
71 * in it. The caller assumes ownership of the stage, and it is up to the 73 * of the effect and must unref it.
72 * caller to unref it.
73 */ 74 */
74 virtual bool asNewEffect(GrEffectRef** effect, GrTexture*) const; 75 virtual bool asNewEffect(GrEffectRef** effect,
76 GrTexture*,
77 const SkMatrix& ctm) const;
75 78
76 /** 79 /**
77 * Returns true if the filter can be processed on the GPU. This is most 80 * If asNewEffect() fails the filter may be implemented on the GPU by a sub class overriding
78 * often used for multi-pass effects, where intermediate results must be 81 * filterMaskGPU (declared below). That code path requires constructing a s rc mask as input.
79 * rendered to textures. For single-pass effects, use asNewEffect(). 82 * Since that is a potentially expensive operation, the subclass must also override this
83 * function to indicate whether filterTextureMaskGPU would succeeed if the mask were to be
84 * created.
80 * 85 *
81 * 'maskRect' returns the device space portion of the mask the the filter 86 * 'maskRect' returns the device space portion of the mask that the filter needs. The mask
82 * needs. The mask passed into 'filterMaskGPU' should have the same extent 87 * passed into 'filterMaskGPU' should have the same extent as 'maskRect' bu t be translated
83 * as 'maskRect' but be translated to the upper-left corner of the mask 88 * to the upper-left corner of the mask (i.e., (maskRect.fLeft, maskRect.fT op) appears at
84 * (i.e., (maskRect.fLeft, maskRect.fTop) appears at (0, 0) in the mask). 89 * (0, 0) in the mask).
85 */ 90 */
86 virtual bool canFilterMaskGPU(const SkRect& devBounds, 91 virtual bool canFilterMaskGPU(const SkRect& devBounds,
87 const SkIRect& clipBounds, 92 const SkIRect& clipBounds,
88 const SkMatrix& ctm, 93 const SkMatrix& ctm,
89 SkRect* maskRect) const; 94 SkRect* maskRect) const;
90 95
91 /** 96 /**
92 * Perform this mask filter on the GPU. This is most often used for 97 * This function is used to implement filters that require an explicit src m ask. It should only
93 * multi-pass effects, where intermediate results must be rendered to 98 * be called if canFilterMaskGPU returned true and the maskRect param should be the output from
94 * textures. For single-pass effects, use asNewEffect(). 'src' is the 99 * that call. canOverwriteSrc indicates whether the implementation may treat src as a scratch
95 * source image for processing, as a texture-backed bitmap. 'result' is 100 * texture and overwrite its contents. When true it is also legal to return src as the result.
96 * the destination bitmap, which should contain a texture-backed pixelref 101 * Implementations are free to get the GrContext from the src texture in ord er to create
97 * on success. 'maskRect' should be the rect returned from canFilterMaskGPU . 102 * additional textures and perform multiple passes.
98 */
99 bool filterMaskGPU(GrContext* context,
100 const SkBitmap& src,
101 const SkRect& maskRect,
102 SkBitmap* result) const;
103
104 /**
105 * This flavor of 'filterMaskGPU' provides a more direct means of accessing
106 * the filtering capabilities. Setting 'canOverwriteSrc' can allow some
107 * filters to skip the allocation of an additional texture.
108 */ 103 */
109 virtual bool filterMaskGPU(GrTexture* src, 104 virtual bool filterMaskGPU(GrTexture* src,
105 const SkMatrix& ctm,
110 const SkRect& maskRect, 106 const SkRect& maskRect,
111 GrTexture** result, 107 GrTexture** result,
112 bool canOverwriteSrc) const; 108 bool canOverwriteSrc) const;
113 #endif 109 #endif
114 110
115 /** 111 /**
116 * The fast bounds function is used to enable the paint to be culled early 112 * The fast bounds function is used to enable the paint to be culled early
117 * in the drawing pipeline. This function accepts the current bounds of the 113 * in the drawing pipeline. This function accepts the current bounds of the
118 * paint as its src param and the filter adjust those bounds using its 114 * paint as its src param and the filter adjust those bounds using its
119 * current mask and returns the result using the dest param. Callers are 115 * current mask and returns the result using the dest param. Callers are
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 to render that mask. Returns false if filterMask() returned false. 183 to render that mask. Returns false if filterMask() returned false.
188 */ 184 */
189 bool filterRRect(const SkRRect& devRRect, const SkMatrix& devMatrix, 185 bool filterRRect(const SkRRect& devRRect, const SkMatrix& devMatrix,
190 const SkRasterClip&, SkBounder*, SkBlitter* blitter, 186 const SkRasterClip&, SkBounder*, SkBlitter* blitter,
191 SkPaint::Style style) const; 187 SkPaint::Style style) const;
192 188
193 typedef SkFlattenable INHERITED; 189 typedef SkFlattenable INHERITED;
194 }; 190 };
195 191
196 #endif 192 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkMaskFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698