| |
| /* |
| * Copyright 2008 The Android Open Source Project |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #ifndef SkFilter_DEFINED |
| #define SkFilter_DEFINED |
| |
| #include "SkMath.h" |
| #include "SkFixed.h" |
| |
| typedef unsigned (*SkFilterProc)(unsigned x00, unsigned x01, |
| unsigned x10, unsigned x11); |
| |
| const SkFilterProc* SkGetBilinearFilterProcTable(); |
| |
| inline SkFilterProc SkGetBilinearFilterProc(const SkFilterProc* table, |
| SkFixed x, SkFixed y) |
| { |
| SkASSERT(table); |
| |
| // convert to dot 2 |
| x = (unsigned)(x << 16) >> 30; |
| y = (unsigned)(y << 16) >> 30; |
| return table[(y << 2) | x]; |
| } |
| |
| inline SkFilterProc SkGetBilinearFilterProc22(const SkFilterProc* table, |
| unsigned x, unsigned y) |
| { |
| SkASSERT(table); |
| |
| // extract low 2 bits |
| x = x << 30 >> 30; |
| y = y << 30 >> 30; |
| return table[(y << 2) | x]; |
| } |
| |
| inline const SkFilterProc* SkGetBilinearFilterProc22Row(const SkFilterProc* table, |
| unsigned y) |
| { |
| SkASSERT(table); |
| // extract low 2 bits and shift up 2 |
| return &table[y << 30 >> 28]; |
| } |
| |
| inline SkFilterProc SkGetBilinearFilterProc22RowProc(const SkFilterProc* row, |
| unsigned x) |
| { |
| SkASSERT(row); |
| // extract low 2 bits |
| return row[x << 30 >> 30]; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| typedef unsigned (*SkFilter32Proc)(uint32_t x00, uint32_t x01, |
| uint32_t x10, uint32_t x11); |
| |
| const SkFilter32Proc* SkGetFilter32ProcTable(); |
| |
| inline SkFilter32Proc SkGetFilter32Proc22(const SkFilter32Proc* table, |
| unsigned x, unsigned y) |
| { |
| SkASSERT(table); |
| |
| // extract low 2 bits |
| x = x << 30 >> 30; |
| y = y << 30 >> 30; |
| return table[(y << 2) | x]; |
| } |
| |
| inline const SkFilter32Proc* SkGetFilter32Proc22Row(const SkFilter32Proc* table, |
| unsigned y) |
| { |
| SkASSERT(table); |
| // extract low 2 bits and shift up 2 |
| return &table[y << 30 >> 28]; |
| } |
| |
| inline SkFilter32Proc SkGetFilter32Proc22RowProc(const SkFilter32Proc* row, |
| unsigned x) |
| { |
| SkASSERT(row); |
| // extract low 2 bits |
| return row[x << 30 >> 30]; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| /** Special version of SkFilterProc. This takes the address of 4 ints, and combines them a byte at a |
| time. AABBCCDD. |
| */ |
| typedef uint32_t (*SkFilterPtrProc)(const uint32_t*, const uint32_t*, const uint32_t*, const uint32_t*); |
| |
| const SkFilterPtrProc* SkGetBilinearFilterPtrProcTable(); |
| inline SkFilterPtrProc SkGetBilinearFilterPtrProc(const SkFilterPtrProc* table, SkFixed x, SkFixed y) |
| { |
| SkASSERT(table); |
| |
| // convert to dot 2 |
| x = (unsigned)(x << 16) >> 30; |
| y = (unsigned)(y << 16) >> 30; |
| return table[(y << 2) | x]; |
| } |
| |
| /** Given a Y value, return a subset of the proc table for that value. |
| Pass this to SkGetBilinearFilterPtrXProc with the corresponding X value to get the |
| correct proc. |
| */ |
| inline const SkFilterPtrProc* SkGetBilinearFilterPtrProcYTable(const SkFilterPtrProc* table, SkFixed y) |
| { |
| SkASSERT(table); |
| |
| y = (unsigned)(y << 16) >> 30; |
| return table + (y << 2); |
| } |
| |
| /** Given a subtable returned by SkGetBilinearFilterPtrProcYTable(), return the proc for the |
| specified X value. |
| */ |
| inline SkFilterPtrProc SkGetBilinearFilterPtrXProc(const SkFilterPtrProc* table, SkFixed x) |
| { |
| SkASSERT(table); |
| |
| // convert to dot 2 |
| x = (unsigned)(x << 16) >> 30; |
| return table[x]; |
| } |
| |
| #endif |