diff options
author | 2013-07-12 21:14:33 +0000 | |
---|---|---|
committer | 2013-07-12 21:14:33 +0000 | |
commit | d64d8a905a044204c5960e29cdf8adf1f130edce (patch) | |
tree | 22523a4bb1944558f181e0db29dd3a360cc1fc6b /src/opts | |
parent | 5383a7525355dec72efa2083aeadffdd09a962b9 (diff) |
Working plumb of image scaling:
1) always generate mipmaps if we detect that we are downsampling.
2) pre-scale the image if we detect that we are upsampling
(currently valid for scale+translate only)
3) A few miscellaneous bug fixes related to image scaling.
Still need SSE/Neon versions of these image scalers.
BUG=
R=bsalomon@google.com, robertphillips@google.com
Review URL: https://codereview.chromium.org/18978014
git-svn-id: http://skia.googlecode.com/svn/trunk@10056 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/opts')
-rw-r--r-- | src/opts/SkBitmapFilter_opts_SSE2.cpp | 14 | ||||
-rw-r--r-- | src/opts/SkBitmapProcState_matrix_clamp_neon.h | 16 | ||||
-rw-r--r-- | src/opts/SkBitmapProcState_matrix_repeat_neon.h | 16 | ||||
-rw-r--r-- | src/opts/SkBitmapProcState_opts_SSE2.cpp | 18 | ||||
-rw-r--r-- | src/opts/SkBitmapProcState_opts_SSSE3.cpp | 4 | ||||
-rw-r--r-- | src/opts/SkBitmapProcState_opts_arm.cpp | 7 |
6 files changed, 37 insertions, 38 deletions
diff --git a/src/opts/SkBitmapFilter_opts_SSE2.cpp b/src/opts/SkBitmapFilter_opts_SSE2.cpp index 685ec77f49..f992bcb636 100644 --- a/src/opts/SkBitmapFilter_opts_SSE2.cpp +++ b/src/opts/SkBitmapFilter_opts_SSE2.cpp @@ -55,7 +55,7 @@ void highQualityFilter_SSE2(const SkBitmapProcState& s, int x, int y, while (count-- > 0) { SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x), + s.fInvProc(s.fInvMatrix, SkIntToScalar(x), SkIntToScalar(y), &srcPt); srcPt.fX -= SK_ScalarHalf; srcPt.fY -= SK_ScalarHalf; @@ -72,10 +72,10 @@ void highQualityFilter_SSE2(const SkBitmapProcState& s, int x, int y, int x1 = SkTMin(maxX, int(floor(sx+s.getBitmapFilter()->width() + 0.5f))); for (int src_y = y0; src_y <= y1; src_y++) { - float yweight = s.getBitmapFilter()->lookupFloat( (srcPt.fY - src_y) ); + float yweight = SkScalarToFloat(s.getBitmapFilter()->lookupScalar(srcPt.fY - src_y)); for (int src_x = x0; src_x <= x1 ; src_x++) { - float xweight = s.getBitmapFilter()->lookupFloat( (srcPt.fX - src_x) ); + float xweight = SkScalarToFloat(s.getBitmapFilter()->lookupScalar(srcPt.fX - src_x)); float combined_weight = xweight * yweight; @@ -118,7 +118,7 @@ void highQualityFilter_ScaleOnly_SSE2(const SkBitmapProcState &s, int x, int y, const int maxY = s.fBitmap->height() - 1; SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x), + s.fInvProc(s.fInvMatrix, SkIntToScalar(x), SkIntToScalar(y), &srcPt); srcPt.fY -= SK_ScalarHalf; int sy = SkScalarFloorToInt(srcPt.fY); @@ -139,10 +139,10 @@ void highQualityFilter_ScaleOnly_SSE2(const SkBitmapProcState &s, int x, int y, int x1 = SkTMin(maxX, int(floor(sx+s.getBitmapFilter()->width() + 0.5f))); for (int src_y = y0; src_y <= y1; src_y++) { - float yweight = s.getBitmapFilter()->lookupFloat( (srcPt.fY - src_y) ); + float yweight = SkScalarToFloat(s.getBitmapFilter()->lookupScalar(srcPt.fY - src_y)); for (int src_x = x0; src_x <= x1 ; src_x++) { - float xweight = s.getBitmapFilter()->lookupFloat( (srcPt.fX - src_x) ); + float xweight = SkScalarToFloat(s.getBitmapFilter()->lookupScalar(srcPt.fX - src_x)); float combined_weight = xweight * yweight; @@ -175,7 +175,7 @@ void highQualityFilter_ScaleOnly_SSE2(const SkBitmapProcState &s, int x, int y, x++; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x), + s.fInvProc(s.fInvMatrix, SkIntToScalar(x), SkIntToScalar(y), &srcPt); } diff --git a/src/opts/SkBitmapProcState_matrix_clamp_neon.h b/src/opts/SkBitmapProcState_matrix_clamp_neon.h index 5af7a52ca4..23da5472f1 100644 --- a/src/opts/SkBitmapProcState_matrix_clamp_neon.h +++ b/src/opts/SkBitmapProcState_matrix_clamp_neon.h @@ -67,8 +67,8 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s, SkFixed fx; { SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); fx = SkScalarToFixed(pt.fY); const unsigned maxY = s.fBitmap->height() - 1; *xy++ = TILEY_PROCF(fx, maxY); @@ -169,7 +169,7 @@ static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, PREAMBLE(s); SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -282,7 +282,7 @@ static void PERSP_NOFILTER_NAME(const SkBitmapProcState& s, int maxX = s.fBitmap->width() - 1; int maxY = s.fBitmap->height() - 1; - SkPerspIter iter(*s.fInvMatrix, + SkPerspIter iter(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, count); @@ -492,8 +492,8 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s, { SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); const unsigned maxY = s.fBitmap->height() - 1; // compute our two Y values up front @@ -596,7 +596,7 @@ static void AFFINE_FILTER_NAME(const SkBitmapProcState& s, PREAMBLE(s); SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -757,7 +757,7 @@ static void PERSP_FILTER_NAME(const SkBitmapProcState& s, SkFixed oneX = s.fFilterOneX; SkFixed oneY = s.fFilterOneY; - SkPerspIter iter(*s.fInvMatrix, + SkPerspIter iter(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, count); diff --git a/src/opts/SkBitmapProcState_matrix_repeat_neon.h b/src/opts/SkBitmapProcState_matrix_repeat_neon.h index f57d20d35c..55e2997a5e 100644 --- a/src/opts/SkBitmapProcState_matrix_repeat_neon.h +++ b/src/opts/SkBitmapProcState_matrix_repeat_neon.h @@ -65,8 +65,8 @@ static void SCALE_NOFILTER_NAME(const SkBitmapProcState& s, SkFixed fx; { SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); fx = SkScalarToFixed(pt.fY); const unsigned maxY = s.fBitmap->height() - 1; *xy++ = TILEY_PROCF(fx, maxY); @@ -167,7 +167,7 @@ static void AFFINE_NOFILTER_NAME(const SkBitmapProcState& s, PREAMBLE(s); SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -284,7 +284,7 @@ static void PERSP_NOFILTER_NAME(const SkBitmapProcState& s, int maxX = s.fBitmap->width() - 1; int maxY = s.fBitmap->height() - 1; - SkPerspIter iter(*s.fInvMatrix, + SkPerspIter iter(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, count); @@ -422,8 +422,8 @@ static void SCALE_FILTER_NAME(const SkBitmapProcState& s, { SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); const unsigned maxY = s.fBitmap->height() - 1; // compute our two Y values up front @@ -457,7 +457,7 @@ static void AFFINE_FILTER_NAME(const SkBitmapProcState& s, PREAMBLE(s); SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -493,7 +493,7 @@ static void PERSP_FILTER_NAME(const SkBitmapProcState& s, - SkPerspIter iter(*s.fInvMatrix, + SkPerspIter iter(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, count); diff --git a/src/opts/SkBitmapProcState_opts_SSE2.cpp b/src/opts/SkBitmapProcState_opts_SSE2.cpp index 4bba8c3298..0c84d00d1e 100644 --- a/src/opts/SkBitmapProcState_opts_SSE2.cpp +++ b/src/opts/SkBitmapProcState_opts_SSE2.cpp @@ -15,7 +15,7 @@ void S32_opaque_D32_filter_DX_SSE2(const SkBitmapProcState& s, const uint32_t* xy, int count, uint32_t* colors) { SkASSERT(count > 0 && colors != NULL); - SkASSERT(s.fDoFilter); + SkASSERT(s.fFilterQuality != SkBitmapProcState::kNone_BitmapFilter); SkASSERT(s.fBitmap->config() == SkBitmap::kARGB_8888_Config); SkASSERT(s.fAlphaScale == 256); @@ -121,7 +121,7 @@ void S32_alpha_D32_filter_DX_SSE2(const SkBitmapProcState& s, const uint32_t* xy, int count, uint32_t* colors) { SkASSERT(count > 0 && colors != NULL); - SkASSERT(s.fDoFilter); + SkASSERT(s.fFilterQuality != SkBitmapProcState::kNone_BitmapFilter); SkASSERT(s.fBitmap->config() == SkBitmap::kARGB_8888_Config); SkASSERT(s.fAlphaScale < 256); @@ -255,8 +255,8 @@ void ClampX_ClampY_filter_scale_SSE2(const SkBitmapProcState& s, uint32_t xy[], SkFixed fx; SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); const SkFixed fy = SkScalarToFixed(pt.fY) - (s.fFilterOneY >> 1); const unsigned maxY = s.fBitmap->height() - 1; // compute our two Y values up front @@ -376,8 +376,8 @@ void ClampX_ClampY_nofilter_scale_SSE2(const SkBitmapProcState& s, const unsigned maxX = s.fBitmap->width() - 1; SkFixed fx; SkPoint pt; - s.fInvProc(*s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, - SkIntToScalar(y) + SK_ScalarHalf, &pt); + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, + SkIntToScalar(y) + SK_ScalarHalf, &pt); fx = SkScalarToFixed(pt.fY); const unsigned maxY = s.fBitmap->height() - 1; *xy++ = SkClampMax(fx >> 16, maxY); @@ -490,7 +490,7 @@ void ClampX_ClampY_nofilter_scale_SSE2(const SkBitmapProcState& s, void ClampX_ClampY_filter_affine_SSE2(const SkBitmapProcState& s, uint32_t xy[], int count, int x, int y) { SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -566,7 +566,7 @@ void ClampX_ClampY_nofilter_affine_SSE2(const SkBitmapProcState& s, SkMatrix::kAffine_Mask)) == 0); SkPoint srcPt; - s.fInvProc(*s.fInvMatrix, + s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, &srcPt); @@ -641,7 +641,7 @@ void S32_D16_filter_DX_SSE2(const SkBitmapProcState& s, const uint32_t* xy, int count, uint16_t* colors) { SkASSERT(count > 0 && colors != NULL); - SkASSERT(s.fDoFilter); + SkASSERT(s.fFilterQuality != SkBitmapProcState::kNone_BitmapFilter); SkASSERT(s.fBitmap->config() == SkBitmap::kARGB_8888_Config); SkASSERT(s.fBitmap->isOpaque()); diff --git a/src/opts/SkBitmapProcState_opts_SSSE3.cpp b/src/opts/SkBitmapProcState_opts_SSSE3.cpp index 1246b953f4..f18b7e1eb1 100644 --- a/src/opts/SkBitmapProcState_opts_SSSE3.cpp +++ b/src/opts/SkBitmapProcState_opts_SSSE3.cpp @@ -385,7 +385,7 @@ void S32_generic_D32_filter_DX_SSSE3(const SkBitmapProcState& s, const uint32_t* xy, int count, uint32_t* colors) { SkASSERT(count > 0 && colors != NULL); - SkASSERT(s.fDoFilter); + SkASSERT(s.fFilterQuality != SkBitmapProcState::kNone_BitmapFilter); SkASSERT(s.fBitmap->config() == SkBitmap::kARGB_8888_Config); if (has_alpha) { SkASSERT(s.fAlphaScale < 256); @@ -576,7 +576,7 @@ void S32_generic_D32_filter_DXDY_SSSE3(const SkBitmapProcState& s, const uint32_t* xy, int count, uint32_t* colors) { SkASSERT(count > 0 && colors != NULL); - SkASSERT(s.fDoFilter); + SkASSERT(s.fFilterQuality != SkBitmapProcState::kNone_BitmapFilter); SkASSERT(s.fBitmap->config() == SkBitmap::kARGB_8888_Config); if (has_alpha) { SkASSERT(s.fAlphaScale < 256); diff --git a/src/opts/SkBitmapProcState_opts_arm.cpp b/src/opts/SkBitmapProcState_opts_arm.cpp index e044ad8129..99da0da24a 100644 --- a/src/opts/SkBitmapProcState_opts_arm.cpp +++ b/src/opts/SkBitmapProcState_opts_arm.cpp @@ -23,7 +23,7 @@ void SI8_D16_nofilter_DX_arm(const SkBitmapProcState& s, int count, uint16_t* SK_RESTRICT colors) { SkASSERT(count > 0 && colors != NULL); SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)); - SkASSERT(s.fDoFilter == false); + SkASSERT(SkBitmapProcState::kNone_BitmapFilter == s.fFilterQuality); const uint16_t* SK_RESTRICT table = s.fBitmap->getColorTable()->lock16BitCache(); const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels(); @@ -114,7 +114,7 @@ void SI8_opaque_D32_nofilter_DX_arm(const SkBitmapProcState& s, int count, SkPMColor* SK_RESTRICT colors) { SkASSERT(count > 0 && colors != NULL); SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)); - SkASSERT(s.fDoFilter == false); + SkASSERT(SkBitmapProcState::kNone_BitmapFilter == s.fFilterQuality); const SkPMColor* SK_RESTRICT table = s.fBitmap->getColorTable()->lockColors(); const uint8_t* SK_RESTRICT srcAddr = (const uint8_t*)s.fBitmap->getPixels(); @@ -190,7 +190,6 @@ void SI8_opaque_D32_nofilter_DX_arm(const SkBitmapProcState& s, otherwise the shader won't even look at the matrix/sampler */ void SkBitmapProcState::platformProcs() { - bool doFilter = fDoFilter; bool isOpaque = 256 == fAlphaScale; bool justDx = false; @@ -201,7 +200,7 @@ void SkBitmapProcState::platformProcs() { switch (fBitmap->config()) { case SkBitmap::kIndex8_Config: #if SK_ARM_ARCH >= 6 && !defined(SK_CPU_BENDIAN) - if (justDx && !doFilter) { + if (justDx && kNone_BitmapFilter == fFilterQuality) { #if 0 /* crashing on android device */ fSampleProc16 = SI8_D16_nofilter_DX_arm; fShaderProc16 = NULL; |