94 void ne10_img_rotate_get_quad_rangle_subpix_rgba_c (ne10_uint8_t *dst,
100 ne10_float32_t *matrix)
102 ne10_uint8_t* src_data = src;
103 ne10_uint8_t* dst_data = dst;
108 ne10_float32_t A11 = matrix[0], A12 = matrix[1], A13 = matrix[2];
109 ne10_float32_t A21 = matrix[3], A22 = matrix[4], A23 = matrix[5];
111 ne10_int32_t src_step = srcw * 4;
112 ne10_int32_t dst_step = dstw * 4;
113 for (y = 0; y < dsth; y++, dst_data += dst_step)
115 ne10_float32_t xs = A12 * y + A13;
116 ne10_float32_t ys = A22 * y + A23;
117 ne10_float32_t xe = A11 * (dstw - 1) + A12 * y + A13;
118 ne10_float32_t ye = A21 * (dstw - 1) + A22 * y + A23;
120 if ( (
unsigned) ( (ne10_int32_t) (xs) - 1) < (
unsigned) (srcw - 4) &&
121 (
unsigned) ( (ne10_int32_t) (ys) - 1) < (
unsigned) (srch - 4) &&
122 (
unsigned) ( (ne10_int32_t) (xe) - 1) < (
unsigned) (srcw - 4) &&
123 (
unsigned) ( (ne10_int32_t) (ye) - 1) < (
unsigned) (srch - 4))
125 for (x = 0; x < dstw; x++)
127 ne10_int32_t ixs = (ne10_int32_t) (xs);
128 ne10_int32_t iys = (ne10_int32_t) (ys);
129 const ne10_uint8_t *ptr = src_data + src_step * iys + ixs * 4;
131 ne10_int16_t a = NE10_F2I16_OP (xs - ixs);
132 ne10_int16_t b = NE10_F2I16_OP (ys - iys);
133 ne10_int16_t a1 = NE10_F2I16_OP (1.f - (xs - ixs));
139 p0 = NE10_F2I16_SROUND (ptr[0] * a1 + ptr[4] * a);
140 p1 = NE10_F2I16_SROUND (ptr[src_step] * a1 + ptr[src_step + 4] * a);
141 dst_data[x * 4] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
143 p0 = NE10_F2I16_SROUND (ptr[1] * a1 + ptr[1] * a);
144 p1 = NE10_F2I16_SROUND (ptr[src_step + 1] * a1 + ptr[src_step + 4 + 1] * a);
145 dst_data[x * 4 + 1] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
147 p0 = NE10_F2I16_SROUND (ptr[2] * a1 + ptr[4 + 2] * a);
148 p1 = NE10_F2I16_SROUND (ptr[src_step + 2] * a1 + ptr[src_step + 4 + 2] * a);
149 dst_data[x * 4 + 2] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
151 p0 = NE10_F2I16_SROUND (ptr[3] * a1 + ptr[4 + 3] * a);
152 p1 = NE10_F2I16_SROUND (ptr[src_step + 3] * a1 + ptr[src_step + 4 + 3] * a);
153 dst_data[x * 4 + 3] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
158 for (x = 0; x < dstw; x++)
160 ne10_int32_t ixs = (ne10_int32_t) (xs), iys = (ne10_int32_t) (ys);
163 ne10_int16_t a = NE10_F2I16_OP (xs - ixs);
164 ne10_int16_t b = NE10_F2I16_OP (ys - iys);
165 ne10_int16_t a1 = NE10_F2I16_OP (1.f - (xs - ixs));
166 const ne10_uint8_t *ptr0, *ptr1;
170 if ( (
unsigned) iys < (
unsigned) (srch - 1))
172 ptr0 = src_data + src_step * iys;
173 ptr1 = ptr0 + src_step;
180 if ( (
unsigned) ixs < (
unsigned) (srcw - 1))
188 p0 = NE10_F2I16_SROUND (ptr0[0] * a1 + ptr0[4] * a);
189 p1 = NE10_F2I16_SROUND (ptr1[0] * a1 + ptr1[4] * a);
190 dst_data[x * 4] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
192 p0 = NE10_F2I16_SROUND (ptr0[1] * a1 + ptr0[4 + 1] * a);
193 p1 = NE10_F2I16_SROUND (ptr1[1] * a1 + ptr1[4 + 1] * a);
194 dst_data[x * 4 + 1] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
196 p0 = NE10_F2I16_SROUND (ptr0[2] * a1 + ptr0[4 + 2] * a);
197 p1 = NE10_F2I16_SROUND (ptr1[2] * a1 + ptr1[4 + 2] * a);
198 dst_data[x * 4 + 2] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
200 p0 = NE10_F2I16_SROUND (ptr0[3] * a1 + ptr0[4 + 3] * a);
201 p1 = NE10_F2I16_SROUND (ptr1[3] * a1 + ptr1[4 + 3] * a);
202 dst_data[x * 4 + 3] = NE10_F2I16_SROUND (p0 * NE10_F2I16_MAX + b * (p1 - p0));
232 ne10_uint32_t* dst_width,
233 ne10_uint32_t* dst_height,
235 ne10_uint32_t src_width,
236 ne10_uint32_t src_height,
239 ne10_float32_t radian = (angle * NE10_PI / 180.0);
240 ne10_float32_t a = sin (radian), b = cos (radian);
241 ne10_int32_t srcw = src_width;
242 ne10_int32_t srch = src_height;
243 ne10_int32_t dstw = (srch * fabs (a)) + (srcw * fabs (b)) + 1;
244 ne10_int32_t dsth = (srch * fabs (b)) + (srcw * fabs (a)) + 1;
246 ne10_float32_t dx = (dstw - 1) * 0.5;
247 ne10_float32_t dy = (dsth - 1) * 0.5;
253 m[2] = srcw * 0.5f - m[0] * dx - m[1] * dy;
254 m[5] = srch * 0.5f - m[3] * dx - m[4] * dy;
258 ne10_img_rotate_get_quad_rangle_subpix_rgba_c (dst, src, srcw, srch, dstw, dsth, m);
261 #ifdef ENABLE_NE10_IMG_ROTATE_RGBA_NEON
262 extern void ne10_img_rotate_get_quad_rangle_subpix_rgba_neon (ne10_uint8_t *dst,
268 ne10_float32_t *matrix)
269 asm(
"ne10_img_rotate_get_quad_rangle_subpix_rgba_neon");
283 void ne10_img_rotate_rgba_neon (ne10_uint8_t* dst,
284 ne10_uint32_t* dst_width,
285 ne10_uint32_t* dst_height,
287 ne10_uint32_t src_width,
288 ne10_uint32_t src_height,
291 ne10_float32_t radian = (angle * NE10_PI / 180.0);
292 ne10_float32_t a = sin (radian), b = cos (radian);
293 ne10_int32_t srcw = src_width;
294 ne10_int32_t srch = src_height;
295 ne10_int32_t dstw = (srch * fabs (a)) + (srcw * fabs (b)) + 1;
296 ne10_int32_t dsth = (srch * fabs (b)) + (srcw * fabs (a)) + 1;
298 ne10_float32_t dx = (dstw - 1) * 0.5;
299 ne10_float32_t dy = (dsth - 1) * 0.5;
305 m[2] = srcw * 0.5f - m[0] * dx - m[1] * dy;
306 m[5] = srch * 0.5f - m[3] * dx - m[4] * dy;
310 ne10_img_rotate_get_quad_rangle_subpix_rgba_neon (dst, src, srcw, srch, dstw, dsth, m);
316 #endif // ENABLE_NE10_IMG_ROTATE_RGBA_NEON