Commit 11a52436 authored by fbarchard@google.com's avatar fbarchard@google.com

Coalesce rows

BUG=197
TESTED=out\release\libyuv_unittest --gtest_filter=*ARGBToI400*
Review URL: https://webrtc-codereview.appspot.com/1176004

git-svn-id: http://libyuv.googlecode.com/svn/trunk@598 16f28f9a-4ce2-e073-06de-1de4eb20be90
parent 4f4c8b54
...@@ -621,6 +621,10 @@ int ARGBToI400(const uint8* src_argb, int src_stride_argb, ...@@ -621,6 +621,10 @@ int ARGBToI400(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_y == width) {
return ARGBToI400(src_argb, 0, dst_y, 0, width * height, 1);
}
void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int pix) = void (*ARGBToYRow)(const uint8* src_argb, uint8* dst_y, int pix) =
ARGBToYRow_C; ARGBToYRow_C;
#if defined(HAS_ARGBTOYROW_SSSE3) #if defined(HAS_ARGBTOYROW_SSSE3)
...@@ -696,6 +700,10 @@ int ARGBToRGB24(const uint8* src_argb, int src_stride_argb, ...@@ -696,6 +700,10 @@ int ARGBToRGB24(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_rgb24 == width * 3 ) {
return ARGBToRGB24(src_argb, 0, dst_rgb24, 0, width * height, 1);
}
void (*ARGBToRGB24Row)(const uint8* src_argb, uint8* dst_rgb, int pix) = void (*ARGBToRGB24Row)(const uint8* src_argb, uint8* dst_rgb, int pix) =
ARGBToRGB24Row_C; ARGBToRGB24Row_C;
#if defined(HAS_ARGBTORGB24ROW_SSSE3) #if defined(HAS_ARGBTORGB24ROW_SSSE3)
...@@ -737,6 +745,10 @@ int ARGBToRAW(const uint8* src_argb, int src_stride_argb, ...@@ -737,6 +745,10 @@ int ARGBToRAW(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_raw == width * 3 ) {
return ARGBToRAW(src_argb, 0, dst_raw, 0, width * height, 1);
}
void (*ARGBToRAWRow)(const uint8* src_argb, uint8* dst_rgb, int pix) = void (*ARGBToRAWRow)(const uint8* src_argb, uint8* dst_rgb, int pix) =
ARGBToRAWRow_C; ARGBToRAWRow_C;
#if defined(HAS_ARGBTORAWROW_SSSE3) #if defined(HAS_ARGBTORAWROW_SSSE3)
...@@ -778,6 +790,10 @@ int ARGBToRGB565(const uint8* src_argb, int src_stride_argb, ...@@ -778,6 +790,10 @@ int ARGBToRGB565(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_rgb565 == width * 2 ) {
return ARGBToRGB565(src_argb, 0, dst_rgb565, 0, width * height, 1);
}
void (*ARGBToRGB565Row)(const uint8* src_argb, uint8* dst_rgb, int pix) = void (*ARGBToRGB565Row)(const uint8* src_argb, uint8* dst_rgb, int pix) =
ARGBToRGB565Row_C; ARGBToRGB565Row_C;
#if defined(HAS_ARGBTORGB565ROW_SSE2) #if defined(HAS_ARGBTORGB565ROW_SSE2)
...@@ -818,6 +834,10 @@ int ARGBToARGB1555(const uint8* src_argb, int src_stride_argb, ...@@ -818,6 +834,10 @@ int ARGBToARGB1555(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_argb1555 == width * 2 ) {
return ARGBToARGB1555(src_argb, 0, dst_argb1555, 0, width * height, 1);
}
void (*ARGBToARGB1555Row)(const uint8* src_argb, uint8* dst_rgb, int pix) = void (*ARGBToARGB1555Row)(const uint8* src_argb, uint8* dst_rgb, int pix) =
ARGBToARGB1555Row_C; ARGBToARGB1555Row_C;
#if defined(HAS_ARGBTOARGB1555ROW_SSE2) #if defined(HAS_ARGBTOARGB1555ROW_SSE2)
...@@ -858,6 +878,10 @@ int ARGBToARGB4444(const uint8* src_argb, int src_stride_argb, ...@@ -858,6 +878,10 @@ int ARGBToARGB4444(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 && dst_stride_argb4444 == width * 2 ) {
return ARGBToARGB4444(src_argb, 0, dst_argb4444, 0, width * height, 1);
}
void (*ARGBToARGB4444Row)(const uint8* src_argb, uint8* dst_rgb, int pix) = void (*ARGBToARGB4444Row)(const uint8* src_argb, uint8* dst_rgb, int pix) =
ARGBToARGB4444Row_C; ARGBToARGB4444Row_C;
#if defined(HAS_ARGBTOARGB4444ROW_SSE2) #if defined(HAS_ARGBTOARGB4444ROW_SSE2)
......
...@@ -33,7 +33,6 @@ void CopyPlane(const uint8* src_y, int src_stride_y, ...@@ -33,7 +33,6 @@ void CopyPlane(const uint8* src_y, int src_stride_y,
CopyPlane(src_y, 0, dst_y, 0, width * height, 1); CopyPlane(src_y, 0, dst_y, 0, width * height, 1);
return; return;
} }
void (*CopyRow)(const uint8* src, uint8* dst, int width) = CopyRow_C; void (*CopyRow)(const uint8* src, uint8* dst, int width) = CopyRow_C;
#if defined(HAS_COPYROW_X86) #if defined(HAS_COPYROW_X86)
if (TestCpuFlag(kCpuHasX86) && IS_ALIGNED(width, 4)) { if (TestCpuFlag(kCpuHasX86) && IS_ALIGNED(width, 4)) {
...@@ -96,7 +95,6 @@ int I422Copy(const uint8* src_y, int src_stride_y, ...@@ -96,7 +95,6 @@ int I422Copy(const uint8* src_y, int src_stride_y,
src_stride_u = -src_stride_u; src_stride_u = -src_stride_u;
src_stride_v = -src_stride_v; src_stride_v = -src_stride_v;
} }
int halfwidth = (width + 1) >> 1; int halfwidth = (width + 1) >> 1;
CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, width, height); CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, width, height);
CopyPlane(src_u, src_stride_u, dst_u, dst_stride_u, halfwidth, height); CopyPlane(src_u, src_stride_u, dst_u, dst_stride_u, halfwidth, height);
...@@ -229,6 +227,15 @@ int YUY2ToI422(const uint8* src_yuy2, int src_stride_yuy2, ...@@ -229,6 +227,15 @@ int YUY2ToI422(const uint8* src_yuy2, int src_stride_yuy2,
src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2; src_yuy2 = src_yuy2 + (height - 1) * src_stride_yuy2;
src_stride_yuy2 = -src_stride_yuy2; src_stride_yuy2 = -src_stride_yuy2;
} }
// Coalesce contiguous rows.
if (IS_ALIGNED(width, 2) &&
src_stride_yuy2 == width * 2 &&
dst_stride_y == width &&
dst_stride_u == (width + 1) / 2 &&
dst_stride_v == (width + 1) / 2) {
return YUY2ToI422(src_yuy2, 0, dst_y, 0, dst_u, 0, dst_v, 0,
width * height, 1);
}
void (*YUY2ToUV422Row)(const uint8* src_yuy2, void (*YUY2ToUV422Row)(const uint8* src_yuy2,
uint8* dst_u, uint8* dst_v, int pix); uint8* dst_u, uint8* dst_v, int pix);
void (*YUY2ToYRow)(const uint8* src_yuy2, void (*YUY2ToYRow)(const uint8* src_yuy2,
...@@ -306,6 +313,15 @@ int UYVYToI422(const uint8* src_uyvy, int src_stride_uyvy, ...@@ -306,6 +313,15 @@ int UYVYToI422(const uint8* src_uyvy, int src_stride_uyvy,
src_uyvy = src_uyvy + (height - 1) * src_stride_uyvy; src_uyvy = src_uyvy + (height - 1) * src_stride_uyvy;
src_stride_uyvy = -src_stride_uyvy; src_stride_uyvy = -src_stride_uyvy;
} }
// Coalesce contiguous rows.
if (IS_ALIGNED(width, 2) &&
src_stride_uyvy == width * 2 &&
dst_stride_y == width &&
dst_stride_u == (width + 1) / 2 &&
dst_stride_v == (width + 1) / 2) {
return UYVYToI422(src_uyvy, 0, dst_y, 0, dst_u, 0, dst_v, 0,
width * height, 1);
}
void (*UYVYToUV422Row)(const uint8* src_uyvy, void (*UYVYToUV422Row)(const uint8* src_uyvy,
uint8* dst_u, uint8* dst_v, int pix); uint8* dst_u, uint8* dst_v, int pix);
void (*UYVYToYRow)(const uint8* src_uyvy, void (*UYVYToYRow)(const uint8* src_uyvy,
...@@ -518,6 +534,15 @@ int ARGBBlend(const uint8* src_argb0, int src_stride_argb0, ...@@ -518,6 +534,15 @@ int ARGBBlend(const uint8* src_argb0, int src_stride_argb0,
dst_argb = dst_argb + (height - 1) * dst_stride_argb; dst_argb = dst_argb + (height - 1) * dst_stride_argb;
dst_stride_argb = -dst_stride_argb; dst_stride_argb = -dst_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb0 == width * 4 &&
src_stride_argb1 == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBBlend(src_argb0, 0,
src_argb1, 0,
dst_argb, 0,
width * height, 1);
}
void (*ARGBBlendRow)(const uint8* src_argb, const uint8* src_argb1, void (*ARGBBlendRow)(const uint8* src_argb, const uint8* src_argb1,
uint8* dst_argb, int width) = GetARGBBlend(); uint8* dst_argb, int width) = GetARGBBlend();
...@@ -767,6 +792,18 @@ int I422ToBGRA(const uint8* src_y, int src_stride_y, ...@@ -767,6 +792,18 @@ int I422ToBGRA(const uint8* src_y, int src_stride_y,
dst_bgra = dst_bgra + (height - 1) * dst_stride_bgra; dst_bgra = dst_bgra + (height - 1) * dst_stride_bgra;
dst_stride_bgra = -dst_stride_bgra; dst_stride_bgra = -dst_stride_bgra;
} }
// Coalesce contiguous rows.
if (IS_ALIGNED(width, 2) &&
src_stride_y == width &&
src_stride_u == (width + 1) / 2 &&
src_stride_v == (width + 1) / 2 &&
dst_stride_bgra == width * 4) {
return I422ToBGRA(src_y, 0,
src_u, 0,
src_v, 0,
dst_bgra, 0,
width * height, 1);
}
void (*I422ToBGRARow)(const uint8* y_buf, void (*I422ToBGRARow)(const uint8* y_buf,
const uint8* u_buf, const uint8* u_buf,
const uint8* v_buf, const uint8* v_buf,
...@@ -827,6 +864,18 @@ int I422ToABGR(const uint8* src_y, int src_stride_y, ...@@ -827,6 +864,18 @@ int I422ToABGR(const uint8* src_y, int src_stride_y,
dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr; dst_abgr = dst_abgr + (height - 1) * dst_stride_abgr;
dst_stride_abgr = -dst_stride_abgr; dst_stride_abgr = -dst_stride_abgr;
} }
// Coalesce contiguous rows.
if (IS_ALIGNED(width, 2) &&
src_stride_y == width &&
src_stride_u == (width + 1) / 2 &&
src_stride_v == (width + 1) / 2 &&
dst_stride_abgr == width * 4) {
return I422ToABGR(src_y, 0,
src_u, 0,
src_v, 0,
dst_abgr, 0,
width * height, 1);
}
void (*I422ToABGRRow)(const uint8* y_buf, void (*I422ToABGRRow)(const uint8* y_buf,
const uint8* u_buf, const uint8* u_buf,
const uint8* v_buf, const uint8* v_buf,
...@@ -879,6 +928,18 @@ int I422ToRGBA(const uint8* src_y, int src_stride_y, ...@@ -879,6 +928,18 @@ int I422ToRGBA(const uint8* src_y, int src_stride_y,
dst_rgba = dst_rgba + (height - 1) * dst_stride_rgba; dst_rgba = dst_rgba + (height - 1) * dst_stride_rgba;
dst_stride_rgba = -dst_stride_rgba; dst_stride_rgba = -dst_stride_rgba;
} }
// Coalesce contiguous rows.
if (IS_ALIGNED(width, 2) &&
src_stride_y == width &&
src_stride_u == (width + 1) / 2 &&
src_stride_v == (width + 1) / 2 &&
dst_stride_rgba == width * 4) {
return I422ToRGBA(src_y, 0,
src_u, 0,
src_v, 0,
dst_rgba, 0,
width * height, 1);
}
void (*I422ToRGBARow)(const uint8* y_buf, void (*I422ToRGBARow)(const uint8* y_buf,
const uint8* u_buf, const uint8* u_buf,
const uint8* v_buf, const uint8* v_buf,
...@@ -1011,6 +1072,11 @@ LIBYUV_API ...@@ -1011,6 +1072,11 @@ LIBYUV_API
void SetPlane(uint8* dst_y, int dst_stride_y, void SetPlane(uint8* dst_y, int dst_stride_y,
int width, int height, int width, int height,
uint32 value) { uint32 value) {
// Coalesce contiguous rows.
if (dst_stride_y == width) {
SetPlane(dst_y, 0, width * height, 1, value);
return;
}
void (*SetRow)(uint8* dst, uint32 value, int pix) = SetRow_C; void (*SetRow)(uint8* dst, uint32 value, int pix) = SetRow_C;
#if defined(HAS_SETROW_NEON) #if defined(HAS_SETROW_NEON)
if (TestCpuFlag(kCpuHasNEON) && if (TestCpuFlag(kCpuHasNEON) &&
...@@ -1072,6 +1138,12 @@ int ARGBRect(uint8* dst_argb, int dst_stride_argb, ...@@ -1072,6 +1138,12 @@ int ARGBRect(uint8* dst_argb, int dst_stride_argb,
dst_x < 0 || dst_y < 0) { dst_x < 0 || dst_y < 0) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBRect(dst_argb, dst_stride_argb,
dst_x, dst_y,
width * height, 1, value);
}
uint8* dst = dst_argb + dst_y * dst_stride_argb + dst_x * 4; uint8* dst = dst_argb + dst_y * dst_stride_argb + dst_x * 4;
#if defined(HAS_SETROW_NEON) #if defined(HAS_SETROW_NEON)
if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(width, 16) && if (TestCpuFlag(kCpuHasNEON) && IS_ALIGNED(width, 16) &&
...@@ -1115,6 +1187,13 @@ int ARGBAttenuate(const uint8* src_argb, int src_stride_argb, ...@@ -1115,6 +1187,13 @@ int ARGBAttenuate(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBAttenuate(src_argb, 0,
dst_argb, 0,
width * height, 1);
}
void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb, void (*ARGBAttenuateRow)(const uint8* src_argb, uint8* dst_argb,
int width) = ARGBAttenuateRow_C; int width) = ARGBAttenuateRow_C;
#if defined(HAS_ARGBATTENUATEROW_SSE2) #if defined(HAS_ARGBATTENUATEROW_SSE2)
...@@ -1184,6 +1263,13 @@ int ARGBUnattenuate(const uint8* src_argb, int src_stride_argb, ...@@ -1184,6 +1263,13 @@ int ARGBUnattenuate(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBUnattenuate(src_argb, 0,
dst_argb, 0,
width * height, 1);
}
void (*ARGBUnattenuateRow)(const uint8* src_argb, uint8* dst_argb, void (*ARGBUnattenuateRow)(const uint8* src_argb, uint8* dst_argb,
int width) = ARGBUnattenuateRow_C; int width) = ARGBUnattenuateRow_C;
#if defined(HAS_ARGBUNATTENUATEROW_SSE2) #if defined(HAS_ARGBUNATTENUATEROW_SSE2)
...@@ -1236,6 +1322,13 @@ int ARGBGrayTo(const uint8* src_argb, int src_stride_argb, ...@@ -1236,6 +1322,13 @@ int ARGBGrayTo(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBGrayTo(src_argb, 0,
dst_argb, 0,
width * height, 1);
}
void (*ARGBGrayRow)(const uint8* src_argb, uint8* dst_argb, void (*ARGBGrayRow)(const uint8* src_argb, uint8* dst_argb,
int width) = ARGBGrayRow_C; int width) = ARGBGrayRow_C;
#if defined(HAS_ARGBGRAYROW_SSSE3) #if defined(HAS_ARGBGRAYROW_SSSE3)
...@@ -1266,6 +1359,12 @@ int ARGBGray(uint8* dst_argb, int dst_stride_argb, ...@@ -1266,6 +1359,12 @@ int ARGBGray(uint8* dst_argb, int dst_stride_argb,
if (!dst_argb || width <= 0 || height <= 0 || dst_x < 0 || dst_y < 0) { if (!dst_argb || width <= 0 || height <= 0 || dst_x < 0 || dst_y < 0) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBGray(dst_argb, dst_stride_argb,
dst_x, dst_y,
width * height, 1);
}
void (*ARGBGrayRow)(const uint8* src_argb, uint8* dst_argb, void (*ARGBGrayRow)(const uint8* src_argb, uint8* dst_argb,
int width) = ARGBGrayRow_C; int width) = ARGBGrayRow_C;
#if defined(HAS_ARGBGRAYROW_SSSE3) #if defined(HAS_ARGBGRAYROW_SSSE3)
...@@ -1293,6 +1392,12 @@ int ARGBSepia(uint8* dst_argb, int dst_stride_argb, ...@@ -1293,6 +1392,12 @@ int ARGBSepia(uint8* dst_argb, int dst_stride_argb,
if (!dst_argb || width <= 0 || height <= 0 || dst_x < 0 || dst_y < 0) { if (!dst_argb || width <= 0 || height <= 0 || dst_x < 0 || dst_y < 0) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBSepia(dst_argb, dst_stride_argb,
dst_x, dst_y,
width * height, 1);
}
void (*ARGBSepiaRow)(uint8* dst_argb, int width) = ARGBSepiaRow_C; void (*ARGBSepiaRow)(uint8* dst_argb, int width) = ARGBSepiaRow_C;
#if defined(HAS_ARGBSEPIAROW_SSSE3) #if defined(HAS_ARGBSEPIAROW_SSSE3)
if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 8) && if (TestCpuFlag(kCpuHasSSSE3) && IS_ALIGNED(width, 8) &&
...@@ -1321,6 +1426,13 @@ int ARGBColorMatrix(uint8* dst_argb, int dst_stride_argb, ...@@ -1321,6 +1426,13 @@ int ARGBColorMatrix(uint8* dst_argb, int dst_stride_argb,
dst_x < 0 || dst_y < 0) { dst_x < 0 || dst_y < 0) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBColorMatrix(dst_argb, dst_stride_argb,
matrix_argb,
dst_x, dst_y,
width * height, 1);
}
void (*ARGBColorMatrixRow)(uint8* dst_argb, const int8* matrix_argb, void (*ARGBColorMatrixRow)(uint8* dst_argb, const int8* matrix_argb,
int width) = ARGBColorMatrixRow_C; int width) = ARGBColorMatrixRow_C;
#if defined(HAS_ARGBCOLORMATRIXROW_SSSE3) #if defined(HAS_ARGBCOLORMATRIXROW_SSSE3)
...@@ -1351,6 +1463,13 @@ int ARGBColorTable(uint8* dst_argb, int dst_stride_argb, ...@@ -1351,6 +1463,13 @@ int ARGBColorTable(uint8* dst_argb, int dst_stride_argb,
dst_x < 0 || dst_y < 0) { dst_x < 0 || dst_y < 0) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBColorTable(dst_argb, dst_stride_argb,
table_argb,
dst_x, dst_y,
width * height, 1);
}
void (*ARGBColorTableRow)(uint8* dst_argb, const uint8* table_argb, void (*ARGBColorTableRow)(uint8* dst_argb, const uint8* table_argb,
int width) = ARGBColorTableRow_C; int width) = ARGBColorTableRow_C;
#if defined(HAS_ARGBCOLORTABLEROW_X86) #if defined(HAS_ARGBCOLORTABLEROW_X86)
...@@ -1383,6 +1502,13 @@ int ARGBQuantize(uint8* dst_argb, int dst_stride_argb, ...@@ -1383,6 +1502,13 @@ int ARGBQuantize(uint8* dst_argb, int dst_stride_argb,
interval_size < 1 || interval_size > 255) { interval_size < 1 || interval_size > 255) {
return -1; return -1;
} }
// Coalesce contiguous rows.
if (dst_stride_argb == width * 4) {
return ARGBQuantize(dst_argb, dst_stride_argb,
scale, interval_size, interval_offset,
dst_x, dst_y,
width * height, 1);
}
void (*ARGBQuantizeRow)(uint8* dst_argb, int scale, int interval_size, void (*ARGBQuantizeRow)(uint8* dst_argb, int scale, int interval_size,
int interval_offset, int width) = ARGBQuantizeRow_C; int interval_offset, int width) = ARGBQuantizeRow_C;
#if defined(HAS_ARGBQUANTIZEROW_SSE2) #if defined(HAS_ARGBQUANTIZEROW_SSE2)
...@@ -1531,6 +1657,14 @@ int ARGBShade(const uint8* src_argb, int src_stride_argb, ...@@ -1531,6 +1657,14 @@ int ARGBShade(const uint8* src_argb, int src_stride_argb,
src_argb = src_argb + (height - 1) * src_stride_argb; src_argb = src_argb + (height - 1) * src_stride_argb;
src_stride_argb = -src_stride_argb; src_stride_argb = -src_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBShade(src_argb, 0,
dst_argb, 0,
width * height, 1,
value);
}
void (*ARGBShadeRow)(const uint8* src_argb, uint8* dst_argb, void (*ARGBShadeRow)(const uint8* src_argb, uint8* dst_argb,
int width, uint32 value) = ARGBShadeRow_C; int width, uint32 value) = ARGBShadeRow_C;
#if defined(HAS_ARGBSHADEROW_SSE2) #if defined(HAS_ARGBSHADEROW_SSE2)
...@@ -1570,6 +1704,16 @@ int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0, ...@@ -1570,6 +1704,16 @@ int ARGBInterpolate(const uint8* src_argb0, int src_stride_argb0,
dst_argb = dst_argb + (height - 1) * dst_stride_argb; dst_argb = dst_argb + (height - 1) * dst_stride_argb;
dst_stride_argb = -dst_stride_argb; dst_stride_argb = -dst_stride_argb;
} }
// Coalesce contiguous rows.
if (src_stride_argb0 == width * 4 &&
src_stride_argb1 == width * 4 &&
dst_stride_argb == width * 4) {
return ARGBInterpolate(src_argb0, 0,
src_argb1, 0,
dst_argb, 0,
width * height, 1,
interpolation);
}
void (*ARGBInterpolateRow)(uint8* dst_ptr, const uint8* src_ptr, void (*ARGBInterpolateRow)(uint8* dst_ptr, const uint8* src_ptr,
ptrdiff_t src_stride, int dst_width, ptrdiff_t src_stride, int dst_width,
int source_y_fraction) = ARGBInterpolateRow_C; int source_y_fraction) = ARGBInterpolateRow_C;
...@@ -1619,8 +1763,12 @@ int ARGBShuffle(const uint8* src_bgra, int src_stride_bgra, ...@@ -1619,8 +1763,12 @@ int ARGBShuffle(const uint8* src_bgra, int src_stride_bgra,
src_stride_bgra = -src_stride_bgra; src_stride_bgra = -src_stride_bgra;
} }
// Coalesce contiguous rows. // Coalesce contiguous rows.
if (src_stride_bgra == width * 4 && dst_stride_argb == width * 4) { if (src_stride_bgra == width * 4 &&
return ARGBShuffle(src_bgra, 0, dst_argb, 0, shuffler, width * height, 1); dst_stride_argb == width * 4) {
return ARGBShuffle(src_bgra, 0,
dst_argb, 0,
shuffler,
width * height, 1);
} }
void (*ARGBShuffleRow)(const uint8* src_bgra, uint8* dst_argb, void (*ARGBShuffleRow)(const uint8* src_bgra, uint8* dst_argb,
const uint8* shuffler, int pix) = ARGBShuffleRow_C; const uint8* shuffler, int pix) = ARGBShuffleRow_C;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment