pixman-android.c revision 3c5ee0fc482e93912b9b090d0df1af496288a702
11f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/*
21f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Copyright © 2013 The Android Open Source Project
31f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * Permission is hereby granted, free of charge, to any person obtaining a
51f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * copy of this software and associated documentation files (the "Software"),
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * to deal in the Software without restriction, including without limitation
7c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
81f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * and/or sell copies of the Software, and to permit persons to whom the
91f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Software is furnished to do so, subject to the following conditions:
101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * The above copyright notice and this permission notice (including the next
121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * paragraph) shall be included in all copies or substantial portions of the
131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Software.
141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * DEALINGS IN THE SOFTWARE.
221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/*
241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Copyright © 2000 SuSE, Inc.
251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Copyright © 2007 Red Hat, Inc.
261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Permission to use, copy, modify, distribute, and sell this software and its
281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * documentation for any purpose is hereby granted without fee, provided that
291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * the above copyright notice appear in all copies and that both that
301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * copyright notice and this permission notice appear in supporting
311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * documentation, and that the name of SuSE not be used in advertising or
321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * publicity pertaining to distribution of the software without specific,
331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * written prior permission.  SuSE makes no representations about the
3461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt * suitability of this software for any purpose.  It is provided "as is"
351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * without express or implied warranty.
361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Author:  Keith Packard, SuSE, Inc.
451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/*
471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Copyright © 2009 ARM Ltd, Movial Creative Technologies Oy
481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Permission to use, copy, modify, distribute, and sell this software and its
501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * documentation for any purpose is hereby granted without fee, provided that
511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * the above copyright notice appear in all copies and that both that
521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * copyright notice and this permission notice appear in supporting
531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * documentation, and that the name of ARM Ltd not be used in
541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * advertising or publicity pertaining to distribution of the software without
551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * specific, written prior permission.  ARM Ltd makes no
561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * representations about the suitability of this software for any purpose.  It
571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * is provided "as is" without express or implied warranty.
581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * SOFTWARE.
671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Author:  Ian Rickards (ian.rickards@arm.com)
691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Author:  Jonathan Morton (jonathan.morton@movial.com)
701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Author:  Markku Vire (markku.vire@movial.com)
711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "config.h"
751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "pixman-android.h"
761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#include "pixman-private.h"
771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_neon(uint32_t *dst,
791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        const uint32_t *top, const uint32_t *bottom, int wt, int wb,
801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        pixman_fixed_t x, pixman_fixed_t ux, int width);
811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline void scaled_bilinear_scanline_neon_8888_8888_SRC(uint32_t * dst,
831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        const uint32_t * mask, const uint32_t * src_top,
841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        const uint32_t * src_bottom, int32_t w, int wt, int wb,
851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        pixman_fixed_t vx, pixman_fixed_t unit_x, pixman_fixed_t max_vx,
861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        pixman_bool_t zero_src) {
871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_scaled_bilinear_scanline_8888_8888_SRC_asm_neon(dst, src_top,
881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            src_bottom, wt, wb, vx, unit_x, w);
891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline int pixman_fixed_to_bilinear_weight(pixman_fixed_t x) {
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    return (x >> (16 - BILINEAR_INTERPOLATION_BITS))
931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            & ((1 << BILINEAR_INTERPOLATION_BITS) - 1);
941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt/*
971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * For each scanline fetched from source image with PAD repeat:
981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * - calculate how many pixels need to be padded on the left side
991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * - calculate how many pixels need to be padded on the right side
1001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * - update width to only count pixels which are fetched from the image
1011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * All this information is returned via 'width', 'left_pad', 'right_pad'
1021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * arguments. The code is assuming that 'unit_x' is positive.
1031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *
1041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt * Note: 64-bit math is used in order to avoid potential overflows, which
1051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *       is probably excessive in many cases. This particular function
1061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt *       may need its own correctness test and performance tuning.
1071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt */
1081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic force_inline void pad_repeat_get_scanline_bounds(
1091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int32_t source_image_width, pixman_fixed_t vx, pixman_fixed_t unit_x,
1101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int32_t * width, int32_t * left_pad, int32_t * right_pad) {
1111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int64_t max_vx = (int64_t) source_image_width << 16;
1121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int64_t tmp;
1131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    if (vx < 0) {
1141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        tmp = ((int64_t) unit_x - 1 - vx) / unit_x;
1151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (tmp > *width) {
1161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            *left_pad = *width;
1171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            *width = 0;
1181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        } else {
1191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            *left_pad = (int32_t) tmp;
1201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            *width -= (int32_t) tmp;
1211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
1221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    } else {
1231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *left_pad = 0;
1241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    }
1251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    tmp = ((int64_t) unit_x - 1 - vx + max_vx) / unit_x - *left_pad;
1261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    if (tmp < 0) {
1271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *right_pad = *width;
1281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *width = 0;
1291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    } else if (tmp >= *width) {
1301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *right_pad = 0;
1311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    } else {
1321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *right_pad = *width - (int32_t) tmp;
1331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        *width = (int32_t) tmp;
1341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    }
1351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic force_inline void bilinear_pad_repeat_get_scanline_bounds(
1381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int32_t source_image_width, pixman_fixed_t vx, pixman_fixed_t unit_x,
1391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int32_t * left_pad, int32_t * left_tz, int32_t * width,
1401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int32_t * right_tz, int32_t * right_pad) {
1411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int width1 = *width, left_pad1, right_pad1;
1421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int width2 = *width, left_pad2, right_pad2;
1431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pad_repeat_get_scanline_bounds(source_image_width, vx, unit_x, &width1,
1451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            &left_pad1, &right_pad1);
1461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pad_repeat_get_scanline_bounds(source_image_width, vx + pixman_fixed_1,
1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            unit_x, &width2, &left_pad2, &right_pad2);
1481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    *left_pad = left_pad2;
1501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    *left_tz = left_pad1 - left_pad2;
1511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    *right_tz = right_pad2 - right_pad1;
1521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    *right_pad = right_pad1;
1531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    *width -= *left_pad + *left_tz + *right_tz + *right_pad;
1541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
1551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
1561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtvoid android_bilinear_filter(android_simple_image* src_image,
1571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        android_simple_image* dst_image, float scale) {
1581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t src_width = src_image->width;
1591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t src_height = src_image->height;
1601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_fixed_t fixed_scale = pixman_double_to_fixed(scale);
1611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_transform_t transform;
1621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_transform_init_scale(&transform, fixed_scale, fixed_scale);
1631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_vector_t v;
1641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t left_pad, left_tz, right_tz, right_pad;
1651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t src_x = 0;
1661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t src_y = 0;
1671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_fixed_t unit_x, unit_y;
1681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t width = dst_image->width;
1691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t height = dst_image->height;
1701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    uint32_t dst_line = 0;
1711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    uint32_t* src_first_line;
1721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t dest_y = 0;
1731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int32_t dest_x = 0;
1741f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    uint32_t* dst;
1751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    int y1, y2;
1761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    pixman_fixed_t vx, vy;
1771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    uint32_t solid_mask;
1781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    const uint32_t* mask = &solid_mask;
1791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[0] = ((pixman_fixed_t) (((src_x) << 16)))
1801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            + (((pixman_fixed_t) (((1) << 16)))) / 2;
1811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[1] = ((pixman_fixed_t) (((src_y) << 16)))
1821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            + (((pixman_fixed_t) (((1) << 16)))) / 2;
1831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[2] = (((pixman_fixed_t) (((1) << 16))));
1841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    if (!pixman_transform_point_3d(&transform, &v)) {
1851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        return;
1861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    }
1871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    unit_x = transform.matrix[0][0];
1881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    unit_y = transform.matrix[1][1];
1891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[0] -= (((pixman_fixed_t) (((1) << 16)))) / 2;
1901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[1] -= (((pixman_fixed_t) (((1) << 16)))) / 2;
1911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    vy = v.vector[1];
1921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    bilinear_pad_repeat_get_scanline_bounds(src_width, v.vector[0], unit_x,
1931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            &left_pad, &left_tz, &width, &right_tz, &right_pad);
1941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    v.vector[0] += left_pad * unit_x;
1951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    while (--height >= 0) {
1961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        int weight1, weight2;
1971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        dst_image->get_scanline(dst_image, (void**)(&dst), dst_line);
1981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        dst_line++;
1991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        vx = v.vector[0];
2001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        y1 = ((int) (((vy) >> 16)));
2011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        weight2 = pixman_fixed_to_bilinear_weight(vy);
2021f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (weight2) {
2031f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y2 = y1 + 1;
2041f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight1 = (1 << 7) - weight2;
2051f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        } else {
2061f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y2 = y1;
2071f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight1 = weight2 = (1 << 7) / 2;
2081f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2091f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        vy += unit_y;
2101f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        uint32_t buf1[2];
2111f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        uint32_t buf2[2];
2121f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        uint32_t* src1;
2131f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        uint32_t* src2;
2141f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (y1 < 0) {
2151f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight1 = 0;
2161f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y1 = 0;
2171f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2181f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (y1 >= src_height) {
2191f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight1 = 0;
2201f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y1 = src_height - 1;
2211f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2221f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (y2 < 0) {
2231f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight2 = 0;
2241f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y2 = 0;
2251f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2261f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (y2 >= src_height) {
2271f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            weight2 = 0;
2281f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            y2 = src_height - 1;
2291f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2301f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        src_image->get_scanline(src_image, (void**)(&src1), y1);
2311f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        src_image->get_scanline(src_image, (void**)(&src2), y2);
2321f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (left_pad > 0) {
2331f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[0] = buf1[1] = 0;
2341f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[0] = buf2[1] = 0;
2351f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            scaled_bilinear_scanline_neon_8888_8888_SRC(dst, mask, buf1, buf2,
2361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    left_pad, weight1, weight2, 0, 0, 0, 1);
2371f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            dst += left_pad;
2381f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2391f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (left_tz > 0) {
2401f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[0] = 0;
2411f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[1] = src1[0];
2421f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[0] = 0;
2431f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[1] = src2[0];
2441f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            scaled_bilinear_scanline_neon_8888_8888_SRC(dst, mask, buf1, buf2,
2451f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    left_tz, weight1, weight2,
2461f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    ((vx)
2471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                            & ((((pixman_fixed_t) (((1) << 16))))
2481f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                    - ((pixman_fixed_t) (1)))), unit_x, 0, 0);
2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            dst += left_tz;
2501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            vx += left_tz * unit_x;
2511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2521f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (width > 0) {
2531f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            scaled_bilinear_scanline_neon_8888_8888_SRC(dst, mask, src1, src2,
2541f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    width, weight1, weight2, vx, unit_x, 0, 0);
2551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            dst += width;
2561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            vx += width * unit_x;
2571f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2581f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (right_tz > 0) {
2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[0] = src1[src_width - 1];
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[1] = 0;
2611f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[0] = src2[src_width - 1];
2621f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[1] = 0;
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            scaled_bilinear_scanline_neon_8888_8888_SRC(dst, mask, buf1, buf2,
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    right_tz, weight1, weight2,
2651f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                    ((vx)
2661f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                            & ((((pixman_fixed_t) (((1) << 16))))
2671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt                                    - ((pixman_fixed_t) (1)))), unit_x, 0, 0);
2681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            dst += right_tz;
2691f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        }
2701f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        if (right_pad > 0) {
2711f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf1[0] = buf1[1] = 0;
2721f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            buf2[0] = buf2[1] = 0;
2731f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt            scaled_bilinear_scanline_neon_8888_8888_SRC(dst, mask, buf1, buf2,
274                    right_pad, weight1, weight2, 0, 0, 0, 1);
275        }
276    }
277}
278