Index: src/core/SkMaskFilter.cpp |
=================================================================== |
--- src/core/SkMaskFilter.cpp (revision 9864) |
+++ src/core/SkMaskFilter.cpp (working copy) |
@@ -11,7 +11,11 @@ |
#include "SkBlitter.h" |
#include "SkBounder.h" |
#include "SkDraw.h" |
+#include "SkGr.h" |
+#include "SkGrPixelRef.h" |
#include "SkRasterClip.h" |
+#include "SkTypes.h" |
+#include "GrTexture.h" |
SK_DEFINE_INST_COUNT(SkMaskFilter) |
@@ -266,10 +270,60 @@ |
return kUnimplemented_FilterReturn; |
} |
-SkMaskFilter::BlurType SkMaskFilter::asABlur(BlurInfo*) const { |
- return kNone_BlurType; |
+bool SkMaskFilter::asNewEffect(GrEffectRef** effect, GrTexture*) const { |
+ return false; |
} |
+bool SkMaskFilter::canFilterMaskGPU(const SkRect& devBounds, |
+ const SkIRect& clipBounds, |
+ const SkMatrix& ctm, |
+ SkRect* maskRect) const { |
+ return false; |
+} |
+ |
+bool SkMaskFilter::filterMaskGPU(GrContext* context, |
+ const SkBitmap& srcBM, |
+ const SkRect& maskRect, |
+ SkBitmap* resultBM) const { |
+ SkAutoTUnref<GrTexture> src; |
+ if (NULL == srcBM.getTexture()) { |
+ GrTextureDesc desc; |
+ desc.fConfig = SkBitmapConfig2GrPixelConfig(srcBM.config()); |
+ desc.fWidth = srcBM.width(); |
+ desc.fHeight = srcBM.height(); |
+ |
+ SkAutoLockPixels alp(srcBM); |
+ |
+ src.reset(context->createUncachedTexture(desc, |
+ srcBM.getPixels(), |
+ srcBM.rowBytes())); |
+ if (NULL == src.get()) { |
+ return false; |
+ } |
+ } else { |
+ src.reset((GrTexture*) srcBM.getTexture()); |
+ src.get()->ref(); |
+ } |
+ GrTexture* dst; |
+ |
+ bool result = this->filterMaskGPU(src, maskRect, &dst, false); |
+ if (!result) { |
+ return false; |
+ } |
+ |
+ resultBM->setConfig(srcBM.config(), dst->width(), dst->height()); |
+ resultBM->setPixelRef(SkNEW_ARGS(SkGrPixelRef, (dst)))->unref(); |
+ dst->unref(); |
+ return true; |
+} |
+ |
+bool SkMaskFilter::filterMaskGPU(GrTexture* src, |
+ const SkRect& maskRect, |
+ GrTexture** result, |
+ bool canOverwriteSrc) const { |
+ return false; |
+} |
+ |
void SkMaskFilter::computeFastBounds(const SkRect& src, SkRect* dst) const { |
SkMask srcM, dstM; |