aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/gpu/effects
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2015-11-20 14:01:07 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-11-20 14:01:07 -0800
commita7006d45217d128a94fa53cb4b827cca79bc7049 (patch)
treebc66f96e8ef988078ea8ee752006c9debaef32b2 /include/gpu/effects
parent8b78bd6d5b39fe8ef407c4b59b1be8421e58d665 (diff)
Make specialized SrcOver XPFactory
Diffstat (limited to 'include/gpu/effects')
-rw-r--r--include/gpu/effects/GrCustomXfermode.h2
-rw-r--r--include/gpu/effects/GrPorterDuffXferProcessor.h51
2 files changed, 48 insertions, 5 deletions
diff --git a/include/gpu/effects/GrCustomXfermode.h b/include/gpu/effects/GrCustomXfermode.h
index bcbd5833ca..7fe930822a 100644
--- a/include/gpu/effects/GrCustomXfermode.h
+++ b/include/gpu/effects/GrCustomXfermode.h
@@ -18,7 +18,7 @@ class GrTexture;
*/
namespace GrCustomXfermode {
bool IsSupportedMode(SkXfermode::Mode mode);
- GrXPFactory* CreateXPFactory(SkXfermode::Mode mode);
+ const GrXPFactory* CreateXPFactory(SkXfermode::Mode mode);
};
#endif
diff --git a/include/gpu/effects/GrPorterDuffXferProcessor.h b/include/gpu/effects/GrPorterDuffXferProcessor.h
index d297e32908..72faeb572c 100644
--- a/include/gpu/effects/GrPorterDuffXferProcessor.h
+++ b/include/gpu/effects/GrPorterDuffXferProcessor.h
@@ -14,9 +14,9 @@
class GrProcOptInfo;
-class GrPorterDuffXPFactory : public GrXPFactory {
+class GrPDXPFactory : public GrXPFactory {
public:
- static GrXPFactory* Create(SkXfermode::Mode mode);
+ static const GrXPFactory* Create(SkXfermode::Mode mode);
bool supportsRGBCoverage(GrColor /*knownColor*/, uint32_t /*knownColorFlags*/) const override {
return true;
@@ -26,7 +26,7 @@ public:
GrXPFactory::InvariantBlendedColor*) const override;
private:
- GrPorterDuffXPFactory(SkXfermode::Mode);
+ GrPDXPFactory(SkXfermode::Mode);
GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
const GrProcOptInfo& colorPOI,
@@ -40,7 +40,7 @@ private:
bool hasMixedSamples) const override;
bool onIsEqual(const GrXPFactory& xpfBase) const override {
- const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>();
+ const GrPDXPFactory& xpf = xpfBase.cast<GrPDXPFactory>();
return fXfermode == xpf.fXfermode;
}
@@ -53,4 +53,47 @@ private:
typedef GrXPFactory INHERITED;
};
+class GrSrcOverPDXPFactory : public GrXPFactory {
+public:
+ GrSrcOverPDXPFactory();
+
+ bool supportsRGBCoverage(GrColor /*knownColor*/, uint32_t /*knownColorFlags*/) const override {
+ return true;
+ }
+
+ void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
+ GrXPFactory::InvariantBlendedColor*) const override;
+
+private:
+ GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
+ const GrProcOptInfo& colorPOI,
+ const GrProcOptInfo& coveragePOI,
+ bool hasMixedSamples,
+ const DstTexture*) const override;
+
+ bool willReadDstColor(const GrCaps& caps,
+ const GrProcOptInfo& colorPOI,
+ const GrProcOptInfo& coveragePOI,
+ bool hasMixedSamples) const override;
+
+ bool onIsEqual(const GrXPFactory& /*xpfBase*/) const override {
+ return true;
+ }
+
+ GR_DECLARE_XP_FACTORY_TEST;
+
+ typedef GrXPFactory INHERITED;
+};
+
+namespace GrPorterDuffXPFactory {
+ const GrSrcOverPDXPFactory gSrcOverPDXPFactory;
+
+ inline const GrXPFactory* Create(SkXfermode::Mode mode) {
+ if (SkXfermode::kSrcOver_Mode == mode) {
+ return SkRef(&gSrcOverPDXPFactory);
+ }
+ return GrPDXPFactory::Create(mode);
+ }
+};
+
#endif