aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBitmapProcState_matrixProcs.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-03-09 19:59:46 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-03-09 19:59:46 +0000
commitf444e8ccda8905a8ce16bac368e09f205786db31 (patch)
tree6cb74c6a6469026568901e7ab9942c697d577202 /src/core/SkBitmapProcState_matrixProcs.cpp
parent54ff85c79d5a59ad9978a91b1aec1177e54104c5 (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.cpp37
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];
}