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