Scalar "fast pathing" IDCT.
| 266 | |
| 267 | // Scalar "fast pathing" IDCT. |
| 268 | static void idct(const jpgd_block_t* pSrc_ptr, uint8* pDst_ptr, int block_max_zag) |
| 269 | { |
| 270 | assert(block_max_zag >= 1); |
| 271 | assert(block_max_zag <= 64); |
| 272 | |
| 273 | if (block_max_zag <= 1) |
| 274 | { |
| 275 | int k = ((pSrc_ptr[0] + 4) >> 3) + 128; |
| 276 | k = CLAMP(k); |
| 277 | k = k | (k << 8); |
| 278 | k = k | (k << 16); |
| 279 | |
| 280 | for (int i = 8; i > 0; i--) |
| 281 | { |
| 282 | *(int*)&pDst_ptr[0] = k; |
| 283 | *(int*)&pDst_ptr[4] = k; |
| 284 | pDst_ptr += 8; |
| 285 | } |
| 286 | return; |
| 287 | } |
| 288 | |
| 289 | int temp[64]; |
| 290 | |
| 291 | const jpgd_block_t* pSrc = pSrc_ptr; |
| 292 | int* pTemp = temp; |
| 293 | |
| 294 | const uint8* pRow_tab = &s_idct_row_table[(block_max_zag - 1) * 8]; |
| 295 | int i; |
| 296 | for (i = 8; i > 0; i--, pRow_tab++) |
| 297 | { |
| 298 | switch (*pRow_tab) |
| 299 | { |
| 300 | case 0: Row<0>::idct(pTemp, pSrc); break; |
| 301 | case 1: Row<1>::idct(pTemp, pSrc); break; |
| 302 | case 2: Row<2>::idct(pTemp, pSrc); break; |
| 303 | case 3: Row<3>::idct(pTemp, pSrc); break; |
| 304 | case 4: Row<4>::idct(pTemp, pSrc); break; |
| 305 | case 5: Row<5>::idct(pTemp, pSrc); break; |
| 306 | case 6: Row<6>::idct(pTemp, pSrc); break; |
| 307 | case 7: Row<7>::idct(pTemp, pSrc); break; |
| 308 | case 8: Row<8>::idct(pTemp, pSrc); break; |
| 309 | } |
| 310 | |
| 311 | pSrc += 8; |
| 312 | pTemp += 8; |
| 313 | } |
| 314 | |
| 315 | pTemp = temp; |
| 316 | |
| 317 | const int nonzero_rows = s_idct_col_table[block_max_zag - 1]; |
| 318 | for (i = 8; i > 0; i--) |
| 319 | { |
| 320 | switch (nonzero_rows) |
| 321 | { |
| 322 | case 1: Col<1>::idct(pDst_ptr, pTemp); break; |
| 323 | case 2: Col<2>::idct(pDst_ptr, pTemp); break; |
| 324 | case 3: Col<3>::idct(pDst_ptr, pTemp); break; |
| 325 | case 4: Col<4>::idct(pDst_ptr, pTemp); break; |