18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this file contains template code and may be included multiple times */ 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef ARGB_T_DEFINED 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_T_DEFINED 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if USE_MMX 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <mmintrin.h> 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef __m64 mmx_t; 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef mmx_t argb_t; 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline mmx_t 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmmx_load8888( unsigned value, mmx_t zero ) 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _mm_unpacklo_pi8( _mm_cvtsi32_si64 (value), zero); 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline unsigned 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmmx_save8888( mmx_t argb, mmx_t zero ) 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (unsigned) _mm_cvtsi64_si32( _mm_packs_pu16( argb, zero ) ); 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline mmx_t 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmmx_expand16( int value ) 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t t1 = _mm_cvtsi32_si64( value ); 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _mm_packs_pi32( t1, t1 ); 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline mmx_t 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmmx_mulshift( mmx_t argb, int multiplier, int rshift, mmx_t zero ) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t ar = _mm_unpackhi_pi16(argb, zero ); 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t gb = _mm_unpacklo_pi16(argb, zero ); 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t mult = mmx_expand16(multiplier); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ar = _mm_srli_pi32( _mm_madd_pi16( ar, mult ), rshift ); 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gb = _mm_srli_pi32( _mm_madd_pi16( gb, mult ), rshift ); 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _mm_packs_pi32( gb, ar ); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline mmx_t 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectmmx_interp255( mmx_t m1, mmx_t m2, mmx_t zero, int alpha ) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t mult, mult2, t1, t2, r1, r2; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // m1 = [ a1 | r1 | g1 | b1 ] 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // m2 = [ a2 | r2 | g2 | b2 ] 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (alpha << 16) | (alpha ^ 255); 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mult = _mm_cvtsi32_si64( alpha ); // mult = [ 0 | 0 | a | 1-a ] 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mult2 = _mm_slli_si64( mult, 32 ); // mult2 = [ a | 1-a | 0 | 0 ] 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mult = _mm_or_si64( mult, mult2 ); // mults = [ a | 1-a | a | 1-a ] 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t1 = _mm_unpackhi_pi16( m1, m2 ); // t1 = [ a2 | a1 | r2 | r1 ] 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r1 = _mm_madd_pi16( t1, mult ); // r1 = [ ra | rr ] 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project t2 = _mm_unpacklo_pi16( m1, m2 ); // t1 = [ g2 | g1 | b2 | b1 ] 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r2 = _mm_madd_pi16( t2, mult ); // r2 = [ rg | rb ] 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r1 = _mm_srli_pi32( r1, 8 ); 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r2 = _mm_srli_pi32( r2, 8 ); 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _mm_packs_pi32( r2, r1 ); 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL_ZERO() mmx_t _zero = _mm_setzero_si64() 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL(x) mmx_t x 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL2(x1,x2) mmx_t x1, x2 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ZERO(x) x = _zero 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_UNPACK(x,v) x = mmx_load8888((v), _zero) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_PACK(x) mmx_save8888(x, _zero) 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_COPY(x,y) x = y 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_SUM(x1,x2,x3) x1 = _mm_add_pi32(x2, x3) 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_REDUCE(x,red) \ 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int _red = (red) >> 8; \ 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (_red < 256) \ 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x = mmx_mulshift( x, _red, 8, _zero ); \ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_INTERP255(x1,x2,x3,alpha) \ 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1 = mmx_interp255( x2, x3, _zero, (alpha)) 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_11(x1,x2,x3) \ 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SUM(x1,x2,x3) 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_31(x1,x2,x3) \ 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t _t1 = _mm_add_pi16(x2, x3); \ 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t _t2 = _mm_slli_pi16(x2, 1); \ 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1 = _mm_add_pi16(_t1, _t2); \ 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_13(x1,x2,x3) \ 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t _t1 = _mm_add_pi16(x2, x3); \ 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project mmx_t _t2 = _mm_slli_pi16(x3, 1); \ 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1 = _mm_add_pi16(_t1, _t2); \ 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_SHR(x1,x2,s) \ 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1 = _mm_srli_pi16(x2, s) 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_MULSHIFT(x1,x2,v,s) \ 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1 = mmx_mulshift(x2, v, s, _zero) 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1214e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner#define ARGB_BEGIN _mm_empty() 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DONE _mm_empty() 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_RESCALE_SHIFT 10 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL_SCALE(s2,s) int s2 = (int)((s)*(s)*(1 << ARGB_RESCALE_SHIFT)) 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_RESCALE(x,s2) x = mmx_mulshift( x, s2, ARGB_RESCALE_SHIFT, _zero ) 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else /* !USE_MMX */ 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef uint32_t argb_t; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1324e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner#define ARGB_DECL_ZERO() /* nothing */ 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL(x) argb_t x##_ag, x##_rb 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL2(x1,x2) argb_t x1##_ag, x1##_rb, x2##_ag, x2##_rb 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ZERO(x) (x##_ag = x##_rb = 0) 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_COPY(x,y) (x##_ag = y##_ag, x##_rb = y##_rb) 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_UNPACK(x,v) \ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project argb_t _v = (argb_t)(v); \ 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x##_ag = (_v >> 8) & 0xff00ff; \ 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x##_rb = (_v) & 0xff00ff; \ 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_PACK(x) (uint32_t)(((x##_ag) << 8) | x##_rb) 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_SUM(x1,x2,x3) \ 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = x2##_ag + x3##_ag; \ 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = x2##_rb + x3##_rb; \ 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_REDUCE(x,red) \ 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int _red = (red) >> 8; \ 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (_red < 256) { \ 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x##_ag = ((x##_ag*_red) >> 8) & 0xff00ff; \ 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x##_rb = ((x##_rb*_red) >> 8) & 0xff00ff; \ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } \ 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_INTERP255(x1,x2,x3,alpha) \ 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int _alpha = (alpha); \ 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int _ialpha; \ 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _alpha += _alpha >> 8; \ 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project _ialpha = 256 - _alpha; \ 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = ((x2##_ag*_ialpha + x3##_ag*_alpha) >> 8) & 0xff00ff; \ 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = ((x2##_rb*_ialpha + x3##_rb*_alpha) >> 8) & 0xff00ff; \ 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_11(x1,x2,x3) \ 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = (x2##_ag + x3##_ag); \ 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = (x2##_rb + x3##_rb); \ 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_31(x1,x2,x3) \ 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = (3*x2##_ag + x3##_ag); \ 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = (3*x2##_rb + x3##_rb); \ 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADDW_13(x1,x2,x3) \ 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = (x2##_ag + 3*x3##_ag); \ 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = (x2##_rb + 3*x3##_rb); \ 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_MULSHIFT(x1,x2,v,s) \ 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned _vv = (v); \ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = ((x2##_ag * _vv) >> (s)) & 0xff00ff; \ 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = ((x2##_rb * _vv) >> (s)) & 0xff00ff; \ 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_SHR(x1,x2,s) \ 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ({ \ 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int _s = (s); \ 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_ag = (x2##_ag >> _s) & 0xff00ff; \ 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x1##_rb = (x2##_rb >> _s) & 0xff00ff; \ 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }) 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2044e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner#define ARGB_BEGIN ((void)0) 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DONE ((void)0) 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_RESCALE_SHIFT 8 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_DECL_SCALE(s2,s) int s2 = (int)((s)*(s)*(1 << ARGB_RESCALE_SHIFT)) 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_RESCALE(x,scale2) ARGB_MULSHIFT(x,x,scale2,ARGB_RESCALE_SHIFT) 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !USE_MMX */ 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_ADD(x1,x2) ARGB_SUM(x1,x1,x2) 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_READ(x,p) ARGB_UNPACK(x,*(uint32_t*)(p)) 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ARGB_WRITE(x,p) *(uint32_t*)(p) = ARGB_PACK(x) 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif /* !ARGB_T_DEFINED */ 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARGB_SCALE_GENERIC 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectARGB_SCALE_GENERIC( ScaleOp* op ) 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch = op->dst_pitch; 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch = op->src_pitch; 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line = op->dst_line; 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line = op->src_line; 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_SCALE(scale2, op->scale); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = op->sx; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = op->sy; 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ix = op->ix; 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int iy = op->iy; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2364e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner ARGB_BEGIN; 23722ee8437f45a01c6e1d8e33dd85bb9df18ca1e8bDavid 'Digit' Turner 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src_line += (sx >> 16)*4 + (sy >> 16)*src_pitch; 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx &= 0xffff; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy &= 0xffff; 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( h = op->rd.h; h > 0; h-- ) { 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst = dst_line; 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src = src_line; 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_end = dst + 4*op->rd.w; 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx1 = sx; 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy1 = sy; 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < dst_end; ) { 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx2 = sx1 + ix; 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy2 = sy1 + iy; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(spix); 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(pix); 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ZERO(pix); 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the current destination pixel maps to the (sx1,sy1)-(sx2,sy2) 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * source square, we're going to compute the sum of its pixels' 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * colors... simple box filtering 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int gsy, gsx; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( gsy = 0; gsy < sy2; gsy += 65536 ) { 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( gsx = 0; gsx < sx2; gsx += 65536 ) { 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* s = src + (gsx >> 16)*4 + (gsy >> 16)*src_pitch; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int xmin = gsx, xmax = gsx + 65536, ymin = gsy, ymax = gsy + 65536; 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned ww, hh; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned red; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (xmin < sx1) xmin = sx1; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (xmax > sx2) xmax = sx2; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ymin < sy1) ymin = sy1; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ymax > sy2) ymax = sy2; 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ww = (unsigned)(xmax-xmin); 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project red = ww; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hh = (unsigned)(ymax-ymin); 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project red = (hh < 65536) ? (red*hh >> 16U) : red; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,s); 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,red); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_RESCALE(pix,scale2); 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx1 = sx2; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src += (sx1 >> 16)*4; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx1 &= 0xffff; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += iy; 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src_line += (sy >> 16)*src_pitch; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy &= 0xffff; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst_line += dst_pitch; 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DONE; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARGB_SCALE_GENERIC 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARGB_SCALE_05_TO_10 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic inline int cross( int x, int y ) { 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x == 65536 && y == 65536) 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 65536; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (int)((unsigned)x * (unsigned)y >> 16U); 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectscale_05_to_10( ScaleOp* op ) 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch = op->dst_pitch; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch = op->src_pitch; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line = op->dst_line; 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line = op->src_line; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_SCALE(scale2, op->scale); 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h; 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = op->sx; 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = op->sy; 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ix = op->ix; 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int iy = op->iy; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3324e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner ARGB_BEGIN; 33322ee8437f45a01c6e1d8e33dd85bb9df18ca1e8bDavid 'Digit' Turner 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src_line += (sx >> 16)*4 + (sy >> 16)*src_pitch; 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx &= 0xffff; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy &= 0xffff; 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( h = op->rd.h; h > 0; h-- ) { 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst = dst_line; 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src = src_line; 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_end = dst + 4*op->rd.w; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx1 = sx; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy1 = sy; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < dst_end; ) { 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx2 = sx1 + ix; 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy2 = sy1 + iy; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL2(spix, pix); 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int off = src_pitch; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fx1 = sx1 & 0xffff; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fx2 = sx2 & 0xffff; 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fy1 = sy1 & 0xffff; 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int fy2 = sy2 & 0xffff; 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int center_x = ((sx1 >> 16) + 1) < ((sx2-1) >> 16); 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int center_y = ((sy1 >> 16) + 1) < ((sy2-1) >> 16); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ZERO(pix); 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fx2 == 0) { 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fx2 = 65536; 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (fy2 == 0) { 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fy2 = 65536; 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fx1 = 65536 - fx1; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fy1 = 65536 - fy1; 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** TOP BAND 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* top-left pixel */ 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src); 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,cross(fx1,fy1)); 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* top-center pixel, if any */ 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + 4); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (center_x) { 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,fy1); 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + 8); 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* top-right pixel */ 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,cross(fx2,fy1)); 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** MIDDLE BAND, IF ANY 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (center_y) { 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* left-middle pixel */ 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off); 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,fx1); 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* center pixel, if any */ 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off + 4); 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (center_x) { 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off + 8); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* right-middle pixel */ 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,fx2); 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project off += src_pitch; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** BOTTOM BAND 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* left-bottom pixel */ 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off); 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,cross(fx1,fy2)); 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* center-bottom, if any */ 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off + 4); 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (center_x) { 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,fy2); 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix,src + off + 8); 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* right-bottom pixel */ 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_REDUCE(spix,cross(fx2,fy2)); 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(pix,spix); 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /** WRITE IT 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_RESCALE(pix,scale2); 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx1 = sx2; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src += (sx1 >> 16)*4; 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx1 &= 0xffff; 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += iy; 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project src_line += (sy >> 16)*src_pitch; 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy &= 0xffff; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst_line += dst_pitch; 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DONE; 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARGB_SCALE_05_TO_10 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARGB_SCALE_UP_BILINEAR 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectscale_up_bilinear( ScaleOp* op ) 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch = op->dst_pitch; 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch = op->src_pitch; 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line = op->dst_line; 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line = op->src_line; 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = op->sx; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = op->sy; 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ix = op->ix; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int iy = op->iy; 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int xlimit, ylimit; 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h, sx0; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4714e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner ARGB_BEGIN; 47222ee8437f45a01c6e1d8e33dd85bb9df18ca1e8bDavid 'Digit' Turner 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the four nearest source pixels, which are at (0.5,0.5) offsets */ 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx + ix/2 - 32768; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy = sy + iy/2 - 32768; 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project xlimit = (op->src_w-1); 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ylimit = (op->src_h-1); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx0 = sx; 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( h = op->rd.h; h > 0; h-- ) { 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst = dst_line; 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_end = dst + 4*op->rd.w; 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx0; 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < dst_end; ) { 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ex1, ex2, ey1, ey2, alpha; 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* s; 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL2(spix1,spix2); 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL2(pix3,pix4); 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(pix); 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* find the four neighbours */ 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex1 = (sx >> 16); 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey1 = (sy >> 16); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex2 = (sx+65535) >> 16; 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey2 = (sy+65535) >> 16; 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex1 < 0) ex1 = 0; else if (ex1 > xlimit) ex1 = xlimit; 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey1 < 0) ey1 = 0; else if (ey1 > ylimit) ey1 = ylimit; 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex2 < 0) ex2 = 0; else if (ex2 > xlimit) ex2 = xlimit; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey2 < 0) ey2 = 0; else if (ey2 > ylimit) ey2 = ylimit; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex2 = (ex2-ex1)*4; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey2 = (ey2-ey1)*src_pitch; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* interpolate */ 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = src_line + ex1*4 + ey1*src_pitch; 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, s); 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, s+ex2); 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (sx >> 8) & 0xff; 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_INTERP255(pix3,spix1,spix2,alpha); 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s += ey2; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, s); 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, s+ex2); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_INTERP255(pix4,spix1,spix2,alpha); 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (sy >> 8) & 0xff; 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_INTERP255(pix,pix3,pix4,alpha); 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx += ix; 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += iy; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst_line += dst_pitch; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DONE; 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARGB_SCALE_UP_BILINEAR 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARGB_SCALE_UP_QUICK_4x4 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectARGB_SCALE_UP_QUICK_4x4( ScaleOp* op ) 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch = op->dst_pitch; 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch = op->src_pitch; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line = op->dst_line; 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line = op->src_line; 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = op->sx; 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = op->sy; 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ix = op->ix; 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int iy = op->iy; 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int xlimit, ylimit; 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h, sx0; 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5584e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner ARGB_BEGIN; 55922ee8437f45a01c6e1d8e33dd85bb9df18ca1e8bDavid 'Digit' Turner 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the four nearest source pixels, which are at (0.5,0.5) offsets */ 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx + ix/2 - 32768; 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy = sy + iy/2 - 32768; 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project xlimit = (op->src_w-1); 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ylimit = (op->src_h-1); 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx0 = sx; 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( h = op->rd.h; h > 0; h-- ) { 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst = dst_line; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_end = dst + 4*op->rd.w; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx0; 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < dst_end; ) { 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ex1, ex2, ey1, ey2; 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* p; 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(pix); 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL2(spix1, spix2); 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL2(pix3, pix4); 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* find the four neighbours */ 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex1 = (sx >> 16); 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey1 = (sy >> 16); 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex2 = (sx+65535) >> 16; 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey2 = (sy+65535) >> 16; 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex1 < 0) ex1 = 0; else if (ex1 > xlimit) ex1 = xlimit; 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey1 < 0) ey1 = 0; else if (ey1 > ylimit) ey1 = ylimit; 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex2 < 0) ex2 = 0; else if (ex2 > xlimit) ex2 = xlimit; 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey2 < 0) ey2 = 0; else if (ey2 > ylimit) ey2 = ylimit; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* interpolate */ 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = (src_line + ex1*4 + ey1*src_pitch); 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex2 = (ex2-ex1)*4; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey2 = (ey2-ey1)*src_pitch; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (((sx >> 14) & 3) | ((sy >> 12) & 12)) { 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(uint32_t*)dst = *(uint32_t*)p; 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* top-line is easy */ 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix,spix1,spix2); 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,2); 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix, spix1, spix2); 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,1); 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 3: 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix,spix1,spix2); 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,2); 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* second line is harder */ 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 4: 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ey2); 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix,spix1,spix2); 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,2); 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 5: 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix3,spix1,spix2); 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix4,spix1,spix2); 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix,pix3,pix4); 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,4); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 6: 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix3,spix1,spix2); 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix4,spix1,spix2); 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix,pix3,pix4); 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,3); 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 7: 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix3,spix1,spix2); 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix4,spix1,spix2); 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix,pix3,pix4); 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,4); 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* third line */ 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 8: 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ey2); 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix,spix1,spix2); 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,1); 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 9: 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix3,spix1,spix2); 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix4,spix1,spix2); 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix,pix3,pix4); 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,3); 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 10: 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix3,spix1,spix2); 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix4,spix1,spix2); 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix,pix3,pix4); 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,2); 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 11: 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix3,spix1,spix2); 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix4,spix1,spix2); 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix,pix3,pix4); 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,3); 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* last line */ 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 12: 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ey2); 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix,spix1,spix2); 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,2); 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix, dst); 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 13: 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix3,spix1,spix2); 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_31(pix4,spix1,spix2); 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix,pix3,pix4); 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,4); 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 14: 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix3,spix1,spix2); 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_11(pix4,spix1,spix2); 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix,pix3,pix4); 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,3); 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix3,spix1,spix2); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += ey2; 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix1, p); 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(spix2, p+ex2); 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix4,spix1,spix2); 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADDW_13(pix,pix3,pix4); 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_SHR(pix,pix,4); 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(pix,dst); 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx += ix; 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += iy; 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst_line += dst_pitch; 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DONE; 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARGB_SCALE_UP_QUICK_4x4 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef ARGB_SCALE_NEAREST 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* this version scales up with nearest neighbours - looks crap */ 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectARGB_SCALE_NEAREST( ScaleOp* op ) 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch = op->dst_pitch; 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch = op->src_pitch; 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line = op->dst_line; 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line = op->src_line; 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = op->sx; 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = op->sy; 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ix = op->ix; 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int iy = op->iy; 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int xlimit, ylimit; 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h, sx0; 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8124e61742d4f26cefb1baf8d2dc5e7dc8b85a78549David 'Digit' Turner ARGB_BEGIN; 81322ee8437f45a01c6e1d8e33dd85bb9df18ca1e8bDavid 'Digit' Turner 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the center pixel is at (sx+ix/2, sy+iy/2), we then want to get */ 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* the four nearest source pixels, which are at (0.5,0.5) offsets */ 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx + ix/2 - 32768; 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy = sy + iy/2 - 32768; 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project xlimit = (op->src_w-1); 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ylimit = (op->src_h-1); 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx0 = sx; 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( h = op->rd.h; h > 0; h-- ) { 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst = dst_line; 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_end = dst + 4*op->rd.w; 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = sx0; 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < dst_end; ) { 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int ex1, ex2, ey1, ey2; 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned* p; 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* find the top-left neighbour */ 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex1 = (sx >> 16); 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey1 = (sy >> 16); 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ex2 = ex1+1; 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ey2 = ey1+1; 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex1 < 0) ex1 = 0; else if (ex1 > xlimit) ex1 = xlimit; 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey1 < 0) ey1 = 0; else if (ey1 > ylimit) ey1 = ylimit; 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ex2 < 0) ex2 = 0; else if (ex2 > xlimit) ex2 = xlimit; 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ey2 < 0) ey2 = 0; else if (ey2 > ylimit) ey2 = ylimit; 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = (unsigned*)(src_line + ex1*4 + ey1*src_pitch); 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((sx & 0xffff) >= 32768) 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p += (ex2-ex1); 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ((sy & 0xffff) >= 32768) 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = (unsigned*)((char*)p + (ey2-ey1)*src_pitch); 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *(unsigned*)dst = p[0]; 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx += ix; 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += iy; 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst_line += dst_pitch; 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ARGB_SCALE_NEAREST 863