diff options
author | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
---|---|---|
committer | initial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-07-27 00:09:42 +0000 |
commit | ae2c20f398933a9e86c387dcc465ec0f71065ffc (patch) | |
tree | de668b1411e2ee0b4e49b6d8f8b68183134ac990 /skia/sgl/SkBitmapProcState_sample.h | |
parent | 09911bf300f1a419907a9412154760efd0b7abc3 (diff) | |
download | chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.zip chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.gz chromium_src-ae2c20f398933a9e86c387dcc465ec0f71065ffc.tar.bz2 |
Add skia to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/sgl/SkBitmapProcState_sample.h')
-rw-r--r-- | skia/sgl/SkBitmapProcState_sample.h | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/skia/sgl/SkBitmapProcState_sample.h b/skia/sgl/SkBitmapProcState_sample.h new file mode 100644 index 0000000..122ccf8 --- /dev/null +++ b/skia/sgl/SkBitmapProcState_sample.h @@ -0,0 +1,207 @@ + +#if DSTSIZE==32 + #define DSTTYPE SkPMColor +#elif DSTSIZE==16 + #define DSTTYPE uint16_t +#else + #error "need DSTSIZE to be 32 or 16" +#endif + +static void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s, + const uint32_t* SK_RESTRICT xy, + int count, DSTTYPE* SK_RESTRICT colors) { + SkASSERT(count > 0 && colors != NULL); + SkASSERT(s.fDoFilter == false); + SkDEBUGCODE(CHECKSTATE(s);) + +#ifdef PREAMBLE + PREAMBLE(s); +#endif + const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels(); + int i, rb = s.fBitmap->rowBytes(); + + uint32_t XY; + SRCTYPE src; + + for (i = (count >> 1); i > 0; --i) { + XY = *xy++; + SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() && + (XY & 0xFFFF) < (unsigned)s.fBitmap->width()); + src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; + *colors++ = RETURNDST(src); + + XY = *xy++; + SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() && + (XY & 0xFFFF) < (unsigned)s.fBitmap->width()); + src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; + *colors++ = RETURNDST(src); + } + if (count & 1) { + XY = *xy++; + SkASSERT((XY >> 16) < (unsigned)s.fBitmap->height() && + (XY & 0xFFFF) < (unsigned)s.fBitmap->width()); + src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; + *colors++ = RETURNDST(src); + } + +#ifdef POSTAMBLE + POSTAMBLE(s); +#endif +} + +static void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s, + const uint32_t* SK_RESTRICT xy, + int count, DSTTYPE* SK_RESTRICT colors) { + SkASSERT(count > 0 && colors != NULL); + SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)); + SkASSERT(s.fDoFilter == false); + SkDEBUGCODE(CHECKSTATE(s);) + +#ifdef PREAMBLE + PREAMBLE(s); +#endif + const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fBitmap->getPixels(); + int i; + + // bump srcAddr to the proper row, since we're told Y never changes + SkASSERT((unsigned)xy[0] < (unsigned)s.fBitmap->height()); + srcAddr = (const SRCTYPE*)((const char*)srcAddr + + xy[0] * s.fBitmap->rowBytes()); + // buffer is y32, x16, x16, x16, x16, x16 + const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy + 1); + + SRCTYPE src; + + for (i = (count >> 2); i > 0; --i) { + SkASSERT(*xx < (unsigned)s.fBitmap->width()); + src = srcAddr[*xx++]; *colors++ = RETURNDST(src); + + SkASSERT(*xx < (unsigned)s.fBitmap->width()); + src = srcAddr[*xx++]; *colors++ = RETURNDST(src); + + SkASSERT(*xx < (unsigned)s.fBitmap->width()); + src = srcAddr[*xx++]; *colors++ = RETURNDST(src); + + SkASSERT(*xx < (unsigned)s.fBitmap->width()); + src = srcAddr[*xx++]; *colors++ = RETURNDST(src); + } + for (i = (count & 3); i > 0; --i) { + SkASSERT(*xx < (unsigned)s.fBitmap->width()); + src = srcAddr[*xx++]; *colors++ = RETURNDST(src); + } + +#ifdef POSTAMBLE + POSTAMBLE(s); +#endif +} + +/////////////////////////////////////////////////////////////////////////////// + +static void MAKENAME(_filter_DX)(const SkBitmapProcState& s, + const uint32_t* SK_RESTRICT xy, + int count, DSTTYPE* SK_RESTRICT colors) { + SkASSERT(count > 0 && colors != NULL); + SkASSERT(s.fDoFilter); + SkDEBUGCODE(CHECKSTATE(s);) + +#ifdef PREAMBLE + PREAMBLE(s); +#endif + const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels(); + unsigned rb = s.fBitmap->rowBytes(); + unsigned subY; + const SRCTYPE* SK_RESTRICT row0; + const SRCTYPE* SK_RESTRICT row1; + + // setup row ptrs and update proc_table + { + uint32_t XY = *xy++; + unsigned y0 = XY >> 14; + row0 = (const SRCTYPE*)(srcAddr + (y0 >> 4) * rb); + row1 = (const SRCTYPE*)(srcAddr + (XY & 0x3FFF) * rb); + subY = y0 & 0xF; + } + + do { + uint32_t XX = *xy++; // x0:14 | 4 | x1:14 + unsigned x0 = XX >> 14; + unsigned x1 = XX & 0x3FFF; + unsigned subX = x0 & 0xF; + x0 >>= 4; + + uint32_t c = FILTER_PROC(subX, subY, + SRC_TO_FILTER(row0[x0]), + SRC_TO_FILTER(row0[x1]), + SRC_TO_FILTER(row1[x0]), + SRC_TO_FILTER(row1[x1])); + *colors++ = FILTER_TO_DST(c); + + } while (--count != 0); + +#ifdef POSTAMBLE + POSTAMBLE(s); +#endif +} +static void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s, + const uint32_t* SK_RESTRICT xy, + int count, DSTTYPE* SK_RESTRICT colors) { + SkASSERT(count > 0 && colors != NULL); + SkASSERT(s.fDoFilter); + SkDEBUGCODE(CHECKSTATE(s);) + +#ifdef PREAMBLE + PREAMBLE(s); +#endif + const char* SK_RESTRICT srcAddr = (const char*)s.fBitmap->getPixels(); + int rb = s.fBitmap->rowBytes(); + + do { + uint32_t data = *xy++; + unsigned y0 = data >> 14; + unsigned y1 = data & 0x3FFF; + unsigned subY = y0 & 0xF; + y0 >>= 4; + + data = *xy++; + unsigned x0 = data >> 14; + unsigned x1 = data & 0x3FFF; + unsigned subX = x0 & 0xF; + x0 >>= 4; + + const SRCTYPE* SK_RESTRICT row0 = (const SRCTYPE*)(srcAddr + y0 * rb); + const SRCTYPE* SK_RESTRICT row1 = (const SRCTYPE*)(srcAddr + y1 * rb); + + uint32_t c = FILTER_PROC(subX, subY, + SRC_TO_FILTER(row0[x0]), + SRC_TO_FILTER(row0[x1]), + SRC_TO_FILTER(row1[x0]), + SRC_TO_FILTER(row1[x1])); + *colors++ = FILTER_TO_DST(c); + } while (--count != 0); + +#ifdef POSTAMBLE + POSTAMBLE(s); +#endif +} + +#undef MAKENAME +#undef DSTSIZE +#undef DSTTYPE +#undef SRCTYPE +#undef CHECKSTATE +#undef RETURNDST +#undef SRC_TO_FILTER +#undef FILTER_TO_DST + +#ifdef PREAMBLE + #undef PREAMBLE +#endif +#ifdef POSTAMBLE + #undef POSTAMBLE +#endif + +#undef FILTER_PROC_TYPE +#undef GET_FILTER_TABLE +#undef GET_FILTER_ROW +#undef GET_FILTER_ROW_PROC +#undef GET_FILTER_PROC |