180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2006 The Android Open Source Project
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkFilterProc.h"
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*  [1-x 1-y] [x 1-y]
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    [1-x   y] [x   y]
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru*/
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp00(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return a00; }
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp01(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a01) >> 2; }
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp02(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01) >> 1; }
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp03(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a01) >> 2; }
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp10(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a10) >> 2; }
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp11(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a00 + 3 * (a01 + a10) + a11) >> 4; }
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp12(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a01) + a10 + a11) >> 3; }
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp13(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a01 + 3 * (a00 + a11) + a10) >> 4; }
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp20(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a10) >> 1; }
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp21(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a10) + a01 + a11) >> 3; }
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp22(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01 + a10 + a11) >> 2; }
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp23(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a01 + a11) + a00 + a10) >> 3; }
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp30(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a10) >> 2; }
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp31(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a10 + 3 * (a00 + a11) + a01) >> 4; }
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp32(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a10 + a11) + a00 + a01) >> 3; }
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp33(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a11 + 3 * (a01 + a10) + a00) >> 4; }
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkFilterProc gBilerpProcs[4 * 4] = {
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp00, bilerp01, bilerp02, bilerp03,
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp10, bilerp11, bilerp12, bilerp13,
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp20, bilerp21, bilerp22, bilerp23,
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp30, bilerp31, bilerp32, bilerp33
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkFilterProc* SkGetBilinearFilterProcTable()
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gBilerpProcs;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define MASK            0xFF00FF
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define LO_PAIR(x)      ((x) & MASK)
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define HI_PAIR(x)      (((x) >> 8) & MASK)
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define COMBINE(lo, hi) (((lo) & ~0xFF00) | (((hi) & ~0xFF00) << 8))
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_00(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return c00;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_01(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_02(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_03(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_10(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_11(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_12(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_13(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_20(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_21(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_22(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_23(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_30(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_31(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_32(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic unsigned bilerp4_33(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkFilter32Proc gBilerp32Procs[4 * 4] = {
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp4_00, bilerp4_01, bilerp4_02, bilerp4_03,
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp4_10, bilerp4_11, bilerp4_12, bilerp4_13,
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp4_20, bilerp4_21, bilerp4_22, bilerp4_23,
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerp4_30, bilerp4_31, bilerp4_32, bilerp4_33
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkFilter32Proc* SkGetFilter32ProcTable()
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gBilerp32Procs;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr00(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return *a00;
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr01(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr02(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr03(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr10(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr11(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr12(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr13(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr20(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr21(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr22(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr23(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr30(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr31(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr32(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic uint32_t bilerptr33(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c00 = *a00;
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c01 = *a01;
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c10 = *a10;
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t c11 = *a11;
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
28080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
28180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return COMBINE(lo, hi);
28280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
28380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
28480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic const SkFilterPtrProc gBilerpPtrProcs[4 * 4] = {
28580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerptr00, bilerptr01, bilerptr02, bilerptr03,
28680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerptr10, bilerptr11, bilerptr12, bilerptr13,
28780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerptr20, bilerptr21, bilerptr22, bilerptr23,
28880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bilerptr30, bilerptr31, bilerptr32, bilerptr33
28980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
29080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
29180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkFilterPtrProc* SkGetBilinearFilterPtrProcTable()
29280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru{
29380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return gBilerpPtrProcs;
29480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
295