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 16typedef unsigned (*SkFilterProc)(unsigned x00, unsigned x01, 17 unsigned x10, unsigned x11); 18 19const SkFilterProc* SkGetBilinearFilterProcTable(); 20 21inline 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 32inline 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 43inline 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 51inline 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 61typedef unsigned (*SkFilter32Proc)(uint32_t x00, uint32_t x01, 62 uint32_t x10, uint32_t x11); 63 64const SkFilter32Proc* SkGetFilter32ProcTable(); 65 66inline 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 77inline 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 85inline 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*/ 98typedef uint32_t (*SkFilterPtrProc)(const uint32_t*, const uint32_t*, const uint32_t*, const uint32_t*); 99 100const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable(); 101inline 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*/ 115inline 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*/ 126inline 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