1 
2 /*
3  * Copyright 2008 The Android Open Source Project
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 #ifndef SkFilter_DEFINED
11 #define SkFilter_DEFINED
12 
13 #include "SkMath.h"
14 #include "SkFixed.h"
15 
16 typedef unsigned (*SkFilterProc)(unsigned x00, unsigned x01,
17                                  unsigned x10, unsigned x11);
18 
19 const SkFilterProc* SkGetBilinearFilterProcTable();
20 
SkGetBilinearFilterProc(const SkFilterProc * table,SkFixed x,SkFixed y)21 inline SkFilterProc SkGetBilinearFilterProc(const SkFilterProc* table,
22                                             SkFixed x, SkFixed y)
23 {
24     SkASSERT(table);
25 
26     // convert to dot 2
27     x = (unsigned)(x << 16) >> 30;
28     y = (unsigned)(y << 16) >> 30;
29     return table[(y << 2) | x];
30 }
31 
SkGetBilinearFilterProc22(const SkFilterProc * table,unsigned x,unsigned y)32 inline SkFilterProc SkGetBilinearFilterProc22(const SkFilterProc* table,
33                                               unsigned x, unsigned y)
34 {
35     SkASSERT(table);
36 
37     // extract low 2 bits
38     x = x << 30 >> 30;
39     y = y << 30 >> 30;
40     return table[(y << 2) | x];
41 }
42 
SkGetBilinearFilterProc22Row(const SkFilterProc * table,unsigned y)43 inline const SkFilterProc* SkGetBilinearFilterProc22Row(const SkFilterProc* table,
44                                                         unsigned y)
45 {
46     SkASSERT(table);
47     // extract low 2 bits and shift up 2
48     return &table[y << 30 >> 28];
49 }
50 
SkGetBilinearFilterProc22RowProc(const SkFilterProc * row,unsigned x)51 inline SkFilterProc SkGetBilinearFilterProc22RowProc(const SkFilterProc* row,
52                                                      unsigned x)
53 {
54     SkASSERT(row);
55     // extract low 2 bits
56     return row[x << 30 >> 30];
57 }
58 
59 ///////////////////////////////////////////////////////////////////////////////
60 
61 typedef unsigned (*SkFilter32Proc)(uint32_t x00, uint32_t x01,
62                                    uint32_t x10, uint32_t x11);
63 
64 const SkFilter32Proc* SkGetFilter32ProcTable();
65 
SkGetFilter32Proc22(const SkFilter32Proc * table,unsigned x,unsigned y)66 inline SkFilter32Proc SkGetFilter32Proc22(const SkFilter32Proc* table,
67                                           unsigned x, unsigned y)
68 {
69     SkASSERT(table);
70 
71     // extract low 2 bits
72     x = x << 30 >> 30;
73     y = y << 30 >> 30;
74     return table[(y << 2) | x];
75 }
76 
SkGetFilter32Proc22Row(const SkFilter32Proc * table,unsigned y)77 inline const SkFilter32Proc* SkGetFilter32Proc22Row(const SkFilter32Proc* table,
78                                                     unsigned y)
79 {
80     SkASSERT(table);
81     // extract low 2 bits and shift up 2
82     return &table[y << 30 >> 28];
83 }
84 
SkGetFilter32Proc22RowProc(const SkFilter32Proc * row,unsigned x)85 inline SkFilter32Proc SkGetFilter32Proc22RowProc(const SkFilter32Proc* row,
86                                                  unsigned x)
87 {
88     SkASSERT(row);
89     // extract low 2 bits
90     return row[x << 30 >> 30];
91 }
92 
93 ///////////////////////////////////////////////////////////////////////////////
94 
95 /** Special version of SkFilterProc. This takes the address of 4 ints, and combines them a byte at a
96     time. AABBCCDD.
97 */
98 typedef uint32_t (*SkFilterPtrProc)(const uint32_t*, const uint32_t*, const uint32_t*, const uint32_t*);
99 
100 const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable();
SkGetBilinearFilterPtrProc(const SkFilterPtrProc * table,SkFixed x,SkFixed y)101 inline SkFilterPtrProc SkGetBilinearFilterPtrProc(const SkFilterPtrProc* table, SkFixed x, SkFixed y)
102 {
103     SkASSERT(table);
104 
105     // convert to dot 2
106     x = (unsigned)(x << 16) >> 30;
107     y = (unsigned)(y << 16) >> 30;
108     return table[(y << 2) | x];
109 }
110 
111 /** Given a Y value, return a subset of the proc table for that value.
112     Pass this to SkGetBilinearFilterPtrXProc with the corresponding X value to get the
113     correct proc.
114 */
SkGetBilinearFilterPtrProcYTable(const SkFilterPtrProc * table,SkFixed y)115 inline const SkFilterPtrProc* SkGetBilinearFilterPtrProcYTable(const SkFilterPtrProc* table, SkFixed y)
116 {
117     SkASSERT(table);
118 
119     y = (unsigned)(y << 16) >> 30;
120     return table + (y << 2);
121 }
122 
123 /** Given a subtable returned by SkGetBilinearFilterPtrProcYTable(), return the proc for the
124     specified X value.
125 */
SkGetBilinearFilterPtrXProc(const SkFilterPtrProc * table,SkFixed x)126 inline SkFilterPtrProc SkGetBilinearFilterPtrXProc(const SkFilterPtrProc* table, SkFixed x)
127 {
128     SkASSERT(table);
129 
130     // convert to dot 2
131     x = (unsigned)(x << 16) >> 30;
132     return table[x];
133 }
134 
135 #endif
136