Author: post
Date: 2010-01-26 21:21:06 +0100 (Tue, 26 Jan 2010)
New Revision: 3079
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform_sse2.c
Log:
CS Transform: Fix wrongly transformed pixels at right border.
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform_sse2.c
===================================================================
---
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform_sse2.c
2010-01-26 19:58:37 UTC (rev 3078)
+++
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform_sse2.c
2010-01-26 20:21:06 UTC (rev 3079)
@@ -174,7 +174,7 @@
if (complete_w & 3)
{
if ((t->end_x+4) < input->w)
- complete_w = ((complete_w+3) / 4 *4);
+ complete_w = (((complete_w + 3) / 4) * 4);
}
for(y=t->start_y ; y<t->end_y ; y++)
@@ -276,31 +276,33 @@
i += 16;
o += 16;
}
+
/* Process remaining pixels */
width = complete_w & 3;
+
while(width--)
{
__m128i zero = _mm_setzero_si128();
- __m128i in = _mm_loadl_epi64((__m128i*)i); // Load two
pixels
+ __m128i in = _mm_loadl_epi64((__m128i*)i); // Load one
pixel
__m128i p1 =_mm_unpacklo_epi16(in, zero);
__m128 p1f = _mm_cvtepi32_ps(p1);
/* Splat r,g,b */
- __m128 r = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(4,4,4,4));
- __m128 g = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(3,3,3,3));
+ __m128 r = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(0,0,0,0));
+ __m128 g = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(1,1,1,1));
__m128 b = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(2,2,2,2));
__m128 r2 = sse_matrix3_mul(mat_ps, r, g, b);
__m128 g2 = sse_matrix3_mul(&mat_ps[12], r, g, b);
__m128 b2 = sse_matrix3_mul(&mat_ps[24], r, g, b);
- r = _mm_unpacklo_ps(r2, g2); // GG RR GG RR
- r = _mm_movelh_ps(r, b2); // BB BB GG RR
+ r = _mm_unpacklo_ps(r2, g2); // RR GG RR GG
+ r = _mm_movelh_ps(r, b2); // RR GG BB BB
__m128 normalize = _mm_load_ps(_normalize);
__m128 max_val = _mm_load_ps(_ones_ps);
__m128 min_val = _mm_setzero_ps();
- r = _mm_min_ps(max_val, _mm_max_ps(min_val,
_mm_mul_ps(normalize, r2)));
+ r = _mm_min_ps(max_val, _mm_max_ps(min_val,
_mm_mul_ps(normalize, r)));
__m128 mul_over = _mm_load_ps(_srb_mul_over);
__m128 sub_over = _mm_load_ps(_srb_sub_over);
__m128 pow_over = _mm_load_ps(_srb_pow_over);
@@ -360,7 +362,7 @@
if (complete_w & 3)
{
if ((t->end_x+4) < input->w)
- complete_w = ((complete_w+3) / 4 *4);
+ complete_w = ((complete_w+3) / 4 * 4);
}
__m128 gamma = _mm_set1_ps(t->output_gamma);
@@ -452,8 +454,8 @@
__m128 p1f = _mm_cvtepi32_ps(p1);
/* Splat r,g,b */
- __m128 r = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(4,4,4,4));
- __m128 g = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(3,3,3,3));
+ __m128 r = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(0,0,0,0));
+ __m128 g = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(1,1,1,1));
__m128 b = _mm_shuffle_ps(p1f, p1f,
_MM_SHUFFLE(2,2,2,2));
__m128 r2 = sse_matrix3_mul(mat_ps, r, g, b);
@@ -466,7 +468,7 @@
__m128 normalize = _mm_load_ps(_normalize);
__m128 max_val = _mm_load_ps(_ones_ps);
__m128 min_val = _mm_setzero_ps();
- r = _mm_min_ps(max_val, _mm_max_ps(min_val,
_mm_mul_ps(normalize, r2)));
+ r = _mm_min_ps(max_val, _mm_max_ps(min_val,
_mm_mul_ps(normalize, r)));
__m128 upscale = _mm_load_ps(_8bit);
r = _mm_mul_ps(upscale, _mm_fastpow_ps(r, gamma));
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit