blob: 3b20d592d2a01060be5f6bb24d609aac58a1bf5a [file] [log] [blame]
/*
* 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