2 * Copyright 2014 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef GrPorterDuffXferProcessor_DEFINED
9 #define GrPorterDuffXferProcessor_DEFINED
12 #include "GrXferProcessor.h"
13 #include "SkXfermode.h"
17 class GrPorterDuffXPFactory : public GrXPFactory {
19 static sk_sp<GrXPFactory> Make(SkXfermode::Mode mode);
21 void getInvariantBlendedColor(const GrProcOptInfo& colorPOI,
22 GrXPFactory::InvariantBlendedColor*) const override;
25 /** Because src-over is so common we special case it for performance reasons. If this returns
26 null then the SimpleSrcOverXP() below should be used. */
27 static GrXferProcessor* CreateSrcOverXferProcessor(const GrCaps& caps,
28 const GrPipelineOptimizations& optimizations,
30 const GrXferProcessor::DstTexture*);
31 /** This XP implements non-LCD src-over using hw blend with no optimizations. It is returned
32 by reference because it is global and its ref-cnting methods are not thread safe. */
33 static const GrXferProcessor& SimpleSrcOverXP();
35 static inline void SrcOverInvariantBlendedColor(
37 GrColorComponentFlags validColorFlags,
39 GrXPFactory::InvariantBlendedColor* blendedColor) {
41 blendedColor->fWillBlendWithDst = true;
42 blendedColor->fKnownColorFlags = kNone_GrColorComponentFlags;
45 blendedColor->fWillBlendWithDst = false;
47 blendedColor->fKnownColor = inputColor;
48 blendedColor->fKnownColorFlags = validColorFlags;
51 static bool SrcOverWillNeedDstTexture(const GrCaps&, const GrPipelineOptimizations&);
54 GrPorterDuffXPFactory(SkXfermode::Mode);
56 GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
57 const GrPipelineOptimizations& optimizations,
59 const DstTexture*) const override;
61 bool onWillReadDstColor(const GrCaps&, const GrPipelineOptimizations&) const override;
63 bool onIsEqual(const GrXPFactory& xpfBase) const override {
64 const GrPorterDuffXPFactory& xpf = xpfBase.cast<GrPorterDuffXPFactory>();
65 return fXfermode == xpf.fXfermode;
68 GR_DECLARE_XP_FACTORY_TEST;
69 static void TestGetXPOutputTypes(const GrXferProcessor*, int* outPrimary, int* outSecondary);
71 SkXfermode::Mode fXfermode;
73 friend class GrPorterDuffTest; // for TestGetXPOutputTypes()
74 typedef GrXPFactory INHERITED;