1 /* 2 * Copyright (C) 2006-2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef SkFilter_DEFINED 18 #define SkFilter_DEFINED 19 20 #include "SkMath.h" 21 #include "SkFixed.h" 22 23 typedef unsigned (*SkFilterProc)(unsigned x00, unsigned x01, 24 unsigned x10, unsigned x11); 25 26 const SkFilterProc* SkGetBilinearFilterProcTable(); 27 28 inline SkFilterProc SkGetBilinearFilterProc(const SkFilterProc* table, 29 SkFixed x, SkFixed y) 30 { 31 SkASSERT(table); 32 33 // convert to dot 2 34 x = (unsigned)(x << 16) >> 30; 35 y = (unsigned)(y << 16) >> 30; 36 return table[(y << 2) | x]; 37 } 38 39 inline SkFilterProc SkGetBilinearFilterProc22(const SkFilterProc* table, 40 unsigned x, unsigned y) 41 { 42 SkASSERT(table); 43 44 // extract low 2 bits 45 x = x << 30 >> 30; 46 y = y << 30 >> 30; 47 return table[(y << 2) | x]; 48 } 49 50 inline const SkFilterProc* SkGetBilinearFilterProc22Row(const SkFilterProc* table, 51 unsigned y) 52 { 53 SkASSERT(table); 54 // extract low 2 bits and shift up 2 55 return &table[y << 30 >> 28]; 56 } 57 58 inline SkFilterProc SkGetBilinearFilterProc22RowProc(const SkFilterProc* row, 59 unsigned x) 60 { 61 SkASSERT(row); 62 // extract low 2 bits 63 return row[x << 30 >> 30]; 64 } 65 66 /////////////////////////////////////////////////////////////////////////////// 67 68 typedef unsigned (*SkFilter32Proc)(uint32_t x00, uint32_t x01, 69 uint32_t x10, uint32_t x11); 70 71 const SkFilter32Proc* SkGetFilter32ProcTable(); 72 73 inline SkFilter32Proc SkGetFilter32Proc22(const SkFilter32Proc* table, 74 unsigned x, unsigned y) 75 { 76 SkASSERT(table); 77 78 // extract low 2 bits 79 x = x << 30 >> 30; 80 y = y << 30 >> 30; 81 return table[(y << 2) | x]; 82 } 83 84 inline const SkFilter32Proc* SkGetFilter32Proc22Row(const SkFilter32Proc* table, 85 unsigned y) 86 { 87 SkASSERT(table); 88 // extract low 2 bits and shift up 2 89 return &table[y << 30 >> 28]; 90 } 91 92 inline SkFilter32Proc SkGetFilter32Proc22RowProc(const SkFilter32Proc* row, 93 unsigned x) 94 { 95 SkASSERT(row); 96 // extract low 2 bits 97 return row[x << 30 >> 30]; 98 } 99 100 /////////////////////////////////////////////////////////////////////////////// 101 102 /** Special version of SkFilterProc. This takes the address of 4 ints, and combines them a byte at a 103 time. AABBCCDD. 104 */ 105 typedef uint32_t (*SkFilterPtrProc)(const uint32_t*, const uint32_t*, const uint32_t*, const uint32_t*); 106 107 const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable(); 108 inline SkFilterPtrProc SkGetBilinearFilterPtrProc(const SkFilterPtrProc* table, SkFixed x, SkFixed y) 109 { 110 SkASSERT(table); 111 112 // convert to dot 2 113 x = (unsigned)(x << 16) >> 30; 114 y = (unsigned)(y << 16) >> 30; 115 return table[(y << 2) | x]; 116 } 117 118 /** Given a Y value, return a subset of the proc table for that value. 119 Pass this to SkGetBilinearFilterPtrXProc with the corresponding X value to get the 120 correct proc. 121 */ 122 inline const SkFilterPtrProc* SkGetBilinearFilterPtrProcYTable(const SkFilterPtrProc* table, SkFixed y) 123 { 124 SkASSERT(table); 125 126 y = (unsigned)(y << 16) >> 30; 127 return table + (y << 2); 128 } 129 130 /** Given a subtable returned by SkGetBilinearFilterPtrProcYTable(), return the proc for the 131 specified X value. 132 */ 133 inline SkFilterPtrProc SkGetBilinearFilterPtrXProc(const SkFilterPtrProc* table, SkFixed x) 134 { 135 SkASSERT(table); 136 137 // convert to dot 2 138 x = (unsigned)(x << 16) >> 30; 139 return table[x]; 140 } 141 142 #endif 143 144 145