aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBitmapProcState.h
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2016-03-02 09:49:02 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-02 09:49:02 -0800
commit05a5647efed7fcbcc5bd1efa445a6a3ab445a6c3 (patch)
tree6413809dbabe4d433b978156969b0b4f3c06d83a /src/core/SkBitmapProcState.h
parent391395dcfbff09a83f8f0e9d3e02d38c855ae2e9 (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.h65
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.