1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFilterProc.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*  [1-x 1-y] [x 1-y]
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    [1-x   y] [x   y]
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp00(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return a00; }
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp01(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a01) >> 2; }
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp02(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01) >> 1; }
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp03(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a01) >> 2; }
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp10(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * a00 + a10) >> 2; }
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp11(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a00 + 3 * (a01 + a10) + a11) >> 4; }
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp12(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a01) + a10 + a11) >> 3; }
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp13(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a01 + 3 * (a00 + a11) + a10) >> 4; }
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp20(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a10) >> 1; }
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp21(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a00 + a10) + a01 + a11) >> 3; }
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp22(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + a01 + a10 + a11) >> 2; }
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp23(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a01 + a11) + a00 + a10) >> 3; }
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp30(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (a00 + 3 * a10) >> 2; }
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp31(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a10 + 3 * (a00 + a11) + a01) >> 4; }
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp32(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (3 * (a10 + a11) + a00 + a01) >> 3; }
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp33(unsigned a00, unsigned a01, unsigned a10, unsigned a11) { return (9 * a11 + 3 * (a01 + a10) + a00) >> 4; }
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const SkFilterProc gBilerpProcs[4 * 4] = {
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp00, bilerp01, bilerp02, bilerp03,
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp10, bilerp11, bilerp12, bilerp13,
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp20, bilerp21, bilerp22, bilerp23,
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp30, bilerp31, bilerp32, bilerp33
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkFilterProc* SkGetBilinearFilterProcTable()
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gBilerpProcs;
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define MASK            0xFF00FF
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define LO_PAIR(x)      ((x) & MASK)
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define HI_PAIR(x)      (((x) >> 8) & MASK)
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define COMBINE(lo, hi) (((lo) & ~0xFF00) | (((hi) & ~0xFF00) << 8))
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_00(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return c00;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_01(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_02(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_03(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_10(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_11(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_12(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_13(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_20(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_21(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_22(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_23(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_30(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_31(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_32(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic unsigned bilerp4_33(uint32_t c00, uint32_t c01, uint32_t c10, uint32_t c11) {
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const SkFilter32Proc gBilerp32Procs[4 * 4] = {
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp4_00, bilerp4_01, bilerp4_02, bilerp4_03,
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp4_10, bilerp4_11, bilerp4_12, bilerp4_13,
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp4_20, bilerp4_21, bilerp4_22, bilerp4_23,
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerp4_30, bilerp4_31, bilerp4_32, bilerp4_33
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkFilter32Proc* SkGetFilter32ProcTable()
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gBilerp32Procs;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
15455747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr00(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return *a00;
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
15755747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr01(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
159fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    uint32_t c01 = *a01;
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c01)) >> 2;
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c01)) >> 2;
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
16455747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr02(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
166fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    uint32_t c01 = *a01;
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01)) >> 1;
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01)) >> 1;
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
17155747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr03(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c01)) >> 2;
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c01)) >> 2;
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
17955747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr10(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * LO_PAIR(c00) + LO_PAIR(c10)) >> 2;
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * HI_PAIR(c00) + HI_PAIR(c10)) >> 2;
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
18655747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr11(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c00) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c11)) >> 4;
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c00) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c11)) >> 4;
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
19555747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr12(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c01)) + LO_PAIR(c10) + LO_PAIR(c11)) >> 3;
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c01)) + HI_PAIR(c10) + HI_PAIR(c11)) >> 3;
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
20455747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr13(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c01) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c10)) >> 4;
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c01) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c10)) >> 4;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
21455747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr20(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c10)) >> 1;
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c10)) >> 1;
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
22155747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr21(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c00) + LO_PAIR(c10)) + LO_PAIR(c01) + LO_PAIR(c11)) >> 3;
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c00) + HI_PAIR(c10)) + HI_PAIR(c01) + HI_PAIR(c11)) >> 3;
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
23055747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr22(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + LO_PAIR(c01) + LO_PAIR(c10) + LO_PAIR(c11)) >> 2;
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + HI_PAIR(c01) + HI_PAIR(c10) + HI_PAIR(c11)) >> 2;
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
23955747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr23(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c01) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c10)) >> 3;
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c01) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c10)) >> 3;
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
24955747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr30(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (LO_PAIR(c00) + 3 * LO_PAIR(c10)) >> 2;
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (HI_PAIR(c00) + 3 * HI_PAIR(c10)) >> 2;
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
25655747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr31(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c10) + 3 * (LO_PAIR(c00) + LO_PAIR(c11)) + LO_PAIR(c01)) >> 4;
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c10) + 3 * (HI_PAIR(c00) + HI_PAIR(c11)) + HI_PAIR(c01)) >> 4;
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
26555747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr32(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (3 * (LO_PAIR(c10) + LO_PAIR(c11)) + LO_PAIR(c00) + LO_PAIR(c01)) >> 3;
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (3 * (HI_PAIR(c10) + HI_PAIR(c11)) + HI_PAIR(c00) + HI_PAIR(c01)) >> 3;
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
27455747ccdfb889e143f55c9ae67a012a8913efa39agl@chromium.orgstatic uint32_t bilerptr33(const uint32_t* a00, const uint32_t* a01, const uint32_t* a10, const uint32_t* a11) {
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c00 = *a00;
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c01 = *a01;
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c10 = *a10;
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t c11 = *a11;
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t lo = (9 * LO_PAIR(c11) + 3 * (LO_PAIR(c01) + LO_PAIR(c10)) + LO_PAIR(c00)) >> 4;
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t hi = (9 * HI_PAIR(c11) + 3 * (HI_PAIR(c01) + HI_PAIR(c10)) + HI_PAIR(c00)) >> 4;
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return COMBINE(lo, hi);
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic const SkFilterPtrProc gBilerpPtrProcs[4 * 4] = {
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerptr00, bilerptr01, bilerptr02, bilerptr03,
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerptr10, bilerptr11, bilerptr12, bilerptr13,
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerptr20, bilerptr21, bilerptr22, bilerptr23,
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    bilerptr30, bilerptr31, bilerptr32, bilerptr33
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst SkFilterPtrProc* SkGetBilinearFilterPtrProcTable()
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return gBilerpPtrProcs;
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
295