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