1 /* 2 * Copyright 2011 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "SkUtils.h" 9 10 // declare functions externally to suppress warnings. 11 void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s, 12 const uint32_t* SK_RESTRICT xy, 13 int count, SkPMColor* SK_RESTRICT colors); 14 void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s, 15 const uint32_t* SK_RESTRICT xy, 16 int count, SkPMColor* SK_RESTRICT colors); 17 void MAKENAME(_filter_DX)(const SkBitmapProcState& s, 18 const uint32_t* SK_RESTRICT xy, 19 int count, SkPMColor* SK_RESTRICT colors); 20 void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s, 21 const uint32_t* SK_RESTRICT xy, 22 int count, SkPMColor* SK_RESTRICT colors); 23 24 void MAKENAME(_nofilter_DXDY)(const SkBitmapProcState& s, 25 const uint32_t* SK_RESTRICT xy, 26 int count, SkPMColor* SK_RESTRICT colors) { 27 SkASSERT(count > 0 && colors != nullptr); 28 SkASSERT(kNone_SkFilterQuality == s.fFilterQuality); 29 SkDEBUGCODE(CHECKSTATE(s);) 30 31 #ifdef PREAMBLE 32 PREAMBLE(s); 33 #endif 34 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr(); 35 size_t rb = s.fPixmap.rowBytes(); 36 37 uint32_t XY; 38 SRCTYPE src; 39 40 for (int i = (count >> 1); i > 0; --i) { 41 XY = *xy++; 42 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() && 43 (XY & 0xFFFF) < (unsigned)s.fPixmap.width()); 44 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; 45 *colors++ = RETURNDST(src); 46 47 XY = *xy++; 48 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() && 49 (XY & 0xFFFF) < (unsigned)s.fPixmap.width()); 50 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; 51 *colors++ = RETURNDST(src); 52 } 53 if (count & 1) { 54 XY = *xy++; 55 SkASSERT((XY >> 16) < (unsigned)s.fPixmap.height() && 56 (XY & 0xFFFF) < (unsigned)s.fPixmap.width()); 57 src = ((const SRCTYPE*)(srcAddr + (XY >> 16) * rb))[XY & 0xFFFF]; 58 *colors++ = RETURNDST(src); 59 } 60 61 #ifdef POSTAMBLE 62 POSTAMBLE(s); 63 #endif 64 } 65 66 void MAKENAME(_nofilter_DX)(const SkBitmapProcState& s, 67 const uint32_t* SK_RESTRICT xy, 68 int count, SkPMColor* SK_RESTRICT colors) { 69 SkASSERT(count > 0 && colors != nullptr); 70 SkASSERT(s.fInvType <= (SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)); 71 SkASSERT(kNone_SkFilterQuality == s.fFilterQuality); 72 SkDEBUGCODE(CHECKSTATE(s);) 73 74 #ifdef PREAMBLE 75 PREAMBLE(s); 76 #endif 77 const SRCTYPE* SK_RESTRICT srcAddr = (const SRCTYPE*)s.fPixmap.addr(); 78 79 // buffer is y32, x16, x16, x16, x16, x16 80 // bump srcAddr to the proper row, since we're told Y never changes 81 SkASSERT((unsigned)xy[0] < (unsigned)s.fPixmap.height()); 82 srcAddr = (const SRCTYPE*)((const char*)srcAddr + 83 xy[0] * s.fPixmap.rowBytes()); 84 xy += 1; 85 86 SRCTYPE src; 87 88 if (1 == s.fPixmap.width()) { 89 src = srcAddr[0]; 90 SkPMColor dstValue = RETURNDST(src); 91 sk_memset32(colors, dstValue, count); 92 } else { 93 int i; 94 for (i = (count >> 2); i > 0; --i) { 95 uint32_t xx0 = *xy++; 96 uint32_t xx1 = *xy++; 97 SRCTYPE x0 = srcAddr[UNPACK_PRIMARY_SHORT(xx0)]; 98 SRCTYPE x1 = srcAddr[UNPACK_SECONDARY_SHORT(xx0)]; 99 SRCTYPE x2 = srcAddr[UNPACK_PRIMARY_SHORT(xx1)]; 100 SRCTYPE x3 = srcAddr[UNPACK_SECONDARY_SHORT(xx1)]; 101 102 *colors++ = RETURNDST(x0); 103 *colors++ = RETURNDST(x1); 104 *colors++ = RETURNDST(x2); 105 *colors++ = RETURNDST(x3); 106 } 107 const uint16_t* SK_RESTRICT xx = (const uint16_t*)(xy); 108 for (i = (count & 3); i > 0; --i) { 109 SkASSERT(*xx < (unsigned)s.fPixmap.width()); 110 src = srcAddr[*xx++]; *colors++ = RETURNDST(src); 111 } 112 } 113 114 #ifdef POSTAMBLE 115 POSTAMBLE(s); 116 #endif 117 } 118 119 /////////////////////////////////////////////////////////////////////////////// 120 121 void MAKENAME(_filter_DX)(const SkBitmapProcState& s, 122 const uint32_t* SK_RESTRICT xy, 123 int count, SkPMColor* SK_RESTRICT colors) { 124 SkASSERT(count > 0 && colors != nullptr); 125 SkASSERT(s.fFilterQuality != kNone_SkFilterQuality); 126 SkDEBUGCODE(CHECKSTATE(s);) 127 128 #ifdef PREAMBLE 129 PREAMBLE(s); 130 #endif 131 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr(); 132 size_t rb = s.fPixmap.rowBytes(); 133 unsigned subY; 134 const SRCTYPE* SK_RESTRICT row0; 135 const SRCTYPE* SK_RESTRICT row1; 136 137 // setup row ptrs and update proc_table 138 { 139 uint32_t XY = *xy++; 140 unsigned y0 = XY >> 14; 141 row0 = (const SRCTYPE*)(srcAddr + (y0 >> 4) * rb); 142 row1 = (const SRCTYPE*)(srcAddr + (XY & 0x3FFF) * rb); 143 subY = y0 & 0xF; 144 } 145 146 do { 147 uint32_t XX = *xy++; // x0:14 | 4 | x1:14 148 unsigned x0 = XX >> 14; 149 unsigned x1 = XX & 0x3FFF; 150 unsigned subX = x0 & 0xF; 151 x0 >>= 4; 152 153 FILTER_PROC(subX, subY, 154 SRC_TO_FILTER(row0[x0]), 155 SRC_TO_FILTER(row0[x1]), 156 SRC_TO_FILTER(row1[x0]), 157 SRC_TO_FILTER(row1[x1]), 158 colors); 159 colors += 1; 160 161 } while (--count != 0); 162 163 #ifdef POSTAMBLE 164 POSTAMBLE(s); 165 #endif 166 } 167 void MAKENAME(_filter_DXDY)(const SkBitmapProcState& s, 168 const uint32_t* SK_RESTRICT xy, 169 int count, SkPMColor* SK_RESTRICT colors) { 170 SkASSERT(count > 0 && colors != nullptr); 171 SkASSERT(s.fFilterQuality != kNone_SkFilterQuality); 172 SkDEBUGCODE(CHECKSTATE(s);) 173 174 #ifdef PREAMBLE 175 PREAMBLE(s); 176 #endif 177 const char* SK_RESTRICT srcAddr = (const char*)s.fPixmap.addr(); 178 size_t rb = s.fPixmap.rowBytes(); 179 180 do { 181 uint32_t data = *xy++; 182 unsigned y0 = data >> 14; 183 unsigned y1 = data & 0x3FFF; 184 unsigned subY = y0 & 0xF; 185 y0 >>= 4; 186 187 data = *xy++; 188 unsigned x0 = data >> 14; 189 unsigned x1 = data & 0x3FFF; 190 unsigned subX = x0 & 0xF; 191 x0 >>= 4; 192 193 const SRCTYPE* SK_RESTRICT row0 = (const SRCTYPE*)(srcAddr + y0 * rb); 194 const SRCTYPE* SK_RESTRICT row1 = (const SRCTYPE*)(srcAddr + y1 * rb); 195 196 FILTER_PROC(subX, subY, 197 SRC_TO_FILTER(row0[x0]), 198 SRC_TO_FILTER(row0[x1]), 199 SRC_TO_FILTER(row1[x0]), 200 SRC_TO_FILTER(row1[x1]), 201 colors); 202 colors += 1; 203 } while (--count != 0); 204 205 #ifdef POSTAMBLE 206 POSTAMBLE(s); 207 #endif 208 } 209 210 #undef MAKENAME 211 #undef SRCTYPE 212 #undef CHECKSTATE 213 #undef RETURNDST 214 #undef SRC_TO_FILTER 215 #undef FILTER_TO_DST 216 217 #ifdef PREAMBLE 218 #undef PREAMBLE 219 #endif 220 #ifdef POSTAMBLE 221 #undef POSTAMBLE 222 #endif 223 224 #undef FILTER_PROC_TYPE 225 #undef GET_FILTER_TABLE 226 #undef GET_FILTER_ROW 227 #undef GET_FILTER_ROW_PROC 228 #undef GET_FILTER_PROC 229