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