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

Unified Diff: src/core/SkXfermode.cpp

Issue 23644006: ARM Skia NEON patches - 28 - Xfermode: SIMD modeprocs (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: src/core/SkXfermode.cpp
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index e50e4f5ce58179cacbea609785d69a27bea8cb4f..675cc5e2e69be50b17e2cf65e4ba240f601d9b98 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -12,6 +12,7 @@
#include "SkFlattenableBuffers.h"
#include "SkMathPriv.h"
#include "SkString.h"
+#include "SkXfermode_proccoeff.h"
SK_DEFINE_INST_COUNT(SkXfermode)
@@ -631,16 +632,7 @@ static SkPMColor luminosity_modeproc(SkPMColor src, SkPMColor dst) {
return SkPackARGB32(a, r, g, b);
}
-
-struct ProcCoeff {
- SkXfermodeProc fProc;
- SkXfermode::Coeff fSC;
- SkXfermode::Coeff fDC;
-};
-
-#define CANNOT_USE_COEFF SkXfermode::Coeff(-1)
-
-static const ProcCoeff gProcCoeffs[] = {
+const ProcCoeff gProcCoeffs[] = {
{ clear_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kZero_Coeff },
{ src_modeproc, SkXfermode::kOne_Coeff, SkXfermode::kZero_Coeff },
{ dst_modeproc, SkXfermode::kZero_Coeff, SkXfermode::kOne_Coeff },
@@ -1352,83 +1344,6 @@ GrEffectRef* XferEffect::TestCreate(SkRandom* rand,
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
-class SkProcCoeffXfermode : public SkProcXfermode {
-public:
- SkProcCoeffXfermode(const ProcCoeff& rec, Mode mode)
- : INHERITED(rec.fProc) {
- fMode = mode;
- // these may be valid, or may be CANNOT_USE_COEFF
- fSrcCoeff = rec.fSC;
- fDstCoeff = rec.fDC;
- }
-
- virtual bool asMode(Mode* mode) const SK_OVERRIDE {
- if (mode) {
- *mode = fMode;
- }
- return true;
- }
-
- virtual bool asCoeff(Coeff* sc, Coeff* dc) const SK_OVERRIDE {
- if (CANNOT_USE_COEFF == fSrcCoeff) {
- return false;
- }
-
- if (sc) {
- *sc = fSrcCoeff;
- }
- if (dc) {
- *dc = fDstCoeff;
- }
- return true;
- }
-
-#if SK_SUPPORT_GPU
- virtual bool asNewEffectOrCoeff(GrContext*,
- GrEffectRef** effect,
- Coeff* src,
- Coeff* dst,
- GrTexture* background) const SK_OVERRIDE {
- if (this->asCoeff(src, dst)) {
- return true;
- }
- if (XferEffect::IsSupportedMode(fMode)) {
- if (NULL != effect) {
- *effect = XferEffect::Create(fMode, background);
- SkASSERT(NULL != *effect);
- }
- return true;
- }
- return false;
- }
-#endif
-
- SK_DEVELOPER_TO_STRING()
- SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkProcCoeffXfermode)
-
-protected:
- SkProcCoeffXfermode(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) {
- fMode = (SkXfermode::Mode)buffer.read32();
-
- const ProcCoeff& rec = gProcCoeffs[fMode];
- // these may be valid, or may be CANNOT_USE_COEFF
- fSrcCoeff = rec.fSC;
- fDstCoeff = rec.fDC;
- // now update our function-ptr in the super class
- this->INHERITED::setProc(rec.fProc);
- }
-
- virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE {
- this->INHERITED::flatten(buffer);
- buffer.write32(fMode);
- }
-
-private:
- Mode fMode;
- Coeff fSrcCoeff, fDstCoeff;
-
- typedef SkProcXfermode INHERITED;
-};
const char* SkXfermode::ModeName(Mode mode) {
SkASSERT((unsigned) mode <= (unsigned)kLastMode);
@@ -1688,12 +1603,20 @@ void SkDstOutXfermode::toString(SkString* str) const {
///////////////////////////////////////////////////////////////////////////////
+extern SkProcCoeffXfermode* SkPlatformXfermodeFactory(const ProcCoeff& rec, SkXfermode::Mode mode);
+
SkXfermode* SkXfermode::Create(Mode mode) {
SkASSERT(SK_ARRAY_COUNT(gProcCoeffs) == kModeCount);
SkASSERT((unsigned)mode < kModeCount);
const ProcCoeff& rec = gProcCoeffs[mode];
+ // check if we have a platform optim for that
+ SkProcCoeffXfermode* xfm = SkPlatformXfermodeFactory(rec, mode);
+ if (xfm != NULL) {
+ return xfm;
+ }
+
switch (mode) {
case kClear_Mode:
return SkNEW_ARGS(SkClearXfermode, (rec));

Powered by Google App Engine
This is Rietveld 408576698