Index: skia/tile_patch.diff |
diff --git a/skia/tile_patch.diff b/skia/tile_patch.diff |
deleted file mode 100644 |
index 78118416b47fde433059c067ac1d3280d0365d7f..0000000000000000000000000000000000000000 |
--- a/skia/tile_patch.diff |
+++ /dev/null |
@@ -1,284 +0,0 @@ |
-Index: sgl/SkBitmapProcState.h |
-=================================================================== |
---- sgl/SkBitmapProcState.h (revision 42716) |
-+++ sgl/SkBitmapProcState.h (working copy) |
-@@ -39,8 +39,9 @@ |
- int count, |
- uint16_t colors[]); |
- |
-- typedef U16CPU (*FixedTileProc)(SkFixed); // returns 0..0xFFFF |
-- |
-+ typedef SkFixed (*FixedTileProc)(SkFixed, int); |
-+ typedef int (*IntTileProc)(int, int); |
-+ |
- MatrixProc fMatrixProc; // chooseProcs |
- SampleProc32 fSampleProc32; // chooseProcs |
- SampleProc16 fSampleProc16; // chooseProcs |
-@@ -48,6 +49,8 @@ |
- SkMatrix fUnitInvMatrix; // chooseProcs |
- FixedTileProc fTileProcX; // chooseProcs |
- FixedTileProc fTileProcY; // chooseProcs |
-+ IntTileProc iTileProcX; // chooseProcs |
-+ IntTileProc iTileProcY; // chooseProcs |
- SkFixed fFilterOneX; |
- SkFixed fFilterOneY; |
- |
-Index: sgl/SkBitmapProcState.cpp |
-=================================================================== |
---- sgl/SkBitmapProcState.cpp (revision 42716) |
-+++ sgl/SkBitmapProcState.cpp (working copy) |
-@@ -296,8 +296,9 @@ |
- } |
- const SkMatrix* m; |
- |
-- if (SkShader::kClamp_TileMode == fTileModeX && |
-- SkShader::kClamp_TileMode == fTileModeY) { |
-+ if (inv.getType() <= SkMatrix::kTranslate_Mask || |
-+ (SkShader::kClamp_TileMode == fTileModeX && |
-+ SkShader::kClamp_TileMode == fTileModeY)) { |
- m = &inv; |
- } else { |
- fUnitInvMatrix = inv; |
-@@ -330,6 +331,16 @@ |
- fInvMatrix = m; |
- fInvProc = m->getMapXYProc(); |
- fInvType = m->getType(); |
-+ if (fInvType <= SkMatrix::kTranslate_Mask && |
-+ inv.getType() > SkMatrix::kTranslate_Mask) { |
-+ SkASSERT(inv.getType() <= |
-+ (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)); |
-+ // It is possible that by the calculation of fUnitInvMatrix, we have |
-+ // eliminated the scale transformation of the matrix (e.g., if inv^(-1) |
-+ // scales fOrigBitmap into an 1X1 rect). We add the scale flag back so |
-+ // that we don't make wrong choice in chooseMatrixProc(). |
-+ fInvType |= SkMatrix::kScale_Mask; |
-+ } |
- fInvSx = SkScalarToFixed(m->getScaleX()); |
- fInvSy = SkScalarToFixed(m->getScaleY()); |
- fInvKy = SkScalarToFixed(m->getSkewY()); |
-Index: sgl/SkBitmapProcState_matrix.h |
-=================================================================== |
---- sgl/SkBitmapProcState_matrix.h (revision 42716) |
-+++ sgl/SkBitmapProcState_matrix.h (working copy) |
-@@ -1,4 +1,5 @@ |
- |
-+#define TRANSLATE_NOFILTER_NAME MAKENAME(_nofilter_translate) |
- #define SCALE_NOFILTER_NAME MAKENAME(_nofilter_scale) |
- #define SCALE_FILTER_NAME MAKENAME(_filter_scale) |
- #define AFFINE_NOFILTER_NAME MAKENAME(_nofilter_affine) |
-@@ -17,6 +18,38 @@ |
- #define PREAMBLE_ARG_Y |
- #endif |
- |
-+#ifndef PREAMBLE_TRANS |
-+ #define PREAMBLE_TRANS(state) |
-+#endif |
-+ |
-+static void TRANSLATE_NOFILTER_NAME(const SkBitmapProcState& s, |
-+ uint32_t xy[], int count, int x, int y) |
-+{ |
-+ SkASSERT((s.fInvType & ~SkMatrix::kTranslate_Mask) == 0); |
-+ |
-+ PREAMBLE_TRANS(s); |
-+ |
-+ x += SkScalarFloor(s.fInvMatrix->getTranslateX()); |
-+ y += SkScalarFloor(s.fInvMatrix->getTranslateY()); |
-+ |
-+ *xy++ = (uint32_t)TILEY_TRANS(y, (s.fBitmap->height() - 1)); |
-+ |
-+ int maxX = s.fBitmap->width() - 1; |
-+ int i; |
-+ uint16_t* xx = (uint16_t*)xy; |
-+ for (i = (count >> 2); i > 0; --i) |
-+ { |
-+ *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; |
-+ *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; |
-+ *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; |
-+ *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; |
-+ } |
-+ for (i = (count & 3); i > 0; --i) |
-+ { |
-+ *xx++ = (uint16_t)TILEX_TRANS(x, maxX); x++; |
-+ } |
-+} |
-+ |
- static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s, |
- uint32_t xy[], int count, int x, int y) { |
- SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | |
-@@ -206,9 +239,9 @@ |
- unsigned maxY = s.fBitmap->height() - 1; |
- |
- do { |
-- *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneX PREAMBLE_ARG_Y); |
-+ *xy++ = PACK_FILTER_Y_NAME(fy, maxY, oneY PREAMBLE_ARG_Y); |
- fy += dy; |
-- *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneY PREAMBLE_ARG_X); |
-+ *xy++ = PACK_FILTER_X_NAME(fx, maxX, oneX PREAMBLE_ARG_X); |
- fx += dx; |
- } while (--count != 0); |
- } |
-@@ -241,6 +274,9 @@ |
- } |
- |
- static SkBitmapProcState::MatrixProc MAKENAME(_Procs)[] = { |
-+ TRANSLATE_NOFILTER_NAME, |
-+ TRANSLATE_NOFILTER_NAME, // No need to do filtering if the matrix is no |
-+ // more complex than identity/translate. |
- SCALE_NOFILTER_NAME, |
- SCALE_FILTER_NAME, |
- AFFINE_NOFILTER_NAME, |
-@@ -255,7 +291,10 @@ |
- #ifdef CHECK_FOR_DECAL |
- #undef CHECK_FOR_DECAL |
- #endif |
-- |
-+#undef TILEX_TRANS |
-+#undef TILEY_TRANS |
-+ |
-+#undef TRANSLATE_NOFILTER_NAME |
- #undef SCALE_NOFILTER_NAME |
- #undef SCALE_FILTER_NAME |
- #undef AFFINE_NOFILTER_NAME |
-@@ -268,6 +307,7 @@ |
- #undef PREAMBLE_PARAM_Y |
- #undef PREAMBLE_ARG_X |
- #undef PREAMBLE_ARG_Y |
-+#undef PREAMBLE_TRANS |
- |
- #undef TILEX_LOW_BITS |
- #undef TILEY_LOW_BITS |
-Index: sgl/SkBitmapProcState_matrixProcs.cpp |
-=================================================================== |
---- sgl/SkBitmapProcState_matrixProcs.cpp (revision 42716) |
-+++ sgl/SkBitmapProcState_matrixProcs.cpp (working copy) |
-@@ -28,6 +28,8 @@ |
- #define TILEX_LOW_BITS(fx, max) (((fx) >> 12) & 0xF) |
- #define TILEY_LOW_BITS(fy, max) (((fy) >> 12) & 0xF) |
- #define CHECK_FOR_DECAL |
-+#define TILEX_TRANS(x, max) SkClampMax(x, max) |
-+#define TILEY_TRANS(y, max) SkClampMax(y, max) |
- #include "SkBitmapProcState_matrix.h" |
- |
- #define MAKENAME(suffix) RepeatX_RepeatY ## suffix |
-@@ -35,6 +37,9 @@ |
- #define TILEY_PROCF(fy, max) (((fy) & 0xFFFF) * ((max) + 1) >> 16) |
- #define TILEX_LOW_BITS(fx, max) ((((fx) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) |
- #define TILEY_LOW_BITS(fy, max) ((((fy) & 0xFFFF) * ((max) + 1) >> 12) & 0xF) |
-+#define REAL_MOD(val, modulus) (((val)%(modulus)) + (modulus)*( (val)<0 )) |
-+#define TILEX_TRANS(x, max) (REAL_MOD((x), ((max) + 1))) |
-+#define TILEY_TRANS(y, max) (REAL_MOD((y), ((max) + 1))) |
- #include "SkBitmapProcState_matrix.h" |
- |
- #define MAKENAME(suffix) GeneralXY ## suffix |
-@@ -44,13 +49,17 @@ |
- #define PREAMBLE_PARAM_Y , SkBitmapProcState::FixedTileProc tileProcY |
- #define PREAMBLE_ARG_X , tileProcX |
- #define PREAMBLE_ARG_Y , tileProcY |
--#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_PROCF(fx, max) (tileProcX(fx, max) >> 16) |
-+#define TILEY_PROCF(fy, max) (tileProcY(fy, max) >> 16) |
-+#define TILEX_LOW_BITS(fx, max) ((tileProcX(fx, max) >> 14) & 0x3) |
-+#define TILEY_LOW_BITS(fy, max) ((tileProcY(fy, max) >> 14) & 0x3) |
-+#define PREAMBLE_TRANS(state) SkBitmapProcState::IntTileProc tileProcX = (state).iTileProcX; \ |
-+ SkBitmapProcState::IntTileProc tileProcY = (state).iTileProcY |
-+#define TILEX_TRANS(x, max) tileProcX(x, max) |
-+#define TILEY_TRANS(y, max) tileProcY(y, max) |
- #include "SkBitmapProcState_matrix.h" |
- |
--static inline U16CPU fixed_clamp(SkFixed x) |
-+static inline SkFixed fixed_clamp(SkFixed x, int max) |
- { |
- #ifdef SK_CPU_HAS_CONDITIONAL_INSTR |
- if (x >> 16) |
-@@ -66,19 +75,20 @@ |
- x = 0xFFFF; |
- } |
- #endif |
-- return x; |
-+ return x * (max + 1); |
- } |
- |
--static inline U16CPU fixed_repeat(SkFixed x) |
-+static inline SkFixed fixed_repeat(SkFixed x, int max) |
- { |
-- return x & 0xFFFF; |
-+ return (x & 0xFFFF) * (max + 1); |
- } |
- |
--static inline U16CPU fixed_mirror(SkFixed x) |
-+static inline SkFixed fixed_mirror(SkFixed x, int max) |
- { |
- SkFixed s = x << 15 >> 31; |
- // s is FFFFFFFF if we're on an odd interval, or 0 if an even interval |
-- return (x ^ s) & 0xFFFF; |
-+ x = ((x ^ s) & 0xFFFF) * (max + 1); |
-+ return s ? (x ^ 0xFFFF) : x; |
- } |
- |
- static SkBitmapProcState::FixedTileProc choose_tile_proc(unsigned m) |
-@@ -90,15 +100,52 @@ |
- SkASSERT(SkShader::kMirror_TileMode == m); |
- return fixed_mirror; |
- } |
-+ |
-+static inline int int_clamp(int x, int max) |
-+{ |
-+ SkASSERT(max >= 0); |
-+ |
-+ return SkClampMax(x, max); |
-+} |
- |
-+static inline int int_repeat(int x, int max) |
-+{ |
-+ SkASSERT(max >= 0); |
-+ |
-+ return x % (max + 1); |
-+} |
-+ |
-+static inline int int_mirror(int x, int max) |
-+{ |
-+ SkASSERT(max >= 0); |
-+ |
-+ int dx = x % (max + 1); |
-+ if (dx < 0) |
-+ dx = -dx - 1; |
-+ |
-+ return (x / (max + 1) % 2) ? max - dx : dx; |
-+} |
-+ |
-+static SkBitmapProcState::IntTileProc choose_int_tile_proc(unsigned m) |
-+{ |
-+ if (SkShader::kClamp_TileMode == m) |
-+ return int_clamp; |
-+ if (SkShader::kRepeat_TileMode == m) |
-+ return int_repeat; |
-+ SkASSERT(SkShader::kMirror_TileMode == m); |
-+ return int_mirror; |
-+} |
-+ |
- SkBitmapProcState::MatrixProc SkBitmapProcState::chooseMatrixProc() |
- { |
- int index = 0; |
- if (fDoFilter) |
- index = 1; |
- if (fInvType & SkMatrix::kPerspective_Mask) |
-+ index |= 6; |
-+ else if (fInvType & SkMatrix::kAffine_Mask) |
- index |= 4; |
-- else if (fInvType & SkMatrix::kAffine_Mask) |
-+ else if (fInvType & SkMatrix::kScale_Mask) |
- index |= 2; |
- |
- if (SkShader::kClamp_TileMode == fTileModeX && |
-@@ -123,6 +170,8 @@ |
- // only general needs these procs |
- fTileProcX = choose_tile_proc(fTileModeX); |
- fTileProcY = choose_tile_proc(fTileModeY); |
-+ iTileProcX = choose_int_tile_proc(fTileModeX); |
-+ iTileProcY = choose_int_tile_proc(fTileModeY); |
- return GeneralXY_Procs[index]; |
- } |
- |