diff options
author | reed <reed@google.com> | 2016-03-02 09:49:02 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-02 09:49:02 -0800 |
commit | 05a5647efed7fcbcc5bd1efa445a6a3ab445a6c3 (patch) | |
tree | 6413809dbabe4d433b978156969b0b4f3c06d83a /src/core/SkBitmapProcState.h | |
parent | 391395dcfbff09a83f8f0e9d3e02d38c855ae2e9 (diff) |
fission bitmapprocstate
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1753903002
CQ_EXTRA_TRYBOTS=client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Review URL: https://codereview.chromium.org/1753903002
Diffstat (limited to 'src/core/SkBitmapProcState.h')
-rw-r--r-- | src/core/SkBitmapProcState.h | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h index a006e090b5..2d3d0e4347 100644 --- a/src/core/SkBitmapProcState.h +++ b/src/core/SkBitmapProcState.h @@ -27,10 +27,40 @@ typedef SkFixed3232 SkFractionalInt; class SkPaint; -struct SkBitmapProcState { - SkBitmapProcState(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader::TileMode tmy); - SkBitmapProcState(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMode tmy); - ~SkBitmapProcState(); +struct SkBitmapProcInfo { + SkBitmapProcInfo(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader::TileMode tmy); + SkBitmapProcInfo(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMode tmy); + ~SkBitmapProcInfo(); + + const SkBitmapProvider fProvider; + + SkPixmap fPixmap; + SkMatrix fInvMatrix; // copy of what is in fBMState, can we remove the dup? + SkColor fPaintColor; + SkShader::TileMode fTileModeX; + SkShader::TileMode fTileModeY; + SkFilterQuality fFilterQuality; + SkMatrix::TypeMask fInvType; + + bool init(const SkMatrix& inverse, const SkPaint&); + +private: + enum { + kBMStateSize = 136 // found by inspection. if too small, we will call new/delete + }; + SkAlignedSStorage<kBMStateSize> fBMStateStorage; + SkBitmapController::State* fBMState; +}; + +struct SkBitmapProcState : public SkBitmapProcInfo { + SkBitmapProcState(const SkBitmapProvider& prov, SkShader::TileMode tmx, SkShader::TileMode tmy) + : SkBitmapProcInfo(prov, tmx, tmy) {} + SkBitmapProcState(const SkBitmap& bitmap, SkShader::TileMode tmx, SkShader::TileMode tmy) + : SkBitmapProcInfo(bitmap, tmx, tmy) {} + + bool setup(const SkMatrix& inv, const SkPaint& paint) { + return this->init(inv, paint) && this->chooseProcs(); + } typedef void (*ShaderProc32)(const void* ctx, int x, int y, SkPMColor[], int count); @@ -50,11 +80,7 @@ struct SkBitmapProcState { typedef U16CPU (*FixedTileLowBitsProc)(SkFixed, int); // returns 0..0xF typedef U16CPU (*IntTileProc)(int value, int count); // returns 0..count-1 - SkPixmap fPixmap; - SkMatrix fInvMatrix; // copy of what is in fBMState, can we remove the dup? - SkMatrix::MapXYProc fInvProc; // chooseProcs - SkFractionalInt fInvSxFractionalInt; SkFractionalInt fInvKyFractionalInt; @@ -66,14 +92,10 @@ struct SkBitmapProcState { SkFixed fFilterOneX; SkFixed fFilterOneY; - SkPMColor fPaintPMColor; // chooseProcs - A8 config SkFixed fInvSx; // chooseProcs SkFixed fInvKy; // chooseProcs + SkPMColor fPaintPMColor; // chooseProcs - A8 config uint16_t fAlphaScale; // chooseProcs - uint8_t fInvType; // chooseProcs - uint8_t fTileModeX; // CONSTRUCTOR - uint8_t fTileModeY; // CONSTRUCTOR - uint8_t fFilterLevel; // chooseProcs /** Platforms implement this, and can optionally overwrite only the following fields: @@ -114,26 +136,15 @@ struct SkBitmapProcState { SampleProc32 getSampleProc32() const { return fSampleProc32; } private: - friend class SkBitmapProcShader; - friend class SkLightingShaderImpl; - ShaderProc32 fShaderProc32; // chooseProcs ShaderProc16 fShaderProc16; // chooseProcs // These are used if the shaderproc is nullptr MatrixProc fMatrixProc; // chooseProcs SampleProc32 fSampleProc32; // chooseProcs - const SkBitmapProvider fProvider; - - enum { - kBMStateSize = 136 // found by inspection. if too small, we will call new/delete - }; - SkAlignedSStorage<kBMStateSize> fBMStateStorage; - SkBitmapController::State* fBMState; - MatrixProc chooseMatrixProc(bool trivial_matrix); - bool chooseProcs(const SkMatrix& inv, const SkPaint&); - bool chooseScanlineProcs(bool trivialMatrix, bool clampClamp, const SkPaint& paint); + bool chooseProcs(); // caller must have called init() first (on our base-class) + bool chooseScanlineProcs(bool trivialMatrix, bool clampClamp); ShaderProc32 chooseShaderProc32(); // Return false if we failed to setup for fast translate (e.g. overflow) @@ -199,7 +210,7 @@ public: SkIntToScalar(y) + SK_ScalarHalf, &pt); SkFixed biasX, biasY; - if (s.fFilterLevel == kNone_SkFilterQuality) { + if (s.fFilterQuality == kNone_SkFilterQuality) { // SkFixed epsilon bias to ensure inverse-mapped bitmap coordinates are rounded // consistently WRT geometry. Note that we only need the bias for positive scales: // for negative scales, the rounding is intrinsically correct. |