+ i_sin = sin(f_hue) * 256;
+ i_cos = cos(f_hue) * 256;
+
+ i_x = ( cos(f_hue) + sin(f_hue) ) * 32768;
+ i_y = ( cos(f_hue) - sin(f_hue) ) * 32768;
+
+ if ( i_sat > 256 )
+ {
+#define WRITE_UV_CLIP() \
+ i_u = *p_in++ ; i_v = *p_in_v++ ; \
+ *p_out++ = clip_uint8_vlc( (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
+ * i_sat) >> 8) + 128); \
+ *p_out_v++ = clip_uint8_vlc( (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
+ * i_sat) >> 8) + 128)
+
+ uint8_t i_u, i_v;
+
+ for( ; p_in < p_in_end ; )
+ {
+ p_line_end = p_in + p_pic->p[U_PLANE].i_visible_pitch - 8;
+
+ for( ; p_in < p_line_end ; )
+ {
+ /* Do 8 pixels at a time */
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ WRITE_UV_CLIP(); WRITE_UV_CLIP();
+ }
+
+ p_line_end += 8;
+
+ for( ; p_in < p_line_end ; )
+ {
+ WRITE_UV_CLIP();
+ }
+
+ p_in += p_pic->p[U_PLANE].i_pitch
+ - p_pic->p[U_PLANE].i_visible_pitch;
+ p_in_v += p_pic->p[V_PLANE].i_pitch
+ - p_pic->p[V_PLANE].i_visible_pitch;
+ p_out += p_outpic->p[U_PLANE].i_pitch
+ - p_outpic->p[U_PLANE].i_visible_pitch;
+ p_out_v += p_outpic->p[V_PLANE].i_pitch
+ - p_outpic->p[V_PLANE].i_visible_pitch;
+ }
+#undef WRITE_UV_CLIP
+ }
+ else
+ {
+#define WRITE_UV() \
+ i_u = *p_in++ ; i_v = *p_in_v++ ; \
+ *p_out++ = (( ((i_u * i_cos + i_v * i_sin - i_x) >> 8) \
+ * i_sat) >> 8) + 128; \
+ *p_out_v++ = (( ((i_v * i_cos - i_u * i_sin - i_y) >> 8) \
+ * i_sat) >> 8) + 128
+
+ uint8_t i_u, i_v;
+
+ for( ; p_in < p_in_end ; )
+ {
+ p_line_end = p_in + p_pic->p[U_PLANE].i_visible_pitch - 8;
+
+ for( ; p_in < p_line_end ; )
+ {
+ /* Do 8 pixels at a time */
+ WRITE_UV(); WRITE_UV(); WRITE_UV(); WRITE_UV();
+ WRITE_UV(); WRITE_UV(); WRITE_UV(); WRITE_UV();
+ }
+
+ p_line_end += 8;
+
+ for( ; p_in < p_line_end ; )
+ {
+ WRITE_UV();
+ }
+
+ p_in += p_pic->p[U_PLANE].i_pitch
+ - p_pic->p[U_PLANE].i_visible_pitch;
+ p_in_v += p_pic->p[V_PLANE].i_pitch
+ - p_pic->p[V_PLANE].i_visible_pitch;
+ p_out += p_outpic->p[U_PLANE].i_pitch
+ - p_outpic->p[U_PLANE].i_visible_pitch;
+ p_out_v += p_outpic->p[V_PLANE].i_pitch
+ - p_outpic->p[V_PLANE].i_visible_pitch;
+ }
+#undef WRITE_UV
+ }
+
+ return CopyInfoAndRelease( p_outpic, p_pic );