diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-03-09 19:59:46 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-03-09 19:59:46 +0000 |
commit | f444e8ccda8905a8ce16bac368e09f205786db31 (patch) | |
tree | 6cb74c6a6469026568901e7ab9942c697d577202 /src/core/SkBitmapProcState_matrixProcs.cpp | |
parent | 54ff85c79d5a59ad9978a91b1aec1177e54104c5 (diff) |
don't flip the fractional bits (low 4) for bilerp when in kMirror_TileMode
Review URL: https://codereview.appspot.com/5795043
git-svn-id: http://skia.googlecode.com/svn/trunk@3357 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/core/SkBitmapProcState_matrixProcs.cpp')
-rw-r--r-- | src/core/SkBitmapProcState_matrixProcs.cpp | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/src/core/SkBitmapProcState_matrixProcs.cpp b/src/core/SkBitmapProcState_matrixProcs.cpp index bda24385c7..9a15ad2098 100644 --- a/src/core/SkBitmapProcState_matrixProcs.cpp +++ b/src/core/SkBitmapProcState_matrixProcs.cpp @@ -56,15 +56,17 @@ void decal_filter_scale(uint32_t dst[], SkFixed fx, SkFixed dx, int count); #define MAKENAME(suffix) GeneralXY ## suffix #define PREAMBLE(state) SkBitmapProcState::FixedTileProc tileProcX = (state).fTileProcX; \ - SkBitmapProcState::FixedTileProc tileProcY = (state).fTileProcY -#define PREAMBLE_PARAM_X , SkBitmapProcState::FixedTileProc tileProcX -#define PREAMBLE_PARAM_Y , SkBitmapProcState::FixedTileProc tileProcY -#define PREAMBLE_ARG_X , tileProcX -#define PREAMBLE_ARG_Y , tileProcY + SkBitmapProcState::FixedTileProc tileProcY = (state).fTileProcY; \ + SkBitmapProcState::FixedTileLowBitsProc tileLowBitsProcX = (state).fTileLowBitsProcX; \ + SkBitmapProcState::FixedTileLowBitsProc tileLowBitsProcY = (state).fTileLowBitsProcY +#define PREAMBLE_PARAM_X , SkBitmapProcState::FixedTileProc tileProcX, SkBitmapProcState::FixedTileLowBitsProc tileLowBitsProcX +#define PREAMBLE_PARAM_Y , SkBitmapProcState::FixedTileProc tileProcY, SkBitmapProcState::FixedTileLowBitsProc tileLowBitsProcY +#define PREAMBLE_ARG_X , tileProcX, tileLowBitsProcX +#define PREAMBLE_ARG_Y , tileProcY, tileLowBitsProcY #define TILEX_PROCF(fx, max) (tileProcX(fx) * ((max) + 1) >> 16) #define TILEY_PROCF(fy, max) (tileProcY(fy) * ((max) + 1) >> 16) -#define TILEX_LOW_BITS(fx, max) ((tileProcX(fx) * ((max) + 1) >> 12) & 0xF) -#define TILEY_LOW_BITS(fy, max) ((tileProcY(fy) * ((max) + 1) >> 12) & 0xF) +#define TILEX_LOW_BITS(fx, max) tileLowBitsProcX(fx, (max) + 1) +#define TILEY_LOW_BITS(fy, max) tileLowBitsProcY(fy, (max) + 1) #include "SkBitmapProcState_matrix.h" static inline U16CPU fixed_clamp(SkFixed x) @@ -108,6 +110,25 @@ static SkBitmapProcState::FixedTileProc choose_tile_proc(unsigned m) return fixed_mirror; } +static inline U16CPU fixed_clamp_lowbits(SkFixed x, int) { + return (x >> 12) & 0xF; +} + +static inline U16CPU fixed_repeat_or_mirrow_lowbits(SkFixed x, int scale) { + return ((x * scale) >> 12) & 0xF; +} + +static SkBitmapProcState::FixedTileLowBitsProc choose_tile_lowbits_proc(unsigned m) { + if (SkShader::kClamp_TileMode == m) { + return fixed_clamp_lowbits; + } else { + SkASSERT(SkShader::kMirror_TileMode == m || + SkShader::kRepeat_TileMode == m); + // mirror and repeat have the same behavior for the low bits. + return fixed_repeat_or_mirrow_lowbits; + } +} + static inline U16CPU int_clamp(int x, int n) { #ifdef SK_CPU_HAS_CONDITIONAL_INSTR if (x >= n) @@ -522,6 +543,8 @@ SkBitmapProcState::chooseMatrixProc(bool trivial_matrix) { fTileProcX = choose_tile_proc(fTileModeX); fTileProcY = choose_tile_proc(fTileModeY); + fTileLowBitsProcX = choose_tile_lowbits_proc(fTileModeX); + fTileLowBitsProcY = choose_tile_lowbits_proc(fTileModeY); return GeneralXY_Procs[index]; } |