From: Siarhei Siamashka <siarhei.siamas...@nokia.com> Serves no real practical purpose other than testing a8 mask support in bilinear scaling main loop template. --- pixman/pixman-fast-path.c | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 80 insertions(+), 0 deletions(-)
diff --git a/pixman/pixman-fast-path.c b/pixman/pixman-fast-path.c index 1e3094e..a2125c0 100644 --- a/pixman/pixman-fast-path.c +++ b/pixman/pixman-fast-path.c @@ -1594,6 +1594,82 @@ FAST_BILINEAR_MAINLOOP_COMMON (8888_8888_none_SRC, uint32_t, uint32_t, uint32_t, NONE, FALSE, FALSE) +static void +bilinear_interpolate_a8_line (uint32_t * dst, + const uint8_t * mask, + const uint32_t * top_row, + const uint32_t * bottom_row, + int wt, + int wb, + pixman_fixed_t x, + pixman_fixed_t ux, + int width) +{ + while (--width >= 0) + { + uint8_t m = *mask++; + if (m) + { + uint32_t s; + uint32_t tl, tr, bl, br; + int distx; + + tl = top_row [pixman_fixed_to_int (x)]; + tr = top_row [pixman_fixed_to_int (x) + 1]; + bl = bottom_row [pixman_fixed_to_int (x)]; + br = bottom_row [pixman_fixed_to_int (x) + 1]; + + distx = (x >> 8) & 0xff; + + s = bilinear_interpolation (tl, tr, bl, br, distx, wt, wb); + if (m == 0xff) + { + *dst = s; + } + else + { + *dst = in (s, m); + } + } + else + { + *dst = 0; + } + x += ux; + dst++; + } +} + +static force_inline void +scaled_bilinear_scanline_8888_8_8888_SRC (uint32_t * dst, + const uint8_t * mask, + const uint32_t * src_top, + const uint32_t * src_bottom, + int32_t w, + int wt, + int wb, + pixman_fixed_t vx, + pixman_fixed_t unit_x, + pixman_fixed_t max_vx, + pixman_bool_t zero_src) +{ + bilinear_interpolate_a8_line (dst, mask, src_top, src_bottom, + wt, wb, vx, unit_x, w); +} + +FAST_BILINEAR_MAINLOOP_COMMON (8888_8_8888_cover_SRC, + scaled_bilinear_scanline_8888_8_8888_SRC, + uint32_t, uint8_t, uint32_t, + COVER, TRUE, FALSE) +FAST_BILINEAR_MAINLOOP_COMMON (8888_8_8888_pad_SRC, + scaled_bilinear_scanline_8888_8_8888_SRC, + uint32_t, uint8_t, uint32_t, + PAD, TRUE, FALSE) +FAST_BILINEAR_MAINLOOP_COMMON (8888_8_8888_none_SRC, + scaled_bilinear_scanline_8888_8_8888_SRC, + uint32_t, uint8_t, uint32_t, + NONE, TRUE, FALSE) + static force_inline uint32_t fetch_nearest (pixman_repeat_t src_repeat, pixman_format_code_t format, @@ -2117,6 +2193,10 @@ static const pixman_fast_path_t c_fast_paths[] = SIMPLE_BILINEAR_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, 8888_8888), SIMPLE_BILINEAR_FAST_PATH (SRC, x8b8g8r8, x8b8g8r8, 8888_8888), + SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, a8r8g8b8, 8888_8_8888), + SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, a8r8g8b8, x8r8g8b8, 8888_8_8888), + SIMPLE_BILINEAR_A8_MASK_FAST_PATH (SRC, x8r8g8b8, x8r8g8b8, 8888_8_8888), + #define NEAREST_FAST_PATH(op,s,d) \ { PIXMAN_OP_ ## op, \ PIXMAN_ ## s, SCALED_NEAREST_FLAGS, \ -- 1.7.3.4 _______________________________________________ Pixman mailing list Pixman@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/pixman