| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
| 6 | |
| 7 #include <limits.h> | |
| 8 | |
| 9 #include "core/include/fxcrt/fx_coordinates.h" | |
| 10 #include "core/include/fxcrt/fx_safe_types.h" | |
| 11 #include "core/src/fxcodec/jbig2/JBig2_Image.h" | |
| 12 | |
| 13 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) { | |
| 14 m_nWidth = w; | |
| 15 m_nHeight = h; | |
| 16 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) { | |
| 17 m_pData = NULL; | |
| 18 m_bNeedFree = FALSE; | |
| 19 return; | |
| 20 } | |
| 21 m_nStride = ((w + 31) >> 5) << 2; | |
| 22 if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) { | |
| 23 m_pData = FX_Alloc2D(uint8_t, m_nStride, m_nHeight); | |
| 24 } else { | |
| 25 m_pData = NULL; | |
| 26 } | |
| 27 m_bNeedFree = TRUE; | |
| 28 } | |
| 29 CJBig2_Image::CJBig2_Image(int32_t w, | |
| 30 int32_t h, | |
| 31 int32_t stride, | |
| 32 uint8_t* pBuf) { | |
| 33 m_nWidth = w; | |
| 34 m_nHeight = h; | |
| 35 m_nStride = stride; | |
| 36 m_pData = pBuf; | |
| 37 m_bNeedFree = FALSE; | |
| 38 } | |
| 39 CJBig2_Image::CJBig2_Image(const CJBig2_Image& im) { | |
| 40 m_nWidth = im.m_nWidth; | |
| 41 m_nHeight = im.m_nHeight; | |
| 42 m_nStride = im.m_nStride; | |
| 43 if (im.m_pData) { | |
| 44 m_pData = FX_Alloc2D(uint8_t, m_nStride, m_nHeight); | |
| 45 JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight); | |
| 46 } else { | |
| 47 m_pData = NULL; | |
| 48 } | |
| 49 m_bNeedFree = TRUE; | |
| 50 } | |
| 51 CJBig2_Image::~CJBig2_Image() { | |
| 52 if (m_bNeedFree) { | |
| 53 FX_Free(m_pData); | |
| 54 } | |
| 55 } | |
| 56 FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) { | |
| 57 if (!m_pData) { | |
| 58 return 0; | |
| 59 } | |
| 60 int32_t m, n; | |
| 61 if (x < 0 || x >= m_nWidth) { | |
| 62 return 0; | |
| 63 } | |
| 64 if (y < 0 || y >= m_nHeight) { | |
| 65 return 0; | |
| 66 } | |
| 67 m = y * m_nStride + (x >> 3); | |
| 68 n = x & 7; | |
| 69 return ((m_pData[m] >> (7 - n)) & 1); | |
| 70 } | |
| 71 | |
| 72 int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) { | |
| 73 if (!m_pData) { | |
| 74 return 0; | |
| 75 } | |
| 76 int32_t m, n; | |
| 77 if (x < 0 || x >= m_nWidth) { | |
| 78 return 0; | |
| 79 } | |
| 80 if (y < 0 || y >= m_nHeight) { | |
| 81 return 0; | |
| 82 } | |
| 83 m = y * m_nStride + (x >> 3); | |
| 84 n = x & 7; | |
| 85 if (v) { | |
| 86 m_pData[m] |= 1 << (7 - n); | |
| 87 } else { | |
| 88 m_pData[m] &= ~(1 << (7 - n)); | |
| 89 } | |
| 90 return 1; | |
| 91 } | |
| 92 void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom) { | |
| 93 if (!m_pData) { | |
| 94 return; | |
| 95 } | |
| 96 if (hFrom < 0 || hFrom >= m_nHeight) { | |
| 97 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride); | |
| 98 } else { | |
| 99 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, | |
| 100 m_nStride); | |
| 101 } | |
| 102 } | |
| 103 void CJBig2_Image::fill(FX_BOOL v) { | |
| 104 if (!m_pData) { | |
| 105 return; | |
| 106 } | |
| 107 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight); | |
| 108 } | |
| 109 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, | |
| 110 int32_t x, | |
| 111 int32_t y, | |
| 112 JBig2ComposeOp op) { | |
| 113 if (!m_pData) { | |
| 114 return FALSE; | |
| 115 } | |
| 116 return composeTo_opt2(pDst, x, y, op); | |
| 117 } | |
| 118 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, | |
| 119 int32_t x, | |
| 120 int32_t y, | |
| 121 JBig2ComposeOp op, | |
| 122 const FX_RECT* pSrcRect) { | |
| 123 if (!m_pData) { | |
| 124 return FALSE; | |
| 125 } | |
| 126 if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) { | |
| 127 return composeTo_opt2(pDst, x, y, op); | |
| 128 } | |
| 129 return composeTo_opt2(pDst, x, y, op, pSrcRect); | |
| 130 } | |
| 131 | |
| 132 FX_BOOL CJBig2_Image::composeFrom(int32_t x, | |
| 133 int32_t y, | |
| 134 CJBig2_Image* pSrc, | |
| 135 JBig2ComposeOp op) { | |
| 136 if (!m_pData) { | |
| 137 return FALSE; | |
| 138 } | |
| 139 return pSrc->composeTo(this, x, y, op); | |
| 140 } | |
| 141 FX_BOOL CJBig2_Image::composeFrom(int32_t x, | |
| 142 int32_t y, | |
| 143 CJBig2_Image* pSrc, | |
| 144 JBig2ComposeOp op, | |
| 145 const FX_RECT* pSrcRect) { | |
| 146 if (!m_pData) { | |
| 147 return FALSE; | |
| 148 } | |
| 149 return pSrc->composeTo(this, x, y, op, pSrcRect); | |
| 150 } | |
| 151 #define JBIG2_GETDWORD(buf) \ | |
| 152 ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) | |
| 153 CJBig2_Image* CJBig2_Image::subImage(int32_t x, | |
| 154 int32_t y, | |
| 155 int32_t w, | |
| 156 int32_t h) { | |
| 157 int32_t m, n, j; | |
| 158 uint8_t *pLineSrc, *pLineDst; | |
| 159 FX_DWORD wTmp; | |
| 160 uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd; | |
| 161 if (w == 0 || h == 0) { | |
| 162 return NULL; | |
| 163 } | |
| 164 CJBig2_Image* pImage = new CJBig2_Image(w, h); | |
| 165 if (!m_pData) { | |
| 166 pImage->fill(0); | |
| 167 return pImage; | |
| 168 } | |
| 169 if (!pImage->m_pData) { | |
| 170 return pImage; | |
| 171 } | |
| 172 pLineSrc = m_pData + m_nStride * y; | |
| 173 pLineDst = pImage->m_pData; | |
| 174 m = (x >> 5) << 2; | |
| 175 n = x & 31; | |
| 176 if (n == 0) { | |
| 177 for (j = 0; j < h; j++) { | |
| 178 pSrc = pLineSrc + m; | |
| 179 pSrcEnd = pLineSrc + m_nStride; | |
| 180 pDst = pLineDst; | |
| 181 pDstEnd = pLineDst + pImage->m_nStride; | |
| 182 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { | |
| 183 *((FX_DWORD*)pDst) = *((FX_DWORD*)pSrc); | |
| 184 } | |
| 185 pLineSrc += m_nStride; | |
| 186 pLineDst += pImage->m_nStride; | |
| 187 } | |
| 188 } else { | |
| 189 for (j = 0; j < h; j++) { | |
| 190 pSrc = pLineSrc + m; | |
| 191 pSrcEnd = pLineSrc + m_nStride; | |
| 192 pDst = pLineDst; | |
| 193 pDstEnd = pLineDst + pImage->m_nStride; | |
| 194 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { | |
| 195 if (pSrc + 4 < pSrcEnd) { | |
| 196 wTmp = (JBIG2_GETDWORD(pSrc) << n) | | |
| 197 (JBIG2_GETDWORD(pSrc + 4) >> (32 - n)); | |
| 198 } else { | |
| 199 wTmp = JBIG2_GETDWORD(pSrc) << n; | |
| 200 } | |
| 201 pDst[0] = (uint8_t)(wTmp >> 24); | |
| 202 pDst[1] = (uint8_t)(wTmp >> 16); | |
| 203 pDst[2] = (uint8_t)(wTmp >> 8); | |
| 204 pDst[3] = (uint8_t)wTmp; | |
| 205 } | |
| 206 pLineSrc += m_nStride; | |
| 207 pLineDst += pImage->m_nStride; | |
| 208 } | |
| 209 } | |
| 210 return pImage; | |
| 211 } | |
| 212 void CJBig2_Image::expand(int32_t h, FX_BOOL v) { | |
| 213 if (!m_pData || h <= m_nHeight) { | |
| 214 return; | |
| 215 } | |
| 216 FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h); | |
| 217 FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride); | |
| 218 FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight); | |
| 219 FX_SAFE_DWORD safeMemSize = dwH; | |
| 220 safeMemSize *= dwStride; | |
| 221 if (!safeMemSize.IsValid()) { | |
| 222 return; | |
| 223 } | |
| 224 // The guaranteed reallocated memory is to be < 4GB (unsigned int). | |
| 225 m_pData = FX_Realloc(uint8_t, m_pData, safeMemSize.ValueOrDie()); | |
| 226 | |
| 227 // The result of dwHeight * dwStride doesn't overflow after the | |
| 228 // checking of safeMemSize. | |
| 229 // The same as the result of (dwH - dwHeight) * dwStride) because | |
| 230 // dwH - dwHeight is always less than dwH(h) which is checked in | |
| 231 // the calculation of dwH * dwStride. | |
| 232 JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, | |
| 233 (dwH - dwHeight) * dwStride); | |
| 234 m_nHeight = h; | |
| 235 } | |
| 236 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, | |
| 237 int32_t x, | |
| 238 int32_t y, | |
| 239 JBig2ComposeOp op) { | |
| 240 int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0, | |
| 241 yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0; | |
| 242 | |
| 243 FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, tmp = 0, | |
| 244 tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0; | |
| 245 | |
| 246 uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL; | |
| 247 | |
| 248 if (!m_pData) { | |
| 249 return FALSE; | |
| 250 } | |
| 251 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { | |
| 252 return FALSE; | |
| 253 } | |
| 254 if (y < 0) { | |
| 255 ys0 = -y; | |
| 256 } | |
| 257 if (y + m_nHeight > pDst->m_nHeight) { | |
| 258 ys1 = pDst->m_nHeight - y; | |
| 259 } else { | |
| 260 ys1 = m_nHeight; | |
| 261 } | |
| 262 if (x < 0) { | |
| 263 xs0 = -x; | |
| 264 } | |
| 265 if (x + m_nWidth > pDst->m_nWidth) { | |
| 266 xs1 = pDst->m_nWidth - x; | |
| 267 } else { | |
| 268 xs1 = m_nWidth; | |
| 269 } | |
| 270 if ((ys0 >= ys1) || (xs0 >= xs1)) { | |
| 271 return 0; | |
| 272 } | |
| 273 w = xs1 - xs0; | |
| 274 h = ys1 - ys0; | |
| 275 if (y >= 0) { | |
| 276 yd0 = y; | |
| 277 } | |
| 278 if (x >= 0) { | |
| 279 xd0 = x; | |
| 280 } | |
| 281 xd1 = xd0 + w; | |
| 282 yd1 = yd0 + h; | |
| 283 d1 = xd0 & 31; | |
| 284 d2 = xd1 & 31; | |
| 285 s1 = xs0 & 31; | |
| 286 maskL = 0xffffffff >> d1; | |
| 287 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); | |
| 288 maskM = maskL & maskR; | |
| 289 lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2); | |
| 290 lineLeft = m_nStride - ((xs0 >> 5) << 2); | |
| 291 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); | |
| 292 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { | |
| 293 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { | |
| 294 if (s1 > d1) { | |
| 295 shift = s1 - d1; | |
| 296 for (yy = yd0; yy < yd1; yy++) { | |
| 297 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; | |
| 298 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 299 switch (op) { | |
| 300 case JBIG2_COMPOSE_OR: | |
| 301 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 302 break; | |
| 303 case JBIG2_COMPOSE_AND: | |
| 304 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 305 break; | |
| 306 case JBIG2_COMPOSE_XOR: | |
| 307 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 308 break; | |
| 309 case JBIG2_COMPOSE_XNOR: | |
| 310 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 311 break; | |
| 312 case JBIG2_COMPOSE_REPLACE: | |
| 313 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 314 break; | |
| 315 } | |
| 316 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 317 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 318 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 319 lineDst[3] = (uint8_t)tmp; | |
| 320 lineSrc += m_nStride; | |
| 321 lineDst += pDst->m_nStride; | |
| 322 } | |
| 323 } else { | |
| 324 shift = d1 - s1; | |
| 325 for (yy = yd0; yy < yd1; yy++) { | |
| 326 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; | |
| 327 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 328 switch (op) { | |
| 329 case JBIG2_COMPOSE_OR: | |
| 330 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 331 break; | |
| 332 case JBIG2_COMPOSE_AND: | |
| 333 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 334 break; | |
| 335 case JBIG2_COMPOSE_XOR: | |
| 336 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 337 break; | |
| 338 case JBIG2_COMPOSE_XNOR: | |
| 339 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 340 break; | |
| 341 case JBIG2_COMPOSE_REPLACE: | |
| 342 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 343 break; | |
| 344 } | |
| 345 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 346 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 347 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 348 lineDst[3] = (uint8_t)tmp; | |
| 349 lineSrc += m_nStride; | |
| 350 lineDst += pDst->m_nStride; | |
| 351 } | |
| 352 } | |
| 353 } else { | |
| 354 shift1 = s1 - d1; | |
| 355 shift2 = 32 - shift1; | |
| 356 for (yy = yd0; yy < yd1; yy++) { | |
| 357 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | | |
| 358 (JBIG2_GETDWORD(lineSrc + 4) >> shift2); | |
| 359 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 360 switch (op) { | |
| 361 case JBIG2_COMPOSE_OR: | |
| 362 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 363 break; | |
| 364 case JBIG2_COMPOSE_AND: | |
| 365 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 366 break; | |
| 367 case JBIG2_COMPOSE_XOR: | |
| 368 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 369 break; | |
| 370 case JBIG2_COMPOSE_XNOR: | |
| 371 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 372 break; | |
| 373 case JBIG2_COMPOSE_REPLACE: | |
| 374 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 375 break; | |
| 376 } | |
| 377 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 378 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 379 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 380 lineDst[3] = (uint8_t)tmp; | |
| 381 lineSrc += m_nStride; | |
| 382 lineDst += pDst->m_nStride; | |
| 383 } | |
| 384 } | |
| 385 } else { | |
| 386 if (s1 > d1) { | |
| 387 shift1 = s1 - d1; | |
| 388 shift2 = 32 - shift1; | |
| 389 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 390 for (yy = yd0; yy < yd1; yy++) { | |
| 391 sp = lineSrc; | |
| 392 dp = lineDst; | |
| 393 if (d1 != 0) { | |
| 394 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | | |
| 395 (JBIG2_GETDWORD(sp + 4) >> shift2); | |
| 396 tmp2 = JBIG2_GETDWORD(dp); | |
| 397 switch (op) { | |
| 398 case JBIG2_COMPOSE_OR: | |
| 399 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 400 break; | |
| 401 case JBIG2_COMPOSE_AND: | |
| 402 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 403 break; | |
| 404 case JBIG2_COMPOSE_XOR: | |
| 405 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 406 break; | |
| 407 case JBIG2_COMPOSE_XNOR: | |
| 408 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 409 break; | |
| 410 case JBIG2_COMPOSE_REPLACE: | |
| 411 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 412 break; | |
| 413 } | |
| 414 dp[0] = (uint8_t)(tmp >> 24); | |
| 415 dp[1] = (uint8_t)(tmp >> 16); | |
| 416 dp[2] = (uint8_t)(tmp >> 8); | |
| 417 dp[3] = (uint8_t)tmp; | |
| 418 sp += 4; | |
| 419 dp += 4; | |
| 420 } | |
| 421 for (xx = 0; xx < middleDwords; xx++) { | |
| 422 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | | |
| 423 (JBIG2_GETDWORD(sp + 4) >> shift2); | |
| 424 tmp2 = JBIG2_GETDWORD(dp); | |
| 425 switch (op) { | |
| 426 case JBIG2_COMPOSE_OR: | |
| 427 tmp = tmp1 | tmp2; | |
| 428 break; | |
| 429 case JBIG2_COMPOSE_AND: | |
| 430 tmp = tmp1 & tmp2; | |
| 431 break; | |
| 432 case JBIG2_COMPOSE_XOR: | |
| 433 tmp = tmp1 ^ tmp2; | |
| 434 break; | |
| 435 case JBIG2_COMPOSE_XNOR: | |
| 436 tmp = ~(tmp1 ^ tmp2); | |
| 437 break; | |
| 438 case JBIG2_COMPOSE_REPLACE: | |
| 439 tmp = tmp1; | |
| 440 break; | |
| 441 } | |
| 442 dp[0] = (uint8_t)(tmp >> 24); | |
| 443 dp[1] = (uint8_t)(tmp >> 16); | |
| 444 dp[2] = (uint8_t)(tmp >> 8); | |
| 445 dp[3] = (uint8_t)tmp; | |
| 446 sp += 4; | |
| 447 dp += 4; | |
| 448 } | |
| 449 if (d2 != 0) { | |
| 450 tmp1 = | |
| 451 (JBIG2_GETDWORD(sp) << shift1) | | |
| 452 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> | |
| 453 shift2); | |
| 454 tmp2 = JBIG2_GETDWORD(dp); | |
| 455 switch (op) { | |
| 456 case JBIG2_COMPOSE_OR: | |
| 457 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 458 break; | |
| 459 case JBIG2_COMPOSE_AND: | |
| 460 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 461 break; | |
| 462 case JBIG2_COMPOSE_XOR: | |
| 463 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 464 break; | |
| 465 case JBIG2_COMPOSE_XNOR: | |
| 466 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 467 break; | |
| 468 case JBIG2_COMPOSE_REPLACE: | |
| 469 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 470 break; | |
| 471 } | |
| 472 dp[0] = (uint8_t)(tmp >> 24); | |
| 473 dp[1] = (uint8_t)(tmp >> 16); | |
| 474 dp[2] = (uint8_t)(tmp >> 8); | |
| 475 dp[3] = (uint8_t)tmp; | |
| 476 } | |
| 477 lineSrc += m_nStride; | |
| 478 lineDst += pDst->m_nStride; | |
| 479 } | |
| 480 } else if (s1 == d1) { | |
| 481 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 482 for (yy = yd0; yy < yd1; yy++) { | |
| 483 sp = lineSrc; | |
| 484 dp = lineDst; | |
| 485 if (d1 != 0) { | |
| 486 tmp1 = JBIG2_GETDWORD(sp); | |
| 487 tmp2 = JBIG2_GETDWORD(dp); | |
| 488 switch (op) { | |
| 489 case JBIG2_COMPOSE_OR: | |
| 490 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 491 break; | |
| 492 case JBIG2_COMPOSE_AND: | |
| 493 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 494 break; | |
| 495 case JBIG2_COMPOSE_XOR: | |
| 496 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 497 break; | |
| 498 case JBIG2_COMPOSE_XNOR: | |
| 499 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 500 break; | |
| 501 case JBIG2_COMPOSE_REPLACE: | |
| 502 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 503 break; | |
| 504 } | |
| 505 dp[0] = (uint8_t)(tmp >> 24); | |
| 506 dp[1] = (uint8_t)(tmp >> 16); | |
| 507 dp[2] = (uint8_t)(tmp >> 8); | |
| 508 dp[3] = (uint8_t)tmp; | |
| 509 sp += 4; | |
| 510 dp += 4; | |
| 511 } | |
| 512 for (xx = 0; xx < middleDwords; xx++) { | |
| 513 tmp1 = JBIG2_GETDWORD(sp); | |
| 514 tmp2 = JBIG2_GETDWORD(dp); | |
| 515 switch (op) { | |
| 516 case JBIG2_COMPOSE_OR: | |
| 517 tmp = tmp1 | tmp2; | |
| 518 break; | |
| 519 case JBIG2_COMPOSE_AND: | |
| 520 tmp = tmp1 & tmp2; | |
| 521 break; | |
| 522 case JBIG2_COMPOSE_XOR: | |
| 523 tmp = tmp1 ^ tmp2; | |
| 524 break; | |
| 525 case JBIG2_COMPOSE_XNOR: | |
| 526 tmp = ~(tmp1 ^ tmp2); | |
| 527 break; | |
| 528 case JBIG2_COMPOSE_REPLACE: | |
| 529 tmp = tmp1; | |
| 530 break; | |
| 531 } | |
| 532 dp[0] = (uint8_t)(tmp >> 24); | |
| 533 dp[1] = (uint8_t)(tmp >> 16); | |
| 534 dp[2] = (uint8_t)(tmp >> 8); | |
| 535 dp[3] = (uint8_t)tmp; | |
| 536 sp += 4; | |
| 537 dp += 4; | |
| 538 } | |
| 539 if (d2 != 0) { | |
| 540 tmp1 = JBIG2_GETDWORD(sp); | |
| 541 tmp2 = JBIG2_GETDWORD(dp); | |
| 542 switch (op) { | |
| 543 case JBIG2_COMPOSE_OR: | |
| 544 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 545 break; | |
| 546 case JBIG2_COMPOSE_AND: | |
| 547 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 548 break; | |
| 549 case JBIG2_COMPOSE_XOR: | |
| 550 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 551 break; | |
| 552 case JBIG2_COMPOSE_XNOR: | |
| 553 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 554 break; | |
| 555 case JBIG2_COMPOSE_REPLACE: | |
| 556 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 557 break; | |
| 558 } | |
| 559 dp[0] = (uint8_t)(tmp >> 24); | |
| 560 dp[1] = (uint8_t)(tmp >> 16); | |
| 561 dp[2] = (uint8_t)(tmp >> 8); | |
| 562 dp[3] = (uint8_t)tmp; | |
| 563 } | |
| 564 lineSrc += m_nStride; | |
| 565 lineDst += pDst->m_nStride; | |
| 566 } | |
| 567 } else { | |
| 568 shift1 = d1 - s1; | |
| 569 shift2 = 32 - shift1; | |
| 570 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 571 for (yy = yd0; yy < yd1; yy++) { | |
| 572 sp = lineSrc; | |
| 573 dp = lineDst; | |
| 574 if (d1 != 0) { | |
| 575 tmp1 = JBIG2_GETDWORD(sp) >> shift1; | |
| 576 tmp2 = JBIG2_GETDWORD(dp); | |
| 577 switch (op) { | |
| 578 case JBIG2_COMPOSE_OR: | |
| 579 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 580 break; | |
| 581 case JBIG2_COMPOSE_AND: | |
| 582 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 583 break; | |
| 584 case JBIG2_COMPOSE_XOR: | |
| 585 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 586 break; | |
| 587 case JBIG2_COMPOSE_XNOR: | |
| 588 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 589 break; | |
| 590 case JBIG2_COMPOSE_REPLACE: | |
| 591 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 592 break; | |
| 593 } | |
| 594 dp[0] = (uint8_t)(tmp >> 24); | |
| 595 dp[1] = (uint8_t)(tmp >> 16); | |
| 596 dp[2] = (uint8_t)(tmp >> 8); | |
| 597 dp[3] = (uint8_t)tmp; | |
| 598 dp += 4; | |
| 599 } | |
| 600 for (xx = 0; xx < middleDwords; xx++) { | |
| 601 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | | |
| 602 ((JBIG2_GETDWORD(sp + 4)) >> shift1); | |
| 603 tmp2 = JBIG2_GETDWORD(dp); | |
| 604 switch (op) { | |
| 605 case JBIG2_COMPOSE_OR: | |
| 606 tmp = tmp1 | tmp2; | |
| 607 break; | |
| 608 case JBIG2_COMPOSE_AND: | |
| 609 tmp = tmp1 & tmp2; | |
| 610 break; | |
| 611 case JBIG2_COMPOSE_XOR: | |
| 612 tmp = tmp1 ^ tmp2; | |
| 613 break; | |
| 614 case JBIG2_COMPOSE_XNOR: | |
| 615 tmp = ~(tmp1 ^ tmp2); | |
| 616 break; | |
| 617 case JBIG2_COMPOSE_REPLACE: | |
| 618 tmp = tmp1; | |
| 619 break; | |
| 620 } | |
| 621 dp[0] = (uint8_t)(tmp >> 24); | |
| 622 dp[1] = (uint8_t)(tmp >> 16); | |
| 623 dp[2] = (uint8_t)(tmp >> 8); | |
| 624 dp[3] = (uint8_t)tmp; | |
| 625 sp += 4; | |
| 626 dp += 4; | |
| 627 } | |
| 628 if (d2 != 0) { | |
| 629 tmp1 = | |
| 630 (JBIG2_GETDWORD(sp) << shift2) | | |
| 631 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> | |
| 632 shift1); | |
| 633 tmp2 = JBIG2_GETDWORD(dp); | |
| 634 switch (op) { | |
| 635 case JBIG2_COMPOSE_OR: | |
| 636 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 637 break; | |
| 638 case JBIG2_COMPOSE_AND: | |
| 639 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 640 break; | |
| 641 case JBIG2_COMPOSE_XOR: | |
| 642 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 643 break; | |
| 644 case JBIG2_COMPOSE_XNOR: | |
| 645 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 646 break; | |
| 647 case JBIG2_COMPOSE_REPLACE: | |
| 648 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 649 break; | |
| 650 } | |
| 651 dp[0] = (uint8_t)(tmp >> 24); | |
| 652 dp[1] = (uint8_t)(tmp >> 16); | |
| 653 dp[2] = (uint8_t)(tmp >> 8); | |
| 654 dp[3] = (uint8_t)tmp; | |
| 655 } | |
| 656 lineSrc += m_nStride; | |
| 657 lineDst += pDst->m_nStride; | |
| 658 } | |
| 659 } | |
| 660 } | |
| 661 return 1; | |
| 662 } | |
| 663 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, | |
| 664 int32_t x, | |
| 665 int32_t y, | |
| 666 JBig2ComposeOp op, | |
| 667 const FX_RECT* pSrcRect) { | |
| 668 int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, | |
| 669 lineLeft; | |
| 670 FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, | |
| 671 maskM; | |
| 672 uint8_t *lineSrc, *lineDst, *sp, *dp; | |
| 673 int32_t sw, sh; | |
| 674 if (!m_pData) { | |
| 675 return FALSE; | |
| 676 } | |
| 677 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { | |
| 678 return FALSE; | |
| 679 } | |
| 680 sw = pSrcRect->Width(); | |
| 681 sh = pSrcRect->Height(); | |
| 682 if (y < 0) { | |
| 683 ys0 = -y; | |
| 684 } else { | |
| 685 ys0 = 0; | |
| 686 } | |
| 687 if (y + sh > pDst->m_nHeight) { | |
| 688 ys1 = pDst->m_nHeight - y; | |
| 689 } else { | |
| 690 ys1 = sh; | |
| 691 } | |
| 692 if (x < 0) { | |
| 693 xs0 = -x; | |
| 694 } else { | |
| 695 xs0 = 0; | |
| 696 } | |
| 697 if (x + sw > pDst->m_nWidth) { | |
| 698 xs1 = pDst->m_nWidth - x; | |
| 699 } else { | |
| 700 xs1 = sw; | |
| 701 } | |
| 702 if ((ys0 >= ys1) || (xs0 >= xs1)) { | |
| 703 return 0; | |
| 704 } | |
| 705 w = xs1 - xs0; | |
| 706 h = ys1 - ys0; | |
| 707 if (y < 0) { | |
| 708 yd0 = 0; | |
| 709 } else { | |
| 710 yd0 = y; | |
| 711 } | |
| 712 if (x < 0) { | |
| 713 xd0 = 0; | |
| 714 } else { | |
| 715 xd0 = x; | |
| 716 } | |
| 717 xd1 = xd0 + w; | |
| 718 yd1 = yd0 + h; | |
| 719 d1 = xd0 & 31; | |
| 720 d2 = xd1 & 31; | |
| 721 s1 = xs0 & 31; | |
| 722 maskL = 0xffffffff >> d1; | |
| 723 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); | |
| 724 maskM = maskL & maskR; | |
| 725 lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + | |
| 726 (((xs0 + pSrcRect->left) >> 5) << 2); | |
| 727 lineLeft = m_nStride - ((xs0 >> 5) << 2); | |
| 728 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); | |
| 729 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { | |
| 730 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { | |
| 731 if (s1 > d1) { | |
| 732 shift = s1 - d1; | |
| 733 for (yy = yd0; yy < yd1; yy++) { | |
| 734 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; | |
| 735 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 736 switch (op) { | |
| 737 case JBIG2_COMPOSE_OR: | |
| 738 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 739 break; | |
| 740 case JBIG2_COMPOSE_AND: | |
| 741 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 742 break; | |
| 743 case JBIG2_COMPOSE_XOR: | |
| 744 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 745 break; | |
| 746 case JBIG2_COMPOSE_XNOR: | |
| 747 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 748 break; | |
| 749 case JBIG2_COMPOSE_REPLACE: | |
| 750 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 751 break; | |
| 752 } | |
| 753 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 754 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 755 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 756 lineDst[3] = (uint8_t)tmp; | |
| 757 lineSrc += m_nStride; | |
| 758 lineDst += pDst->m_nStride; | |
| 759 } | |
| 760 } else { | |
| 761 shift = d1 - s1; | |
| 762 for (yy = yd0; yy < yd1; yy++) { | |
| 763 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; | |
| 764 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 765 switch (op) { | |
| 766 case JBIG2_COMPOSE_OR: | |
| 767 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 768 break; | |
| 769 case JBIG2_COMPOSE_AND: | |
| 770 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 771 break; | |
| 772 case JBIG2_COMPOSE_XOR: | |
| 773 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 774 break; | |
| 775 case JBIG2_COMPOSE_XNOR: | |
| 776 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 777 break; | |
| 778 case JBIG2_COMPOSE_REPLACE: | |
| 779 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 780 break; | |
| 781 } | |
| 782 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 783 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 784 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 785 lineDst[3] = (uint8_t)tmp; | |
| 786 lineSrc += m_nStride; | |
| 787 lineDst += pDst->m_nStride; | |
| 788 } | |
| 789 } | |
| 790 } else { | |
| 791 shift1 = s1 - d1; | |
| 792 shift2 = 32 - shift1; | |
| 793 for (yy = yd0; yy < yd1; yy++) { | |
| 794 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | | |
| 795 (JBIG2_GETDWORD(lineSrc + 4) >> shift2); | |
| 796 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 797 switch (op) { | |
| 798 case JBIG2_COMPOSE_OR: | |
| 799 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 800 break; | |
| 801 case JBIG2_COMPOSE_AND: | |
| 802 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 803 break; | |
| 804 case JBIG2_COMPOSE_XOR: | |
| 805 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 806 break; | |
| 807 case JBIG2_COMPOSE_XNOR: | |
| 808 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 809 break; | |
| 810 case JBIG2_COMPOSE_REPLACE: | |
| 811 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 812 break; | |
| 813 } | |
| 814 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 815 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 816 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 817 lineDst[3] = (uint8_t)tmp; | |
| 818 lineSrc += m_nStride; | |
| 819 lineDst += pDst->m_nStride; | |
| 820 } | |
| 821 } | |
| 822 } else { | |
| 823 if (s1 > d1) { | |
| 824 shift1 = s1 - d1; | |
| 825 shift2 = 32 - shift1; | |
| 826 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 827 for (yy = yd0; yy < yd1; yy++) { | |
| 828 sp = lineSrc; | |
| 829 dp = lineDst; | |
| 830 if (d1 != 0) { | |
| 831 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | | |
| 832 (JBIG2_GETDWORD(sp + 4) >> shift2); | |
| 833 tmp2 = JBIG2_GETDWORD(dp); | |
| 834 switch (op) { | |
| 835 case JBIG2_COMPOSE_OR: | |
| 836 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 837 break; | |
| 838 case JBIG2_COMPOSE_AND: | |
| 839 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 840 break; | |
| 841 case JBIG2_COMPOSE_XOR: | |
| 842 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 843 break; | |
| 844 case JBIG2_COMPOSE_XNOR: | |
| 845 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 846 break; | |
| 847 case JBIG2_COMPOSE_REPLACE: | |
| 848 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 849 break; | |
| 850 } | |
| 851 dp[0] = (uint8_t)(tmp >> 24); | |
| 852 dp[1] = (uint8_t)(tmp >> 16); | |
| 853 dp[2] = (uint8_t)(tmp >> 8); | |
| 854 dp[3] = (uint8_t)tmp; | |
| 855 sp += 4; | |
| 856 dp += 4; | |
| 857 } | |
| 858 for (xx = 0; xx < middleDwords; xx++) { | |
| 859 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | | |
| 860 (JBIG2_GETDWORD(sp + 4) >> shift2); | |
| 861 tmp2 = JBIG2_GETDWORD(dp); | |
| 862 switch (op) { | |
| 863 case JBIG2_COMPOSE_OR: | |
| 864 tmp = tmp1 | tmp2; | |
| 865 break; | |
| 866 case JBIG2_COMPOSE_AND: | |
| 867 tmp = tmp1 & tmp2; | |
| 868 break; | |
| 869 case JBIG2_COMPOSE_XOR: | |
| 870 tmp = tmp1 ^ tmp2; | |
| 871 break; | |
| 872 case JBIG2_COMPOSE_XNOR: | |
| 873 tmp = ~(tmp1 ^ tmp2); | |
| 874 break; | |
| 875 case JBIG2_COMPOSE_REPLACE: | |
| 876 tmp = tmp1; | |
| 877 break; | |
| 878 } | |
| 879 dp[0] = (uint8_t)(tmp >> 24); | |
| 880 dp[1] = (uint8_t)(tmp >> 16); | |
| 881 dp[2] = (uint8_t)(tmp >> 8); | |
| 882 dp[3] = (uint8_t)tmp; | |
| 883 sp += 4; | |
| 884 dp += 4; | |
| 885 } | |
| 886 if (d2 != 0) { | |
| 887 tmp1 = | |
| 888 (JBIG2_GETDWORD(sp) << shift1) | | |
| 889 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> | |
| 890 shift2); | |
| 891 tmp2 = JBIG2_GETDWORD(dp); | |
| 892 switch (op) { | |
| 893 case JBIG2_COMPOSE_OR: | |
| 894 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 895 break; | |
| 896 case JBIG2_COMPOSE_AND: | |
| 897 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 898 break; | |
| 899 case JBIG2_COMPOSE_XOR: | |
| 900 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 901 break; | |
| 902 case JBIG2_COMPOSE_XNOR: | |
| 903 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 904 break; | |
| 905 case JBIG2_COMPOSE_REPLACE: | |
| 906 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 907 break; | |
| 908 } | |
| 909 dp[0] = (uint8_t)(tmp >> 24); | |
| 910 dp[1] = (uint8_t)(tmp >> 16); | |
| 911 dp[2] = (uint8_t)(tmp >> 8); | |
| 912 dp[3] = (uint8_t)tmp; | |
| 913 } | |
| 914 lineSrc += m_nStride; | |
| 915 lineDst += pDst->m_nStride; | |
| 916 } | |
| 917 } else if (s1 == d1) { | |
| 918 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 919 for (yy = yd0; yy < yd1; yy++) { | |
| 920 sp = lineSrc; | |
| 921 dp = lineDst; | |
| 922 if (d1 != 0) { | |
| 923 tmp1 = JBIG2_GETDWORD(sp); | |
| 924 tmp2 = JBIG2_GETDWORD(dp); | |
| 925 switch (op) { | |
| 926 case JBIG2_COMPOSE_OR: | |
| 927 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 928 break; | |
| 929 case JBIG2_COMPOSE_AND: | |
| 930 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 931 break; | |
| 932 case JBIG2_COMPOSE_XOR: | |
| 933 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 934 break; | |
| 935 case JBIG2_COMPOSE_XNOR: | |
| 936 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 937 break; | |
| 938 case JBIG2_COMPOSE_REPLACE: | |
| 939 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 940 break; | |
| 941 } | |
| 942 dp[0] = (uint8_t)(tmp >> 24); | |
| 943 dp[1] = (uint8_t)(tmp >> 16); | |
| 944 dp[2] = (uint8_t)(tmp >> 8); | |
| 945 dp[3] = (uint8_t)tmp; | |
| 946 sp += 4; | |
| 947 dp += 4; | |
| 948 } | |
| 949 for (xx = 0; xx < middleDwords; xx++) { | |
| 950 tmp1 = JBIG2_GETDWORD(sp); | |
| 951 tmp2 = JBIG2_GETDWORD(dp); | |
| 952 switch (op) { | |
| 953 case JBIG2_COMPOSE_OR: | |
| 954 tmp = tmp1 | tmp2; | |
| 955 break; | |
| 956 case JBIG2_COMPOSE_AND: | |
| 957 tmp = tmp1 & tmp2; | |
| 958 break; | |
| 959 case JBIG2_COMPOSE_XOR: | |
| 960 tmp = tmp1 ^ tmp2; | |
| 961 break; | |
| 962 case JBIG2_COMPOSE_XNOR: | |
| 963 tmp = ~(tmp1 ^ tmp2); | |
| 964 break; | |
| 965 case JBIG2_COMPOSE_REPLACE: | |
| 966 tmp = tmp1; | |
| 967 break; | |
| 968 } | |
| 969 dp[0] = (uint8_t)(tmp >> 24); | |
| 970 dp[1] = (uint8_t)(tmp >> 16); | |
| 971 dp[2] = (uint8_t)(tmp >> 8); | |
| 972 dp[3] = (uint8_t)tmp; | |
| 973 sp += 4; | |
| 974 dp += 4; | |
| 975 } | |
| 976 if (d2 != 0) { | |
| 977 tmp1 = JBIG2_GETDWORD(sp); | |
| 978 tmp2 = JBIG2_GETDWORD(dp); | |
| 979 switch (op) { | |
| 980 case JBIG2_COMPOSE_OR: | |
| 981 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 982 break; | |
| 983 case JBIG2_COMPOSE_AND: | |
| 984 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 985 break; | |
| 986 case JBIG2_COMPOSE_XOR: | |
| 987 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 988 break; | |
| 989 case JBIG2_COMPOSE_XNOR: | |
| 990 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 991 break; | |
| 992 case JBIG2_COMPOSE_REPLACE: | |
| 993 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 994 break; | |
| 995 } | |
| 996 dp[0] = (uint8_t)(tmp >> 24); | |
| 997 dp[1] = (uint8_t)(tmp >> 16); | |
| 998 dp[2] = (uint8_t)(tmp >> 8); | |
| 999 dp[3] = (uint8_t)tmp; | |
| 1000 } | |
| 1001 lineSrc += m_nStride; | |
| 1002 lineDst += pDst->m_nStride; | |
| 1003 } | |
| 1004 } else { | |
| 1005 shift1 = d1 - s1; | |
| 1006 shift2 = 32 - shift1; | |
| 1007 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1008 for (yy = yd0; yy < yd1; yy++) { | |
| 1009 sp = lineSrc; | |
| 1010 dp = lineDst; | |
| 1011 if (d1 != 0) { | |
| 1012 tmp1 = JBIG2_GETDWORD(sp) >> shift1; | |
| 1013 tmp2 = JBIG2_GETDWORD(dp); | |
| 1014 switch (op) { | |
| 1015 case JBIG2_COMPOSE_OR: | |
| 1016 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1017 break; | |
| 1018 case JBIG2_COMPOSE_AND: | |
| 1019 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1020 break; | |
| 1021 case JBIG2_COMPOSE_XOR: | |
| 1022 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1023 break; | |
| 1024 case JBIG2_COMPOSE_XNOR: | |
| 1025 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1026 break; | |
| 1027 case JBIG2_COMPOSE_REPLACE: | |
| 1028 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1029 break; | |
| 1030 } | |
| 1031 dp[0] = (uint8_t)(tmp >> 24); | |
| 1032 dp[1] = (uint8_t)(tmp >> 16); | |
| 1033 dp[2] = (uint8_t)(tmp >> 8); | |
| 1034 dp[3] = (uint8_t)tmp; | |
| 1035 dp += 4; | |
| 1036 } | |
| 1037 for (xx = 0; xx < middleDwords; xx++) { | |
| 1038 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | | |
| 1039 ((JBIG2_GETDWORD(sp + 4)) >> shift1); | |
| 1040 tmp2 = JBIG2_GETDWORD(dp); | |
| 1041 switch (op) { | |
| 1042 case JBIG2_COMPOSE_OR: | |
| 1043 tmp = tmp1 | tmp2; | |
| 1044 break; | |
| 1045 case JBIG2_COMPOSE_AND: | |
| 1046 tmp = tmp1 & tmp2; | |
| 1047 break; | |
| 1048 case JBIG2_COMPOSE_XOR: | |
| 1049 tmp = tmp1 ^ tmp2; | |
| 1050 break; | |
| 1051 case JBIG2_COMPOSE_XNOR: | |
| 1052 tmp = ~(tmp1 ^ tmp2); | |
| 1053 break; | |
| 1054 case JBIG2_COMPOSE_REPLACE: | |
| 1055 tmp = tmp1; | |
| 1056 break; | |
| 1057 } | |
| 1058 dp[0] = (uint8_t)(tmp >> 24); | |
| 1059 dp[1] = (uint8_t)(tmp >> 16); | |
| 1060 dp[2] = (uint8_t)(tmp >> 8); | |
| 1061 dp[3] = (uint8_t)tmp; | |
| 1062 sp += 4; | |
| 1063 dp += 4; | |
| 1064 } | |
| 1065 if (d2 != 0) { | |
| 1066 tmp1 = | |
| 1067 (JBIG2_GETDWORD(sp) << shift2) | | |
| 1068 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> | |
| 1069 shift1); | |
| 1070 tmp2 = JBIG2_GETDWORD(dp); | |
| 1071 switch (op) { | |
| 1072 case JBIG2_COMPOSE_OR: | |
| 1073 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1074 break; | |
| 1075 case JBIG2_COMPOSE_AND: | |
| 1076 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1077 break; | |
| 1078 case JBIG2_COMPOSE_XOR: | |
| 1079 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1080 break; | |
| 1081 case JBIG2_COMPOSE_XNOR: | |
| 1082 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1083 break; | |
| 1084 case JBIG2_COMPOSE_REPLACE: | |
| 1085 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1086 break; | |
| 1087 } | |
| 1088 dp[0] = (uint8_t)(tmp >> 24); | |
| 1089 dp[1] = (uint8_t)(tmp >> 16); | |
| 1090 dp[2] = (uint8_t)(tmp >> 8); | |
| 1091 dp[3] = (uint8_t)tmp; | |
| 1092 } | |
| 1093 lineSrc += m_nStride; | |
| 1094 lineDst += pDst->m_nStride; | |
| 1095 } | |
| 1096 } | |
| 1097 } | |
| 1098 return 1; | |
| 1099 } | |
| OLD | NEW |