| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include <limits.h> | 7 #include <limits.h> |
| 8 | 8 |
| 9 #include "../../../include/fxcrt/fx_coordinates.h" | 9 #include "../../../include/fxcrt/fx_coordinates.h" |
| 10 #include "../../../include/fxcrt/fx_safe_types.h" | 10 #include "../../../include/fxcrt/fx_safe_types.h" |
| 11 #include "JBig2_Image.h" | 11 #include "JBig2_Image.h" |
| 12 | 12 |
| 13 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) | 13 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h) { |
| 14 { | 14 m_nWidth = w; |
| 15 m_nWidth» = w; | 15 m_nHeight = h; |
| 16 m_nHeight» = h; | 16 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) { |
| 17 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) { | 17 m_pData = NULL; |
| 18 m_pData = NULL; | 18 m_bNeedFree = FALSE; |
| 19 m_bNeedFree = FALSE; | 19 return; |
| 20 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 = (uint8_t*)m_pModule->JBig2_Malloc2(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(CJBig2_Image& im) { |
| 40 m_pModule = im.m_pModule; |
| 41 m_nWidth = im.m_nWidth; |
| 42 m_nHeight = im.m_nHeight; |
| 43 m_nStride = im.m_nStride; |
| 44 if (im.m_pData) { |
| 45 m_pData = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); |
| 46 JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight); |
| 47 } else { |
| 48 m_pData = NULL; |
| 49 } |
| 50 m_bNeedFree = TRUE; |
| 51 } |
| 52 CJBig2_Image::~CJBig2_Image() { |
| 53 if (m_bNeedFree && m_pData) { |
| 54 m_pModule->JBig2_Free(m_pData); |
| 55 } |
| 56 } |
| 57 FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) { |
| 58 if (!m_pData) { |
| 59 return 0; |
| 60 } |
| 61 int32_t m, n; |
| 62 if (x < 0 || x >= m_nWidth) { |
| 63 return 0; |
| 64 } |
| 65 if (y < 0 || y >= m_nHeight) { |
| 66 return 0; |
| 67 } |
| 68 m = y * m_nStride + (x >> 3); |
| 69 n = x & 7; |
| 70 return ((m_pData[m] >> (7 - n)) & 1); |
| 71 } |
| 72 |
| 73 int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) { |
| 74 if (!m_pData) { |
| 75 return 0; |
| 76 } |
| 77 int32_t m, n; |
| 78 if (x < 0 || x >= m_nWidth) { |
| 79 return 0; |
| 80 } |
| 81 if (y < 0 || y >= m_nHeight) { |
| 82 return 0; |
| 83 } |
| 84 m = y * m_nStride + (x >> 3); |
| 85 n = x & 7; |
| 86 if (v) { |
| 87 m_pData[m] |= 1 << (7 - n); |
| 88 } else { |
| 89 m_pData[m] &= ~(1 << (7 - n)); |
| 90 } |
| 91 return 1; |
| 92 } |
| 93 void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom) { |
| 94 if (!m_pData) { |
| 95 return; |
| 96 } |
| 97 if (hFrom < 0 || hFrom >= m_nHeight) { |
| 98 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride); |
| 99 } else { |
| 100 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, |
| 101 m_nStride); |
| 102 } |
| 103 } |
| 104 void CJBig2_Image::fill(FX_BOOL v) { |
| 105 if (!m_pData) { |
| 106 return; |
| 107 } |
| 108 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight); |
| 109 } |
| 110 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, |
| 111 int32_t x, |
| 112 int32_t y, |
| 113 JBig2ComposeOp op) { |
| 114 if (!m_pData) { |
| 115 return FALSE; |
| 116 } |
| 117 return composeTo_opt2(pDst, x, y, op); |
| 118 } |
| 119 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, |
| 120 int32_t x, |
| 121 int32_t y, |
| 122 JBig2ComposeOp op, |
| 123 const FX_RECT* pSrcRect) { |
| 124 if (!m_pData) { |
| 125 return FALSE; |
| 126 } |
| 127 if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) { |
| 128 return composeTo_opt2(pDst, x, y, op); |
| 129 } |
| 130 return composeTo_opt2(pDst, x, y, op, pSrcRect); |
| 131 } |
| 132 FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image* pDst, |
| 133 int32_t x, |
| 134 int32_t y, |
| 135 JBig2ComposeOp op) { |
| 136 int32_t w, h, dx, dy; |
| 137 int32_t i, j; |
| 138 w = m_nWidth; |
| 139 h = m_nHeight; |
| 140 dx = dy = 0; |
| 141 if (x < 0) { |
| 142 dx += -x; |
| 143 w -= -x; |
| 144 x = 0; |
| 145 } |
| 146 if (y < 0) { |
| 147 dy += -y; |
| 148 h -= -y; |
| 149 y = 0; |
| 150 } |
| 151 if (x + w > pDst->m_nWidth) { |
| 152 w = pDst->m_nWidth - x; |
| 153 } |
| 154 if (y + h > pDst->m_nHeight) { |
| 155 h = pDst->m_nHeight - y; |
| 156 } |
| 157 switch (op) { |
| 158 case JBIG2_COMPOSE_OR: |
| 159 for (j = 0; j < h; j++) { |
| 160 for (i = 0; i < w; i++) { |
| 161 pDst->setPixel( |
| 162 x + i, y + j, |
| 163 (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1); |
| 164 } |
| 165 } |
| 166 break; |
| 167 case JBIG2_COMPOSE_AND: |
| 168 for (j = 0; j < h; j++) { |
| 169 for (i = 0; i < w; i++) { |
| 170 pDst->setPixel( |
| 171 x + i, y + j, |
| 172 (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1); |
| 173 } |
| 174 } |
| 175 break; |
| 176 case JBIG2_COMPOSE_XOR: |
| 177 for (j = 0; j < h; j++) { |
| 178 for (i = 0; i < w; i++) { |
| 179 pDst->setPixel( |
| 180 x + i, y + j, |
| 181 (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1); |
| 182 } |
| 183 } |
| 184 break; |
| 185 case JBIG2_COMPOSE_XNOR: |
| 186 for (j = 0; j < h; j++) { |
| 187 for (i = 0; i < w; i++) { |
| 188 pDst->setPixel( |
| 189 x + i, y + j, |
| 190 (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1); |
| 191 } |
| 192 } |
| 193 break; |
| 194 case JBIG2_COMPOSE_REPLACE: |
| 195 for (j = 0; j < h; j++) { |
| 196 for (i = 0; i < w; i++) { |
| 197 pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy)); |
| 198 } |
| 199 } |
| 200 break; |
| 201 } |
| 202 return TRUE; |
| 203 } |
| 204 |
| 205 FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image* pDst, |
| 206 int32_t x, |
| 207 int32_t y, |
| 208 JBig2ComposeOp op) { |
| 209 int32_t x0, x1, y0, y1, xx, yy; |
| 210 uint8_t *pLineSrc, *pLineDst, *srcPtr, *destPtr; |
| 211 FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3; |
| 212 FX_BOOL oneByte; |
| 213 if (!m_pData) { |
| 214 return FALSE; |
| 215 } |
| 216 if (y < 0) { |
| 217 y0 = -y; |
| 218 } else { |
| 219 y0 = 0; |
| 220 } |
| 221 if (y + m_nHeight > pDst->m_nHeight) { |
| 222 y1 = pDst->m_nHeight - y; |
| 223 } else { |
| 224 y1 = m_nHeight; |
| 225 } |
| 226 if (y0 >= y1) { |
| 227 return FALSE; |
| 228 } |
| 229 if (x >= 0) { |
| 230 x0 = x & ~7; |
| 231 } else { |
| 232 x0 = 0; |
| 233 } |
| 234 x1 = x + m_nWidth; |
| 235 if (x1 > pDst->m_nWidth) { |
| 236 x1 = pDst->m_nWidth; |
| 237 } |
| 238 if (x0 >= x1) { |
| 239 return FALSE; |
| 240 } |
| 241 s1 = x & 7; |
| 242 s2 = 8 - s1; |
| 243 m1 = 0xff >> (x1 & 7); |
| 244 m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); |
| 245 m3 = (0xff >> s1) & m2; |
| 246 oneByte = x0 == ((x1 - 1) & ~7); |
| 247 pLineDst = pDst->m_pData + y * pDst->m_nStride; |
| 248 pLineSrc = m_pData + y0 * m_nStride; |
| 249 if (oneByte) { |
| 250 if (x >= 0) { |
| 251 switch (op) { |
| 252 case JBIG2_COMPOSE_OR: { |
| 253 for (yy = y0; yy < y1; ++yy) { |
| 254 destPtr = pLineDst + (x >> 3); |
| 255 srcPtr = pLineSrc; |
| 256 dest = *destPtr; |
| 257 dest |= (*srcPtr >> s1) & m2; |
| 258 *destPtr = (uint8_t)dest; |
| 259 pLineDst += pDst->m_nStride; |
| 260 pLineSrc += m_nStride; |
| 261 } |
| 262 } break; |
| 263 case JBIG2_COMPOSE_AND: { |
| 264 for (yy = y0; yy < y1; ++yy) { |
| 265 destPtr = pLineDst + (x >> 3); |
| 266 srcPtr = pLineSrc; |
| 267 dest = *destPtr; |
| 268 dest &= ((0xff00 | *srcPtr) >> s1) | m1; |
| 269 *destPtr = (uint8_t)dest; |
| 270 pLineDst += pDst->m_nStride; |
| 271 pLineSrc += m_nStride; |
| 272 } |
| 273 } break; |
| 274 case JBIG2_COMPOSE_XOR: { |
| 275 for (yy = y0; yy < y1; ++yy) { |
| 276 destPtr = pLineDst + (x >> 3); |
| 277 srcPtr = pLineSrc; |
| 278 dest = *destPtr; |
| 279 dest ^= (*srcPtr >> s1) & m2; |
| 280 *destPtr = (uint8_t)dest; |
| 281 pLineDst += pDst->m_nStride; |
| 282 pLineSrc += m_nStride; |
| 283 } |
| 284 } break; |
| 285 case JBIG2_COMPOSE_XNOR: { |
| 286 for (yy = y0; yy < y1; ++yy) { |
| 287 destPtr = pLineDst + (x >> 3); |
| 288 srcPtr = pLineSrc; |
| 289 dest = *destPtr; |
| 290 dest ^= ((*srcPtr ^ 0xff) >> s1) & m2; |
| 291 *destPtr = (uint8_t)dest; |
| 292 pLineDst += pDst->m_nStride; |
| 293 pLineSrc += m_nStride; |
| 294 } |
| 295 } break; |
| 296 case JBIG2_COMPOSE_REPLACE: { |
| 297 for (yy = y0; yy < y1; ++yy) { |
| 298 destPtr = pLineDst + (x >> 3); |
| 299 srcPtr = pLineSrc; |
| 300 dest = *destPtr; |
| 301 dest = (dest & ~m3) | ((*srcPtr >> s1) & m3); |
| 302 *destPtr = (uint8_t)dest; |
| 303 pLineDst += pDst->m_nStride; |
| 304 pLineSrc += m_nStride; |
| 305 } |
| 306 } break; |
| 307 } |
| 308 } else { |
| 309 switch (op) { |
| 310 case JBIG2_COMPOSE_OR: { |
| 311 for (yy = y0; yy < y1; ++yy) { |
| 312 destPtr = pLineDst; |
| 313 srcPtr = pLineSrc + (-x >> 3); |
| 314 dest = *destPtr; |
| 315 dest |= *srcPtr & m2; |
| 316 *destPtr = (uint8_t)dest; |
| 317 pLineDst += pDst->m_nStride; |
| 318 pLineSrc += m_nStride; |
| 319 } |
| 320 } break; |
| 321 case JBIG2_COMPOSE_AND: { |
| 322 for (yy = y0; yy < y1; ++yy) { |
| 323 destPtr = pLineDst; |
| 324 srcPtr = pLineSrc + (-x >> 3); |
| 325 dest = *destPtr; |
| 326 dest &= *srcPtr | m1; |
| 327 *destPtr = (uint8_t)dest; |
| 328 pLineDst += pDst->m_nStride; |
| 329 pLineSrc += m_nStride; |
| 330 } |
| 331 } break; |
| 332 case JBIG2_COMPOSE_XOR: { |
| 333 for (yy = y0; yy < y1; ++yy) { |
| 334 destPtr = pLineDst; |
| 335 srcPtr = pLineSrc + (-x >> 3); |
| 336 dest = *destPtr; |
| 337 dest ^= *srcPtr & m2; |
| 338 *destPtr = (uint8_t)dest; |
| 339 pLineDst += pDst->m_nStride; |
| 340 pLineSrc += m_nStride; |
| 341 } |
| 342 } break; |
| 343 case JBIG2_COMPOSE_XNOR: { |
| 344 for (yy = y0; yy < y1; ++yy) { |
| 345 destPtr = pLineDst; |
| 346 srcPtr = pLineSrc + (-x >> 3); |
| 347 dest = *destPtr; |
| 348 dest ^= (*srcPtr ^ 0xff) & m2; |
| 349 *destPtr = (uint8_t)dest; |
| 350 pLineDst += pDst->m_nStride; |
| 351 pLineSrc += m_nStride; |
| 352 } |
| 353 } break; |
| 354 case JBIG2_COMPOSE_REPLACE: { |
| 355 for (yy = y0; yy < y1; ++yy) { |
| 356 destPtr = pLineDst; |
| 357 srcPtr = pLineSrc + (-x >> 3); |
| 358 dest = *destPtr; |
| 359 dest = (*srcPtr & m2) | (dest & m1); |
| 360 *destPtr = (uint8_t)dest; |
| 361 pLineDst += pDst->m_nStride; |
| 362 pLineSrc += m_nStride; |
| 363 } |
| 364 } break; |
| 365 } |
| 21 } | 366 } |
| 22 m_nStride = ((w + 31) >> 5) << 2; | 367 } else { |
| 23 if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) { | 368 if (x >= 0) { |
| 24 m_pData = (uint8_t *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); | 369 switch (op) { |
| 370 case JBIG2_COMPOSE_OR: { |
| 371 for (yy = y0; yy < y1; ++yy) { |
| 372 destPtr = pLineDst + (x >> 3); |
| 373 srcPtr = pLineSrc; |
| 374 src1 = *srcPtr++; |
| 375 dest = *destPtr; |
| 376 dest |= src1 >> s1; |
| 377 *destPtr++ = (uint8_t)dest; |
| 378 xx = x0 + 8; |
| 379 for (; xx < x1 - 8; xx += 8) { |
| 380 dest = *destPtr; |
| 381 src0 = src1; |
| 382 src1 = *srcPtr++; |
| 383 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 384 dest |= src; |
| 385 *destPtr++ = (uint8_t)dest; |
| 386 } |
| 387 dest = *destPtr; |
| 388 src0 = src1; |
| 389 if (srcPtr - pLineSrc < m_nStride) { |
| 390 src1 = *srcPtr++; |
| 391 } else { |
| 392 src1 = 0; |
| 393 } |
| 394 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 395 dest |= src & m2; |
| 396 *destPtr = (uint8_t)dest; |
| 397 pLineDst += pDst->m_nStride; |
| 398 pLineSrc += m_nStride; |
| 399 } |
| 400 } break; |
| 401 case JBIG2_COMPOSE_AND: { |
| 402 for (yy = y0; yy < y1; ++yy) { |
| 403 destPtr = pLineDst + (x >> 3); |
| 404 srcPtr = pLineSrc; |
| 405 src1 = *srcPtr++; |
| 406 dest = *destPtr; |
| 407 dest &= (0xff00 | src1) >> s1; |
| 408 *destPtr++ = (uint8_t)dest; |
| 409 xx = x0 + 8; |
| 410 for (; xx < x1 - 8; xx += 8) { |
| 411 dest = *destPtr; |
| 412 src0 = src1; |
| 413 src1 = *srcPtr++; |
| 414 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 415 dest &= src; |
| 416 *destPtr++ = (uint8_t)dest; |
| 417 } |
| 418 dest = *destPtr; |
| 419 src0 = src1; |
| 420 if (srcPtr - pLineSrc < m_nStride) { |
| 421 src1 = *srcPtr++; |
| 422 } else { |
| 423 src1 = 0; |
| 424 } |
| 425 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 426 dest &= src | m1; |
| 427 *destPtr = (uint8_t)dest; |
| 428 pLineDst += pDst->m_nStride; |
| 429 pLineSrc += m_nStride; |
| 430 } |
| 431 } break; |
| 432 case JBIG2_COMPOSE_XOR: { |
| 433 for (yy = y0; yy < y1; ++yy) { |
| 434 destPtr = pLineDst + (x >> 3); |
| 435 srcPtr = pLineSrc; |
| 436 src1 = *srcPtr++; |
| 437 dest = *destPtr; |
| 438 dest ^= src1 >> s1; |
| 439 *destPtr++ = (uint8_t)dest; |
| 440 xx = x0 + 8; |
| 441 for (; xx < x1 - 8; xx += 8) { |
| 442 dest = *destPtr; |
| 443 src0 = src1; |
| 444 src1 = *srcPtr++; |
| 445 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 446 dest ^= src; |
| 447 *destPtr++ = (uint8_t)dest; |
| 448 } |
| 449 dest = *destPtr; |
| 450 src0 = src1; |
| 451 if (srcPtr - pLineSrc < m_nStride) { |
| 452 src1 = *srcPtr++; |
| 453 } else { |
| 454 src1 = 0; |
| 455 } |
| 456 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 457 dest ^= src & m2; |
| 458 *destPtr = (uint8_t)dest; |
| 459 pLineDst += pDst->m_nStride; |
| 460 pLineSrc += m_nStride; |
| 461 } |
| 462 } break; |
| 463 case JBIG2_COMPOSE_XNOR: { |
| 464 for (yy = y0; yy < y1; ++yy) { |
| 465 destPtr = pLineDst + (x >> 3); |
| 466 srcPtr = pLineSrc; |
| 467 src1 = *srcPtr++; |
| 468 dest = *destPtr; |
| 469 dest ^= (src1 ^ 0xff) >> s1; |
| 470 *destPtr++ = (uint8_t)dest; |
| 471 xx = x0 + 8; |
| 472 for (; xx < x1 - 8; xx += 8) { |
| 473 dest = *destPtr; |
| 474 src0 = src1; |
| 475 src1 = *srcPtr++; |
| 476 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 477 dest ^= src ^ 0xff; |
| 478 *destPtr++ = (uint8_t)dest; |
| 479 } |
| 480 dest = *destPtr; |
| 481 src0 = src1; |
| 482 if (srcPtr - pLineSrc < m_nStride) { |
| 483 src1 = *srcPtr++; |
| 484 } else { |
| 485 src1 = 0; |
| 486 } |
| 487 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 488 dest ^= (src ^ 0xff) & m2; |
| 489 *destPtr = (uint8_t)dest; |
| 490 pLineDst += pDst->m_nStride; |
| 491 pLineSrc += m_nStride; |
| 492 } |
| 493 } break; |
| 494 case JBIG2_COMPOSE_REPLACE: { |
| 495 for (yy = y0; yy < y1; ++yy) { |
| 496 destPtr = pLineDst + (x >> 3); |
| 497 srcPtr = pLineSrc; |
| 498 src1 = *srcPtr++; |
| 499 dest = *destPtr; |
| 500 dest = (dest & (0xff << s2)) | (src1 >> s1); |
| 501 *destPtr++ = (uint8_t)dest; |
| 502 xx = x0 + 8; |
| 503 for (; xx < x1 - 8; xx += 8) { |
| 504 dest = *destPtr; |
| 505 src0 = src1; |
| 506 src1 = *srcPtr++; |
| 507 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 508 dest = src; |
| 509 *destPtr++ = (uint8_t)dest; |
| 510 } |
| 511 dest = *destPtr; |
| 512 src0 = src1; |
| 513 if (srcPtr - pLineSrc < m_nStride) { |
| 514 src1 = *srcPtr++; |
| 515 } else { |
| 516 src1 = 0; |
| 517 } |
| 518 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 519 dest = (src & m2) | (dest & m1); |
| 520 *destPtr = (uint8_t)dest; |
| 521 pLineDst += pDst->m_nStride; |
| 522 pLineSrc += m_nStride; |
| 523 } |
| 524 } break; |
| 525 } |
| 25 } else { | 526 } else { |
| 26 m_pData = NULL; | 527 switch (op) { |
| 528 case JBIG2_COMPOSE_OR: { |
| 529 for (yy = y0; yy < y1; ++yy) { |
| 530 destPtr = pLineDst; |
| 531 srcPtr = pLineSrc + (-x >> 3); |
| 532 src1 = *srcPtr++; |
| 533 xx = x0; |
| 534 for (; xx < x1 - 8; xx += 8) { |
| 535 dest = *destPtr; |
| 536 src0 = src1; |
| 537 src1 = *srcPtr++; |
| 538 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 539 dest |= src; |
| 540 *destPtr++ = (uint8_t)dest; |
| 541 } |
| 542 dest = *destPtr; |
| 543 src0 = src1; |
| 544 if (srcPtr - pLineSrc < m_nStride) { |
| 545 src1 = *srcPtr++; |
| 546 } else { |
| 547 src1 = 0; |
| 548 } |
| 549 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 550 dest |= src & m2; |
| 551 *destPtr = (uint8_t)dest; |
| 552 pLineDst += pDst->m_nStride; |
| 553 pLineSrc += m_nStride; |
| 554 } |
| 555 } break; |
| 556 case JBIG2_COMPOSE_AND: { |
| 557 for (yy = y0; yy < y1; ++yy) { |
| 558 destPtr = pLineDst; |
| 559 srcPtr = pLineSrc + (-x >> 3); |
| 560 src1 = *srcPtr++; |
| 561 xx = x0; |
| 562 for (; xx < x1 - 8; xx += 8) { |
| 563 dest = *destPtr; |
| 564 src0 = src1; |
| 565 src1 = *srcPtr++; |
| 566 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 567 dest &= src; |
| 568 *destPtr++ = (uint8_t)dest; |
| 569 } |
| 570 dest = *destPtr; |
| 571 src0 = src1; |
| 572 if (srcPtr - pLineSrc < m_nStride) { |
| 573 src1 = *srcPtr++; |
| 574 } else { |
| 575 src1 = 0; |
| 576 } |
| 577 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 578 dest &= src | m1; |
| 579 *destPtr = (uint8_t)dest; |
| 580 pLineDst += pDst->m_nStride; |
| 581 pLineSrc += m_nStride; |
| 582 } |
| 583 } break; |
| 584 case JBIG2_COMPOSE_XOR: { |
| 585 for (yy = y0; yy < y1; ++yy) { |
| 586 destPtr = pLineDst; |
| 587 srcPtr = pLineSrc + (-x >> 3); |
| 588 src1 = *srcPtr++; |
| 589 xx = x0; |
| 590 for (; xx < x1 - 8; xx += 8) { |
| 591 dest = *destPtr; |
| 592 src0 = src1; |
| 593 src1 = *srcPtr++; |
| 594 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 595 dest ^= src; |
| 596 *destPtr++ = (uint8_t)dest; |
| 597 } |
| 598 dest = *destPtr; |
| 599 src0 = src1; |
| 600 if (srcPtr - pLineSrc < m_nStride) { |
| 601 src1 = *srcPtr++; |
| 602 } else { |
| 603 src1 = 0; |
| 604 } |
| 605 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 606 dest ^= src & m2; |
| 607 *destPtr = (uint8_t)dest; |
| 608 pLineDst += pDst->m_nStride; |
| 609 pLineSrc += m_nStride; |
| 610 } |
| 611 } break; |
| 612 case JBIG2_COMPOSE_XNOR: { |
| 613 for (yy = y0; yy < y1; ++yy) { |
| 614 destPtr = pLineDst; |
| 615 srcPtr = pLineSrc + (-x >> 3); |
| 616 src1 = *srcPtr++; |
| 617 xx = x0; |
| 618 for (; xx < x1 - 8; xx += 8) { |
| 619 dest = *destPtr; |
| 620 src0 = src1; |
| 621 src1 = *srcPtr++; |
| 622 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 623 dest ^= src ^ 0xff; |
| 624 *destPtr++ = (uint8_t)dest; |
| 625 } |
| 626 dest = *destPtr; |
| 627 src0 = src1; |
| 628 if (srcPtr - pLineSrc < m_nStride) { |
| 629 src1 = *srcPtr++; |
| 630 } else { |
| 631 src1 = 0; |
| 632 } |
| 633 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 634 dest ^= (src ^ 0xff) & m2; |
| 635 *destPtr = (uint8_t)dest; |
| 636 pLineDst += pDst->m_nStride; |
| 637 pLineSrc += m_nStride; |
| 638 } |
| 639 } break; |
| 640 case JBIG2_COMPOSE_REPLACE: { |
| 641 for (yy = y0; yy < y1; ++yy) { |
| 642 destPtr = pLineDst; |
| 643 srcPtr = pLineSrc + (-x >> 3); |
| 644 src1 = *srcPtr++; |
| 645 xx = x0; |
| 646 for (; xx < x1 - 8; xx += 8) { |
| 647 dest = *destPtr; |
| 648 src0 = src1; |
| 649 src1 = *srcPtr++; |
| 650 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 651 dest = src; |
| 652 *destPtr++ = (uint8_t)dest; |
| 653 } |
| 654 dest = *destPtr; |
| 655 src0 = src1; |
| 656 if (srcPtr - pLineSrc < m_nStride) { |
| 657 src1 = *srcPtr++; |
| 658 } else { |
| 659 src1 = 0; |
| 660 } |
| 661 src = (((src0 << 8) | src1) >> s1) & 0xff; |
| 662 dest = (src & m2) | (dest & m1); |
| 663 *destPtr = (uint8_t)dest; |
| 664 pLineDst += pDst->m_nStride; |
| 665 pLineSrc += m_nStride; |
| 666 } |
| 667 } break; |
| 668 } |
| 27 } | 669 } |
| 28 m_bNeedFree = TRUE; | 670 } |
| 29 } | 671 return TRUE; |
| 30 CJBig2_Image::CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t*pBuf) | 672 } |
| 31 { | 673 FX_BOOL CJBig2_Image::composeFrom(int32_t x, |
| 32 m_nWidth = w; | 674 int32_t y, |
| 33 m_nHeight = h; | 675 CJBig2_Image* pSrc, |
| 34 m_nStride = stride; | 676 JBig2ComposeOp op) { |
| 35 m_pData = pBuf; | 677 if (!m_pData) { |
| 36 m_bNeedFree = FALSE; | 678 return FALSE; |
| 37 } | 679 } |
| 38 CJBig2_Image::CJBig2_Image(CJBig2_Image &im) | 680 return pSrc->composeTo(this, x, y, op); |
| 39 { | 681 } |
| 40 m_pModule = im.m_pModule; | 682 FX_BOOL CJBig2_Image::composeFrom(int32_t x, |
| 41 m_nWidth» = im.m_nWidth; | 683 int32_t y, |
| 42 m_nHeight» = im.m_nHeight; | 684 CJBig2_Image* pSrc, |
| 43 m_nStride» = im.m_nStride; | 685 JBig2ComposeOp op, |
| 44 if (im.m_pData) { | 686 const FX_RECT* pSrcRect) { |
| 45 m_pData = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); | 687 if (!m_pData) { |
| 46 JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight); | 688 return FALSE; |
| 689 } |
| 690 return pSrc->composeTo(this, x, y, op, pSrcRect); |
| 691 } |
| 692 CJBig2_Image* CJBig2_Image::subImage_unopt(int32_t x, |
| 693 int32_t y, |
| 694 int32_t w, |
| 695 int32_t h) { |
| 696 CJBig2_Image* pImage; |
| 697 int32_t i, j; |
| 698 JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); |
| 699 for (j = 0; j < h; j++) { |
| 700 for (i = 0; i < w; i++) { |
| 701 pImage->setPixel(i, j, getPixel(x + i, y + j)); |
| 702 } |
| 703 } |
| 704 return pImage; |
| 705 } |
| 706 #define JBIG2_GETDWORD(buf) \ |
| 707 ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) |
| 708 CJBig2_Image* CJBig2_Image::subImage(int32_t x, |
| 709 int32_t y, |
| 710 int32_t w, |
| 711 int32_t h) { |
| 712 CJBig2_Image* pImage; |
| 713 int32_t m, n, j; |
| 714 uint8_t *pLineSrc, *pLineDst; |
| 715 FX_DWORD wTmp; |
| 716 uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd; |
| 717 if (w == 0 || h == 0) { |
| 718 return NULL; |
| 719 } |
| 720 JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); |
| 721 if (!m_pData) { |
| 722 pImage->fill(0); |
| 723 return pImage; |
| 724 } |
| 725 if (!pImage->m_pData) { |
| 726 return pImage; |
| 727 } |
| 728 pLineSrc = m_pData + m_nStride * y; |
| 729 pLineDst = pImage->m_pData; |
| 730 m = (x >> 5) << 2; |
| 731 n = x & 31; |
| 732 if (n == 0) { |
| 733 for (j = 0; j < h; j++) { |
| 734 pSrc = pLineSrc + m; |
| 735 pSrcEnd = pLineSrc + m_nStride; |
| 736 pDst = pLineDst; |
| 737 pDstEnd = pLineDst + pImage->m_nStride; |
| 738 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { |
| 739 *((FX_DWORD*)pDst) = *((FX_DWORD*)pSrc); |
| 740 } |
| 741 pLineSrc += m_nStride; |
| 742 pLineDst += pImage->m_nStride; |
| 743 } |
| 744 } else { |
| 745 for (j = 0; j < h; j++) { |
| 746 pSrc = pLineSrc + m; |
| 747 pSrcEnd = pLineSrc + m_nStride; |
| 748 pDst = pLineDst; |
| 749 pDstEnd = pLineDst + pImage->m_nStride; |
| 750 for (; pDst < pDstEnd; pSrc += 4, pDst += 4) { |
| 751 if (pSrc + 4 < pSrcEnd) { |
| 752 wTmp = (JBIG2_GETDWORD(pSrc) << n) | |
| 753 (JBIG2_GETDWORD(pSrc + 4) >> (32 - n)); |
| 754 } else { |
| 755 wTmp = JBIG2_GETDWORD(pSrc) << n; |
| 756 } |
| 757 pDst[0] = (uint8_t)(wTmp >> 24); |
| 758 pDst[1] = (uint8_t)(wTmp >> 16); |
| 759 pDst[2] = (uint8_t)(wTmp >> 8); |
| 760 pDst[3] = (uint8_t)wTmp; |
| 761 } |
| 762 pLineSrc += m_nStride; |
| 763 pLineDst += pImage->m_nStride; |
| 764 } |
| 765 } |
| 766 return pImage; |
| 767 } |
| 768 void CJBig2_Image::expand(int32_t h, FX_BOOL v) { |
| 769 if (!m_pData || h <= m_nHeight) { |
| 770 return; |
| 771 } |
| 772 FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h); |
| 773 FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride); |
| 774 FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight); |
| 775 FX_SAFE_DWORD safeMemSize = dwH; |
| 776 safeMemSize *= dwStride; |
| 777 if (!safeMemSize.IsValid()) { |
| 778 return; |
| 779 } |
| 780 // The guaranteed reallocated memory is to be < 4GB (unsigned int). |
| 781 m_pData = |
| 782 (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie()); |
| 783 // The result of dwHeight * dwStride doesn't overflow after the |
| 784 // checking of safeMemSize. |
| 785 // The same as the result of (dwH - dwHeight) * dwStride) because |
| 786 // dwH - dwHeight is always less than dwH(h) which is checked in |
| 787 // the calculation of dwH * dwStride. |
| 788 JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, |
| 789 (dwH - dwHeight) * dwStride); |
| 790 m_nHeight = h; |
| 791 } |
| 792 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, |
| 793 int32_t x, |
| 794 int32_t y, |
| 795 JBig2ComposeOp op) { |
| 796 int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0, |
| 797 yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0; |
| 798 |
| 799 FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, tmp = 0, |
| 800 tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0; |
| 801 |
| 802 uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL; |
| 803 |
| 804 if (!m_pData) { |
| 805 return FALSE; |
| 806 } |
| 807 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { |
| 808 return FALSE; |
| 809 } |
| 810 if (y < 0) { |
| 811 ys0 = -y; |
| 812 } |
| 813 if (y + m_nHeight > pDst->m_nHeight) { |
| 814 ys1 = pDst->m_nHeight - y; |
| 815 } else { |
| 816 ys1 = m_nHeight; |
| 817 } |
| 818 if (x < 0) { |
| 819 xs0 = -x; |
| 820 } |
| 821 if (x + m_nWidth > pDst->m_nWidth) { |
| 822 xs1 = pDst->m_nWidth - x; |
| 823 } else { |
| 824 xs1 = m_nWidth; |
| 825 } |
| 826 if ((ys0 >= ys1) || (xs0 >= xs1)) { |
| 827 return 0; |
| 828 } |
| 829 w = xs1 - xs0; |
| 830 h = ys1 - ys0; |
| 831 if (y >= 0) { |
| 832 yd0 = y; |
| 833 } |
| 834 if (x >= 0) { |
| 835 xd0 = x; |
| 836 } |
| 837 xd1 = xd0 + w; |
| 838 yd1 = yd0 + h; |
| 839 d1 = xd0 & 31; |
| 840 d2 = xd1 & 31; |
| 841 s1 = xs0 & 31; |
| 842 maskL = 0xffffffff >> d1; |
| 843 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); |
| 844 maskM = maskL & maskR; |
| 845 lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2); |
| 846 lineLeft = m_nStride - ((xs0 >> 5) << 2); |
| 847 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); |
| 848 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { |
| 849 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { |
| 850 if (s1 > d1) { |
| 851 shift = s1 - d1; |
| 852 for (yy = yd0; yy < yd1; yy++) { |
| 853 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; |
| 854 tmp2 = JBIG2_GETDWORD(lineDst); |
| 855 switch (op) { |
| 856 case JBIG2_COMPOSE_OR: |
| 857 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 858 break; |
| 859 case JBIG2_COMPOSE_AND: |
| 860 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 861 break; |
| 862 case JBIG2_COMPOSE_XOR: |
| 863 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 864 break; |
| 865 case JBIG2_COMPOSE_XNOR: |
| 866 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 867 break; |
| 868 case JBIG2_COMPOSE_REPLACE: |
| 869 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 870 break; |
| 871 } |
| 872 lineDst[0] = (uint8_t)(tmp >> 24); |
| 873 lineDst[1] = (uint8_t)(tmp >> 16); |
| 874 lineDst[2] = (uint8_t)(tmp >> 8); |
| 875 lineDst[3] = (uint8_t)tmp; |
| 876 lineSrc += m_nStride; |
| 877 lineDst += pDst->m_nStride; |
| 878 } |
| 879 } else { |
| 880 shift = d1 - s1; |
| 881 for (yy = yd0; yy < yd1; yy++) { |
| 882 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; |
| 883 tmp2 = JBIG2_GETDWORD(lineDst); |
| 884 switch (op) { |
| 885 case JBIG2_COMPOSE_OR: |
| 886 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 887 break; |
| 888 case JBIG2_COMPOSE_AND: |
| 889 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 890 break; |
| 891 case JBIG2_COMPOSE_XOR: |
| 892 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 893 break; |
| 894 case JBIG2_COMPOSE_XNOR: |
| 895 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 896 break; |
| 897 case JBIG2_COMPOSE_REPLACE: |
| 898 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 899 break; |
| 900 } |
| 901 lineDst[0] = (uint8_t)(tmp >> 24); |
| 902 lineDst[1] = (uint8_t)(tmp >> 16); |
| 903 lineDst[2] = (uint8_t)(tmp >> 8); |
| 904 lineDst[3] = (uint8_t)tmp; |
| 905 lineSrc += m_nStride; |
| 906 lineDst += pDst->m_nStride; |
| 907 } |
| 908 } |
| 47 } else { | 909 } else { |
| 48 m_pData = NULL; | 910 shift1 = s1 - d1; |
| 911 shift2 = 32 - shift1; |
| 912 for (yy = yd0; yy < yd1; yy++) { |
| 913 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | |
| 914 (JBIG2_GETDWORD(lineSrc + 4) >> shift2); |
| 915 tmp2 = JBIG2_GETDWORD(lineDst); |
| 916 switch (op) { |
| 917 case JBIG2_COMPOSE_OR: |
| 918 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 919 break; |
| 920 case JBIG2_COMPOSE_AND: |
| 921 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 922 break; |
| 923 case JBIG2_COMPOSE_XOR: |
| 924 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 925 break; |
| 926 case JBIG2_COMPOSE_XNOR: |
| 927 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 928 break; |
| 929 case JBIG2_COMPOSE_REPLACE: |
| 930 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 931 break; |
| 932 } |
| 933 lineDst[0] = (uint8_t)(tmp >> 24); |
| 934 lineDst[1] = (uint8_t)(tmp >> 16); |
| 935 lineDst[2] = (uint8_t)(tmp >> 8); |
| 936 lineDst[3] = (uint8_t)tmp; |
| 937 lineSrc += m_nStride; |
| 938 lineDst += pDst->m_nStride; |
| 939 } |
| 49 } | 940 } |
| 50 m_bNeedFree = TRUE; | 941 } else { |
| 51 } | 942 if (s1 > d1) { |
| 52 CJBig2_Image::~CJBig2_Image() | 943 shift1 = s1 - d1; |
| 53 { | 944 shift2 = 32 - shift1; |
| 54 if(m_bNeedFree && m_pData) { | 945 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 55 m_pModule->JBig2_Free(m_pData); | 946 for (yy = yd0; yy < yd1; yy++) { |
| 947 sp = lineSrc; |
| 948 dp = lineDst; |
| 949 if (d1 != 0) { |
| 950 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | |
| 951 (JBIG2_GETDWORD(sp + 4) >> shift2); |
| 952 tmp2 = JBIG2_GETDWORD(dp); |
| 953 switch (op) { |
| 954 case JBIG2_COMPOSE_OR: |
| 955 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 956 break; |
| 957 case JBIG2_COMPOSE_AND: |
| 958 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 959 break; |
| 960 case JBIG2_COMPOSE_XOR: |
| 961 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 962 break; |
| 963 case JBIG2_COMPOSE_XNOR: |
| 964 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 965 break; |
| 966 case JBIG2_COMPOSE_REPLACE: |
| 967 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 968 break; |
| 969 } |
| 970 dp[0] = (uint8_t)(tmp >> 24); |
| 971 dp[1] = (uint8_t)(tmp >> 16); |
| 972 dp[2] = (uint8_t)(tmp >> 8); |
| 973 dp[3] = (uint8_t)tmp; |
| 974 sp += 4; |
| 975 dp += 4; |
| 976 } |
| 977 for (xx = 0; xx < middleDwords; xx++) { |
| 978 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | |
| 979 (JBIG2_GETDWORD(sp + 4) >> shift2); |
| 980 tmp2 = JBIG2_GETDWORD(dp); |
| 981 switch (op) { |
| 982 case JBIG2_COMPOSE_OR: |
| 983 tmp = tmp1 | tmp2; |
| 984 break; |
| 985 case JBIG2_COMPOSE_AND: |
| 986 tmp = tmp1 & tmp2; |
| 987 break; |
| 988 case JBIG2_COMPOSE_XOR: |
| 989 tmp = tmp1 ^ tmp2; |
| 990 break; |
| 991 case JBIG2_COMPOSE_XNOR: |
| 992 tmp = ~(tmp1 ^ tmp2); |
| 993 break; |
| 994 case JBIG2_COMPOSE_REPLACE: |
| 995 tmp = tmp1; |
| 996 break; |
| 997 } |
| 998 dp[0] = (uint8_t)(tmp >> 24); |
| 999 dp[1] = (uint8_t)(tmp >> 16); |
| 1000 dp[2] = (uint8_t)(tmp >> 8); |
| 1001 dp[3] = (uint8_t)tmp; |
| 1002 sp += 4; |
| 1003 dp += 4; |
| 1004 } |
| 1005 if (d2 != 0) { |
| 1006 tmp1 = |
| 1007 (JBIG2_GETDWORD(sp) << shift1) | |
| 1008 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> |
| 1009 shift2); |
| 1010 tmp2 = JBIG2_GETDWORD(dp); |
| 1011 switch (op) { |
| 1012 case JBIG2_COMPOSE_OR: |
| 1013 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1014 break; |
| 1015 case JBIG2_COMPOSE_AND: |
| 1016 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1017 break; |
| 1018 case JBIG2_COMPOSE_XOR: |
| 1019 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1020 break; |
| 1021 case JBIG2_COMPOSE_XNOR: |
| 1022 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1023 break; |
| 1024 case JBIG2_COMPOSE_REPLACE: |
| 1025 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1026 break; |
| 1027 } |
| 1028 dp[0] = (uint8_t)(tmp >> 24); |
| 1029 dp[1] = (uint8_t)(tmp >> 16); |
| 1030 dp[2] = (uint8_t)(tmp >> 8); |
| 1031 dp[3] = (uint8_t)tmp; |
| 1032 } |
| 1033 lineSrc += m_nStride; |
| 1034 lineDst += pDst->m_nStride; |
| 1035 } |
| 1036 } else if (s1 == d1) { |
| 1037 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 1038 for (yy = yd0; yy < yd1; yy++) { |
| 1039 sp = lineSrc; |
| 1040 dp = lineDst; |
| 1041 if (d1 != 0) { |
| 1042 tmp1 = JBIG2_GETDWORD(sp); |
| 1043 tmp2 = JBIG2_GETDWORD(dp); |
| 1044 switch (op) { |
| 1045 case JBIG2_COMPOSE_OR: |
| 1046 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 1047 break; |
| 1048 case JBIG2_COMPOSE_AND: |
| 1049 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 1050 break; |
| 1051 case JBIG2_COMPOSE_XOR: |
| 1052 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 1053 break; |
| 1054 case JBIG2_COMPOSE_XNOR: |
| 1055 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 1056 break; |
| 1057 case JBIG2_COMPOSE_REPLACE: |
| 1058 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 1059 break; |
| 1060 } |
| 1061 dp[0] = (uint8_t)(tmp >> 24); |
| 1062 dp[1] = (uint8_t)(tmp >> 16); |
| 1063 dp[2] = (uint8_t)(tmp >> 8); |
| 1064 dp[3] = (uint8_t)tmp; |
| 1065 sp += 4; |
| 1066 dp += 4; |
| 1067 } |
| 1068 for (xx = 0; xx < middleDwords; xx++) { |
| 1069 tmp1 = JBIG2_GETDWORD(sp); |
| 1070 tmp2 = JBIG2_GETDWORD(dp); |
| 1071 switch (op) { |
| 1072 case JBIG2_COMPOSE_OR: |
| 1073 tmp = tmp1 | tmp2; |
| 1074 break; |
| 1075 case JBIG2_COMPOSE_AND: |
| 1076 tmp = tmp1 & tmp2; |
| 1077 break; |
| 1078 case JBIG2_COMPOSE_XOR: |
| 1079 tmp = tmp1 ^ tmp2; |
| 1080 break; |
| 1081 case JBIG2_COMPOSE_XNOR: |
| 1082 tmp = ~(tmp1 ^ tmp2); |
| 1083 break; |
| 1084 case JBIG2_COMPOSE_REPLACE: |
| 1085 tmp = tmp1; |
| 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 sp += 4; |
| 1093 dp += 4; |
| 1094 } |
| 1095 if (d2 != 0) { |
| 1096 tmp1 = JBIG2_GETDWORD(sp); |
| 1097 tmp2 = JBIG2_GETDWORD(dp); |
| 1098 switch (op) { |
| 1099 case JBIG2_COMPOSE_OR: |
| 1100 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1101 break; |
| 1102 case JBIG2_COMPOSE_AND: |
| 1103 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1104 break; |
| 1105 case JBIG2_COMPOSE_XOR: |
| 1106 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1107 break; |
| 1108 case JBIG2_COMPOSE_XNOR: |
| 1109 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1110 break; |
| 1111 case JBIG2_COMPOSE_REPLACE: |
| 1112 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1113 break; |
| 1114 } |
| 1115 dp[0] = (uint8_t)(tmp >> 24); |
| 1116 dp[1] = (uint8_t)(tmp >> 16); |
| 1117 dp[2] = (uint8_t)(tmp >> 8); |
| 1118 dp[3] = (uint8_t)tmp; |
| 1119 } |
| 1120 lineSrc += m_nStride; |
| 1121 lineDst += pDst->m_nStride; |
| 1122 } |
| 1123 } else { |
| 1124 shift1 = d1 - s1; |
| 1125 shift2 = 32 - shift1; |
| 1126 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 1127 for (yy = yd0; yy < yd1; yy++) { |
| 1128 sp = lineSrc; |
| 1129 dp = lineDst; |
| 1130 if (d1 != 0) { |
| 1131 tmp1 = JBIG2_GETDWORD(sp) >> shift1; |
| 1132 tmp2 = JBIG2_GETDWORD(dp); |
| 1133 switch (op) { |
| 1134 case JBIG2_COMPOSE_OR: |
| 1135 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 1136 break; |
| 1137 case JBIG2_COMPOSE_AND: |
| 1138 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 1139 break; |
| 1140 case JBIG2_COMPOSE_XOR: |
| 1141 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 1142 break; |
| 1143 case JBIG2_COMPOSE_XNOR: |
| 1144 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 1145 break; |
| 1146 case JBIG2_COMPOSE_REPLACE: |
| 1147 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 1148 break; |
| 1149 } |
| 1150 dp[0] = (uint8_t)(tmp >> 24); |
| 1151 dp[1] = (uint8_t)(tmp >> 16); |
| 1152 dp[2] = (uint8_t)(tmp >> 8); |
| 1153 dp[3] = (uint8_t)tmp; |
| 1154 dp += 4; |
| 1155 } |
| 1156 for (xx = 0; xx < middleDwords; xx++) { |
| 1157 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | |
| 1158 ((JBIG2_GETDWORD(sp + 4)) >> shift1); |
| 1159 tmp2 = JBIG2_GETDWORD(dp); |
| 1160 switch (op) { |
| 1161 case JBIG2_COMPOSE_OR: |
| 1162 tmp = tmp1 | tmp2; |
| 1163 break; |
| 1164 case JBIG2_COMPOSE_AND: |
| 1165 tmp = tmp1 & tmp2; |
| 1166 break; |
| 1167 case JBIG2_COMPOSE_XOR: |
| 1168 tmp = tmp1 ^ tmp2; |
| 1169 break; |
| 1170 case JBIG2_COMPOSE_XNOR: |
| 1171 tmp = ~(tmp1 ^ tmp2); |
| 1172 break; |
| 1173 case JBIG2_COMPOSE_REPLACE: |
| 1174 tmp = tmp1; |
| 1175 break; |
| 1176 } |
| 1177 dp[0] = (uint8_t)(tmp >> 24); |
| 1178 dp[1] = (uint8_t)(tmp >> 16); |
| 1179 dp[2] = (uint8_t)(tmp >> 8); |
| 1180 dp[3] = (uint8_t)tmp; |
| 1181 sp += 4; |
| 1182 dp += 4; |
| 1183 } |
| 1184 if (d2 != 0) { |
| 1185 tmp1 = |
| 1186 (JBIG2_GETDWORD(sp) << shift2) | |
| 1187 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> |
| 1188 shift1); |
| 1189 tmp2 = JBIG2_GETDWORD(dp); |
| 1190 switch (op) { |
| 1191 case JBIG2_COMPOSE_OR: |
| 1192 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1193 break; |
| 1194 case JBIG2_COMPOSE_AND: |
| 1195 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1196 break; |
| 1197 case JBIG2_COMPOSE_XOR: |
| 1198 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1199 break; |
| 1200 case JBIG2_COMPOSE_XNOR: |
| 1201 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1202 break; |
| 1203 case JBIG2_COMPOSE_REPLACE: |
| 1204 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1205 break; |
| 1206 } |
| 1207 dp[0] = (uint8_t)(tmp >> 24); |
| 1208 dp[1] = (uint8_t)(tmp >> 16); |
| 1209 dp[2] = (uint8_t)(tmp >> 8); |
| 1210 dp[3] = (uint8_t)tmp; |
| 1211 } |
| 1212 lineSrc += m_nStride; |
| 1213 lineDst += pDst->m_nStride; |
| 1214 } |
| 56 } | 1215 } |
| 57 } | 1216 } |
| 58 FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) | 1217 return 1; |
| 59 { | 1218 } |
| 60 if (!m_pData) { | 1219 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, |
| 61 return 0; | 1220 int32_t x, |
| 1221 int32_t y, |
| 1222 JBig2ComposeOp op, |
| 1223 const FX_RECT* pSrcRect) { |
| 1224 int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, |
| 1225 lineLeft; |
| 1226 FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, |
| 1227 maskM; |
| 1228 uint8_t *lineSrc, *lineDst, *sp, *dp; |
| 1229 int32_t sw, sh; |
| 1230 if (!m_pData) { |
| 1231 return FALSE; |
| 1232 } |
| 1233 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { |
| 1234 return FALSE; |
| 1235 } |
| 1236 sw = pSrcRect->Width(); |
| 1237 sh = pSrcRect->Height(); |
| 1238 if (y < 0) { |
| 1239 ys0 = -y; |
| 1240 } else { |
| 1241 ys0 = 0; |
| 1242 } |
| 1243 if (y + sh > pDst->m_nHeight) { |
| 1244 ys1 = pDst->m_nHeight - y; |
| 1245 } else { |
| 1246 ys1 = sh; |
| 1247 } |
| 1248 if (x < 0) { |
| 1249 xs0 = -x; |
| 1250 } else { |
| 1251 xs0 = 0; |
| 1252 } |
| 1253 if (x + sw > pDst->m_nWidth) { |
| 1254 xs1 = pDst->m_nWidth - x; |
| 1255 } else { |
| 1256 xs1 = sw; |
| 1257 } |
| 1258 if ((ys0 >= ys1) || (xs0 >= xs1)) { |
| 1259 return 0; |
| 1260 } |
| 1261 w = xs1 - xs0; |
| 1262 h = ys1 - ys0; |
| 1263 if (y < 0) { |
| 1264 yd0 = 0; |
| 1265 } else { |
| 1266 yd0 = y; |
| 1267 } |
| 1268 if (x < 0) { |
| 1269 xd0 = 0; |
| 1270 } else { |
| 1271 xd0 = x; |
| 1272 } |
| 1273 xd1 = xd0 + w; |
| 1274 yd1 = yd0 + h; |
| 1275 d1 = xd0 & 31; |
| 1276 d2 = xd1 & 31; |
| 1277 s1 = xs0 & 31; |
| 1278 maskL = 0xffffffff >> d1; |
| 1279 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); |
| 1280 maskM = maskL & maskR; |
| 1281 lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + |
| 1282 (((xs0 + pSrcRect->left) >> 5) << 2); |
| 1283 lineLeft = m_nStride - ((xs0 >> 5) << 2); |
| 1284 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); |
| 1285 if ((xd0 & ~31) == ((xd1 - 1) & ~31)) { |
| 1286 if ((xs0 & ~31) == ((xs1 - 1) & ~31)) { |
| 1287 if (s1 > d1) { |
| 1288 shift = s1 - d1; |
| 1289 for (yy = yd0; yy < yd1; yy++) { |
| 1290 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; |
| 1291 tmp2 = JBIG2_GETDWORD(lineDst); |
| 1292 switch (op) { |
| 1293 case JBIG2_COMPOSE_OR: |
| 1294 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 1295 break; |
| 1296 case JBIG2_COMPOSE_AND: |
| 1297 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 1298 break; |
| 1299 case JBIG2_COMPOSE_XOR: |
| 1300 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 1301 break; |
| 1302 case JBIG2_COMPOSE_XNOR: |
| 1303 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 1304 break; |
| 1305 case JBIG2_COMPOSE_REPLACE: |
| 1306 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 1307 break; |
| 1308 } |
| 1309 lineDst[0] = (uint8_t)(tmp >> 24); |
| 1310 lineDst[1] = (uint8_t)(tmp >> 16); |
| 1311 lineDst[2] = (uint8_t)(tmp >> 8); |
| 1312 lineDst[3] = (uint8_t)tmp; |
| 1313 lineSrc += m_nStride; |
| 1314 lineDst += pDst->m_nStride; |
| 1315 } |
| 1316 } else { |
| 1317 shift = d1 - s1; |
| 1318 for (yy = yd0; yy < yd1; yy++) { |
| 1319 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; |
| 1320 tmp2 = JBIG2_GETDWORD(lineDst); |
| 1321 switch (op) { |
| 1322 case JBIG2_COMPOSE_OR: |
| 1323 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 1324 break; |
| 1325 case JBIG2_COMPOSE_AND: |
| 1326 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 1327 break; |
| 1328 case JBIG2_COMPOSE_XOR: |
| 1329 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 1330 break; |
| 1331 case JBIG2_COMPOSE_XNOR: |
| 1332 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 1333 break; |
| 1334 case JBIG2_COMPOSE_REPLACE: |
| 1335 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 1336 break; |
| 1337 } |
| 1338 lineDst[0] = (uint8_t)(tmp >> 24); |
| 1339 lineDst[1] = (uint8_t)(tmp >> 16); |
| 1340 lineDst[2] = (uint8_t)(tmp >> 8); |
| 1341 lineDst[3] = (uint8_t)tmp; |
| 1342 lineSrc += m_nStride; |
| 1343 lineDst += pDst->m_nStride; |
| 1344 } |
| 1345 } |
| 1346 } else { |
| 1347 shift1 = s1 - d1; |
| 1348 shift2 = 32 - shift1; |
| 1349 for (yy = yd0; yy < yd1; yy++) { |
| 1350 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | |
| 1351 (JBIG2_GETDWORD(lineSrc + 4) >> shift2); |
| 1352 tmp2 = JBIG2_GETDWORD(lineDst); |
| 1353 switch (op) { |
| 1354 case JBIG2_COMPOSE_OR: |
| 1355 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); |
| 1356 break; |
| 1357 case JBIG2_COMPOSE_AND: |
| 1358 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); |
| 1359 break; |
| 1360 case JBIG2_COMPOSE_XOR: |
| 1361 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); |
| 1362 break; |
| 1363 case JBIG2_COMPOSE_XNOR: |
| 1364 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); |
| 1365 break; |
| 1366 case JBIG2_COMPOSE_REPLACE: |
| 1367 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); |
| 1368 break; |
| 1369 } |
| 1370 lineDst[0] = (uint8_t)(tmp >> 24); |
| 1371 lineDst[1] = (uint8_t)(tmp >> 16); |
| 1372 lineDst[2] = (uint8_t)(tmp >> 8); |
| 1373 lineDst[3] = (uint8_t)tmp; |
| 1374 lineSrc += m_nStride; |
| 1375 lineDst += pDst->m_nStride; |
| 1376 } |
| 62 } | 1377 } |
| 63 int32_t m, n; | 1378 } else { |
| 64 if(x < 0 || x >= m_nWidth) { | 1379 if (s1 > d1) { |
| 65 return 0; | 1380 shift1 = s1 - d1; |
| 1381 shift2 = 32 - shift1; |
| 1382 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 1383 for (yy = yd0; yy < yd1; yy++) { |
| 1384 sp = lineSrc; |
| 1385 dp = lineDst; |
| 1386 if (d1 != 0) { |
| 1387 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | |
| 1388 (JBIG2_GETDWORD(sp + 4) >> shift2); |
| 1389 tmp2 = JBIG2_GETDWORD(dp); |
| 1390 switch (op) { |
| 1391 case JBIG2_COMPOSE_OR: |
| 1392 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 1393 break; |
| 1394 case JBIG2_COMPOSE_AND: |
| 1395 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 1396 break; |
| 1397 case JBIG2_COMPOSE_XOR: |
| 1398 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 1399 break; |
| 1400 case JBIG2_COMPOSE_XNOR: |
| 1401 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 1402 break; |
| 1403 case JBIG2_COMPOSE_REPLACE: |
| 1404 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 1405 break; |
| 1406 } |
| 1407 dp[0] = (uint8_t)(tmp >> 24); |
| 1408 dp[1] = (uint8_t)(tmp >> 16); |
| 1409 dp[2] = (uint8_t)(tmp >> 8); |
| 1410 dp[3] = (uint8_t)tmp; |
| 1411 sp += 4; |
| 1412 dp += 4; |
| 1413 } |
| 1414 for (xx = 0; xx < middleDwords; xx++) { |
| 1415 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | |
| 1416 (JBIG2_GETDWORD(sp + 4) >> shift2); |
| 1417 tmp2 = JBIG2_GETDWORD(dp); |
| 1418 switch (op) { |
| 1419 case JBIG2_COMPOSE_OR: |
| 1420 tmp = tmp1 | tmp2; |
| 1421 break; |
| 1422 case JBIG2_COMPOSE_AND: |
| 1423 tmp = tmp1 & tmp2; |
| 1424 break; |
| 1425 case JBIG2_COMPOSE_XOR: |
| 1426 tmp = tmp1 ^ tmp2; |
| 1427 break; |
| 1428 case JBIG2_COMPOSE_XNOR: |
| 1429 tmp = ~(tmp1 ^ tmp2); |
| 1430 break; |
| 1431 case JBIG2_COMPOSE_REPLACE: |
| 1432 tmp = tmp1; |
| 1433 break; |
| 1434 } |
| 1435 dp[0] = (uint8_t)(tmp >> 24); |
| 1436 dp[1] = (uint8_t)(tmp >> 16); |
| 1437 dp[2] = (uint8_t)(tmp >> 8); |
| 1438 dp[3] = (uint8_t)tmp; |
| 1439 sp += 4; |
| 1440 dp += 4; |
| 1441 } |
| 1442 if (d2 != 0) { |
| 1443 tmp1 = |
| 1444 (JBIG2_GETDWORD(sp) << shift1) | |
| 1445 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> |
| 1446 shift2); |
| 1447 tmp2 = JBIG2_GETDWORD(dp); |
| 1448 switch (op) { |
| 1449 case JBIG2_COMPOSE_OR: |
| 1450 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1451 break; |
| 1452 case JBIG2_COMPOSE_AND: |
| 1453 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1454 break; |
| 1455 case JBIG2_COMPOSE_XOR: |
| 1456 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1457 break; |
| 1458 case JBIG2_COMPOSE_XNOR: |
| 1459 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1460 break; |
| 1461 case JBIG2_COMPOSE_REPLACE: |
| 1462 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1463 break; |
| 1464 } |
| 1465 dp[0] = (uint8_t)(tmp >> 24); |
| 1466 dp[1] = (uint8_t)(tmp >> 16); |
| 1467 dp[2] = (uint8_t)(tmp >> 8); |
| 1468 dp[3] = (uint8_t)tmp; |
| 1469 } |
| 1470 lineSrc += m_nStride; |
| 1471 lineDst += pDst->m_nStride; |
| 1472 } |
| 1473 } else if (s1 == d1) { |
| 1474 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 1475 for (yy = yd0; yy < yd1; yy++) { |
| 1476 sp = lineSrc; |
| 1477 dp = lineDst; |
| 1478 if (d1 != 0) { |
| 1479 tmp1 = JBIG2_GETDWORD(sp); |
| 1480 tmp2 = JBIG2_GETDWORD(dp); |
| 1481 switch (op) { |
| 1482 case JBIG2_COMPOSE_OR: |
| 1483 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 1484 break; |
| 1485 case JBIG2_COMPOSE_AND: |
| 1486 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 1487 break; |
| 1488 case JBIG2_COMPOSE_XOR: |
| 1489 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 1490 break; |
| 1491 case JBIG2_COMPOSE_XNOR: |
| 1492 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 1493 break; |
| 1494 case JBIG2_COMPOSE_REPLACE: |
| 1495 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 1496 break; |
| 1497 } |
| 1498 dp[0] = (uint8_t)(tmp >> 24); |
| 1499 dp[1] = (uint8_t)(tmp >> 16); |
| 1500 dp[2] = (uint8_t)(tmp >> 8); |
| 1501 dp[3] = (uint8_t)tmp; |
| 1502 sp += 4; |
| 1503 dp += 4; |
| 1504 } |
| 1505 for (xx = 0; xx < middleDwords; xx++) { |
| 1506 tmp1 = JBIG2_GETDWORD(sp); |
| 1507 tmp2 = JBIG2_GETDWORD(dp); |
| 1508 switch (op) { |
| 1509 case JBIG2_COMPOSE_OR: |
| 1510 tmp = tmp1 | tmp2; |
| 1511 break; |
| 1512 case JBIG2_COMPOSE_AND: |
| 1513 tmp = tmp1 & tmp2; |
| 1514 break; |
| 1515 case JBIG2_COMPOSE_XOR: |
| 1516 tmp = tmp1 ^ tmp2; |
| 1517 break; |
| 1518 case JBIG2_COMPOSE_XNOR: |
| 1519 tmp = ~(tmp1 ^ tmp2); |
| 1520 break; |
| 1521 case JBIG2_COMPOSE_REPLACE: |
| 1522 tmp = tmp1; |
| 1523 break; |
| 1524 } |
| 1525 dp[0] = (uint8_t)(tmp >> 24); |
| 1526 dp[1] = (uint8_t)(tmp >> 16); |
| 1527 dp[2] = (uint8_t)(tmp >> 8); |
| 1528 dp[3] = (uint8_t)tmp; |
| 1529 sp += 4; |
| 1530 dp += 4; |
| 1531 } |
| 1532 if (d2 != 0) { |
| 1533 tmp1 = JBIG2_GETDWORD(sp); |
| 1534 tmp2 = JBIG2_GETDWORD(dp); |
| 1535 switch (op) { |
| 1536 case JBIG2_COMPOSE_OR: |
| 1537 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1538 break; |
| 1539 case JBIG2_COMPOSE_AND: |
| 1540 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1541 break; |
| 1542 case JBIG2_COMPOSE_XOR: |
| 1543 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1544 break; |
| 1545 case JBIG2_COMPOSE_XNOR: |
| 1546 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1547 break; |
| 1548 case JBIG2_COMPOSE_REPLACE: |
| 1549 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1550 break; |
| 1551 } |
| 1552 dp[0] = (uint8_t)(tmp >> 24); |
| 1553 dp[1] = (uint8_t)(tmp >> 16); |
| 1554 dp[2] = (uint8_t)(tmp >> 8); |
| 1555 dp[3] = (uint8_t)tmp; |
| 1556 } |
| 1557 lineSrc += m_nStride; |
| 1558 lineDst += pDst->m_nStride; |
| 1559 } |
| 1560 } else { |
| 1561 shift1 = d1 - s1; |
| 1562 shift2 = 32 - shift1; |
| 1563 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); |
| 1564 for (yy = yd0; yy < yd1; yy++) { |
| 1565 sp = lineSrc; |
| 1566 dp = lineDst; |
| 1567 if (d1 != 0) { |
| 1568 tmp1 = JBIG2_GETDWORD(sp) >> shift1; |
| 1569 tmp2 = JBIG2_GETDWORD(dp); |
| 1570 switch (op) { |
| 1571 case JBIG2_COMPOSE_OR: |
| 1572 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); |
| 1573 break; |
| 1574 case JBIG2_COMPOSE_AND: |
| 1575 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); |
| 1576 break; |
| 1577 case JBIG2_COMPOSE_XOR: |
| 1578 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); |
| 1579 break; |
| 1580 case JBIG2_COMPOSE_XNOR: |
| 1581 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); |
| 1582 break; |
| 1583 case JBIG2_COMPOSE_REPLACE: |
| 1584 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); |
| 1585 break; |
| 1586 } |
| 1587 dp[0] = (uint8_t)(tmp >> 24); |
| 1588 dp[1] = (uint8_t)(tmp >> 16); |
| 1589 dp[2] = (uint8_t)(tmp >> 8); |
| 1590 dp[3] = (uint8_t)tmp; |
| 1591 dp += 4; |
| 1592 } |
| 1593 for (xx = 0; xx < middleDwords; xx++) { |
| 1594 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | |
| 1595 ((JBIG2_GETDWORD(sp + 4)) >> shift1); |
| 1596 tmp2 = JBIG2_GETDWORD(dp); |
| 1597 switch (op) { |
| 1598 case JBIG2_COMPOSE_OR: |
| 1599 tmp = tmp1 | tmp2; |
| 1600 break; |
| 1601 case JBIG2_COMPOSE_AND: |
| 1602 tmp = tmp1 & tmp2; |
| 1603 break; |
| 1604 case JBIG2_COMPOSE_XOR: |
| 1605 tmp = tmp1 ^ tmp2; |
| 1606 break; |
| 1607 case JBIG2_COMPOSE_XNOR: |
| 1608 tmp = ~(tmp1 ^ tmp2); |
| 1609 break; |
| 1610 case JBIG2_COMPOSE_REPLACE: |
| 1611 tmp = tmp1; |
| 1612 break; |
| 1613 } |
| 1614 dp[0] = (uint8_t)(tmp >> 24); |
| 1615 dp[1] = (uint8_t)(tmp >> 16); |
| 1616 dp[2] = (uint8_t)(tmp >> 8); |
| 1617 dp[3] = (uint8_t)tmp; |
| 1618 sp += 4; |
| 1619 dp += 4; |
| 1620 } |
| 1621 if (d2 != 0) { |
| 1622 tmp1 = |
| 1623 (JBIG2_GETDWORD(sp) << shift2) | |
| 1624 (((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> |
| 1625 shift1); |
| 1626 tmp2 = JBIG2_GETDWORD(dp); |
| 1627 switch (op) { |
| 1628 case JBIG2_COMPOSE_OR: |
| 1629 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); |
| 1630 break; |
| 1631 case JBIG2_COMPOSE_AND: |
| 1632 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); |
| 1633 break; |
| 1634 case JBIG2_COMPOSE_XOR: |
| 1635 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); |
| 1636 break; |
| 1637 case JBIG2_COMPOSE_XNOR: |
| 1638 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); |
| 1639 break; |
| 1640 case JBIG2_COMPOSE_REPLACE: |
| 1641 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); |
| 1642 break; |
| 1643 } |
| 1644 dp[0] = (uint8_t)(tmp >> 24); |
| 1645 dp[1] = (uint8_t)(tmp >> 16); |
| 1646 dp[2] = (uint8_t)(tmp >> 8); |
| 1647 dp[3] = (uint8_t)tmp; |
| 1648 } |
| 1649 lineSrc += m_nStride; |
| 1650 lineDst += pDst->m_nStride; |
| 1651 } |
| 66 } | 1652 } |
| 67 if(y < 0 || y >= m_nHeight) { | 1653 } |
| 68 return 0; | 1654 return 1; |
| 69 } | 1655 } |
| 70 m = y * m_nStride + (x >> 3); | |
| 71 n = x & 7; | |
| 72 return ((m_pData[m] >> (7 - n)) & 1); | |
| 73 } | |
| 74 | |
| 75 int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) | |
| 76 { | |
| 77 if (!m_pData) { | |
| 78 return 0; | |
| 79 } | |
| 80 int32_t m, n; | |
| 81 if(x < 0 || x >= m_nWidth) { | |
| 82 return 0; | |
| 83 } | |
| 84 if(y < 0 || y >= m_nHeight) { | |
| 85 return 0; | |
| 86 } | |
| 87 m = y * m_nStride + (x >> 3); | |
| 88 n = x & 7; | |
| 89 if(v) { | |
| 90 m_pData[m] |= 1 << (7 - n); | |
| 91 } else { | |
| 92 m_pData[m] &= ~(1 << (7 - n)); | |
| 93 } | |
| 94 return 1; | |
| 95 } | |
| 96 void CJBig2_Image::copyLine(int32_t hTo, int32_t hFrom) | |
| 97 { | |
| 98 if (!m_pData) { | |
| 99 return; | |
| 100 } | |
| 101 if(hFrom < 0 || hFrom >= m_nHeight) { | |
| 102 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride); | |
| 103 } else { | |
| 104 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_n
Stride); | |
| 105 } | |
| 106 } | |
| 107 void CJBig2_Image::fill(FX_BOOL v) | |
| 108 { | |
| 109 if (!m_pData) { | |
| 110 return; | |
| 111 } | |
| 112 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight); | |
| 113 } | |
| 114 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2C
omposeOp op) | |
| 115 { | |
| 116 if (!m_pData) { | |
| 117 return FALSE; | |
| 118 } | |
| 119 return composeTo_opt2(pDst, x, y, op); | |
| 120 } | |
| 121 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2C
omposeOp op, const FX_RECT* pSrcRect) | |
| 122 { | |
| 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 FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, int32_t x, int32_t y,
JBig2ComposeOp op) | |
| 132 { | |
| 133 int32_t w, h, dx, dy; | |
| 134 int32_t i, j; | |
| 135 w = m_nWidth; | |
| 136 h = m_nHeight; | |
| 137 dx = dy = 0; | |
| 138 if(x < 0) { | |
| 139 dx += -x; | |
| 140 w -= -x; | |
| 141 x = 0; | |
| 142 } | |
| 143 if(y < 0) { | |
| 144 dy += -y; | |
| 145 h -= -y; | |
| 146 y = 0; | |
| 147 } | |
| 148 if(x + w > pDst->m_nWidth) { | |
| 149 w = pDst->m_nWidth - x; | |
| 150 } | |
| 151 if(y + h > pDst->m_nHeight) { | |
| 152 h = pDst->m_nHeight - y; | |
| 153 } | |
| 154 switch(op) { | |
| 155 case JBIG2_COMPOSE_OR: | |
| 156 for(j = 0; j < h; j++) { | |
| 157 for(i = 0; i < w; i++) { | |
| 158 pDst->setPixel(x + i, y + j, | |
| 159 (getPixel(i + dx, j + dy) | pDst->getPixel(x
+ i, y + j)) & 1); | |
| 160 } | |
| 161 } | |
| 162 break; | |
| 163 case JBIG2_COMPOSE_AND: | |
| 164 for(j = 0; j < h; j++) { | |
| 165 for(i = 0; i < w; i++) { | |
| 166 pDst->setPixel(x + i, y + j, | |
| 167 (getPixel(i + dx, j + dy) & pDst->getPixel(x
+ i, y + j)) & 1); | |
| 168 } | |
| 169 } | |
| 170 break; | |
| 171 case JBIG2_COMPOSE_XOR: | |
| 172 for(j = 0; j < h; j++) { | |
| 173 for(i = 0; i < w; i++) { | |
| 174 pDst->setPixel(x + i, y + j, | |
| 175 (getPixel(i + dx, j + dy) ^ pDst->getPixel(x
+ i, y + j)) & 1); | |
| 176 } | |
| 177 } | |
| 178 break; | |
| 179 case JBIG2_COMPOSE_XNOR: | |
| 180 for(j = 0; j < h; j++) { | |
| 181 for(i = 0; i < w; i++) { | |
| 182 pDst->setPixel(x + i, y + j, | |
| 183 (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(
x + i, y + j))) & 1); | |
| 184 } | |
| 185 } | |
| 186 break; | |
| 187 case JBIG2_COMPOSE_REPLACE: | |
| 188 for(j = 0; j < h; j++) { | |
| 189 for(i = 0; i < w; i++) { | |
| 190 pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy)); | |
| 191 } | |
| 192 } | |
| 193 break; | |
| 194 } | |
| 195 return TRUE; | |
| 196 } | |
| 197 | |
| 198 FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, int32_t x, int32_t y, JB
ig2ComposeOp op) | |
| 199 { | |
| 200 int32_t x0, x1, y0, y1, xx, yy; | |
| 201 uint8_t *pLineSrc, *pLineDst, *srcPtr, *destPtr; | |
| 202 FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3; | |
| 203 FX_BOOL oneByte; | |
| 204 if (!m_pData) { | |
| 205 return FALSE; | |
| 206 } | |
| 207 if (y < 0) { | |
| 208 y0 = -y; | |
| 209 } else { | |
| 210 y0 = 0; | |
| 211 } | |
| 212 if (y + m_nHeight > pDst->m_nHeight) { | |
| 213 y1 = pDst->m_nHeight - y; | |
| 214 } else { | |
| 215 y1 = m_nHeight; | |
| 216 } | |
| 217 if (y0 >= y1) { | |
| 218 return FALSE; | |
| 219 } | |
| 220 if (x >= 0) { | |
| 221 x0 = x & ~7; | |
| 222 } else { | |
| 223 x0 = 0; | |
| 224 } | |
| 225 x1 = x + m_nWidth; | |
| 226 if (x1 > pDst->m_nWidth) { | |
| 227 x1 = pDst->m_nWidth; | |
| 228 } | |
| 229 if (x0 >= x1) { | |
| 230 return FALSE; | |
| 231 } | |
| 232 s1 = x & 7; | |
| 233 s2 = 8 - s1; | |
| 234 m1 = 0xff >> (x1 & 7); | |
| 235 m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); | |
| 236 m3 = (0xff >> s1) & m2; | |
| 237 oneByte = x0 == ((x1 - 1) & ~7); | |
| 238 pLineDst = pDst->m_pData + y * pDst->m_nStride; | |
| 239 pLineSrc = m_pData + y0 * m_nStride; | |
| 240 if(oneByte) { | |
| 241 if(x >= 0) { | |
| 242 switch(op) { | |
| 243 case JBIG2_COMPOSE_OR: { | |
| 244 for (yy = y0; yy < y1; ++yy) { | |
| 245 destPtr = pLineDst + (x >> 3); | |
| 246 srcPtr = pLineSrc; | |
| 247 dest = *destPtr; | |
| 248 dest |= (*srcPtr >> s1) & m2; | |
| 249 *destPtr = (uint8_t)dest; | |
| 250 pLineDst += pDst->m_nStride; | |
| 251 pLineSrc += m_nStride; | |
| 252 } | |
| 253 } | |
| 254 break; | |
| 255 case JBIG2_COMPOSE_AND: { | |
| 256 for (yy = y0; yy < y1; ++yy) { | |
| 257 destPtr = pLineDst + (x >> 3); | |
| 258 srcPtr = pLineSrc; | |
| 259 dest = *destPtr; | |
| 260 dest &= ((0xff00 | *srcPtr) >> s1) | m1; | |
| 261 *destPtr = (uint8_t)dest; | |
| 262 pLineDst += pDst->m_nStride; | |
| 263 pLineSrc += m_nStride; | |
| 264 } | |
| 265 } | |
| 266 break; | |
| 267 case JBIG2_COMPOSE_XOR: { | |
| 268 for (yy = y0; yy < y1; ++yy) { | |
| 269 destPtr = pLineDst + (x >> 3); | |
| 270 srcPtr = pLineSrc; | |
| 271 dest = *destPtr; | |
| 272 dest ^= (*srcPtr >> s1) & m2; | |
| 273 *destPtr = (uint8_t)dest; | |
| 274 pLineDst += pDst->m_nStride; | |
| 275 pLineSrc += m_nStride; | |
| 276 } | |
| 277 } | |
| 278 break; | |
| 279 case JBIG2_COMPOSE_XNOR: { | |
| 280 for (yy = y0; yy < y1; ++yy) { | |
| 281 destPtr = pLineDst + (x >> 3); | |
| 282 srcPtr = pLineSrc; | |
| 283 dest = *destPtr; | |
| 284 dest ^= ((*srcPtr ^ 0xff) >> s1) & m2; | |
| 285 *destPtr = (uint8_t)dest; | |
| 286 pLineDst += pDst->m_nStride; | |
| 287 pLineSrc += m_nStride; | |
| 288 } | |
| 289 } | |
| 290 break; | |
| 291 case JBIG2_COMPOSE_REPLACE: { | |
| 292 for (yy = y0; yy < y1; ++yy) { | |
| 293 destPtr = pLineDst + (x >> 3); | |
| 294 srcPtr = pLineSrc; | |
| 295 dest = *destPtr; | |
| 296 dest = (dest & ~m3) | ((*srcPtr >> s1) & m3); | |
| 297 *destPtr = (uint8_t)dest; | |
| 298 pLineDst += pDst->m_nStride; | |
| 299 pLineSrc += m_nStride; | |
| 300 } | |
| 301 } | |
| 302 break; | |
| 303 } | |
| 304 } else { | |
| 305 switch(op) { | |
| 306 case JBIG2_COMPOSE_OR: { | |
| 307 for(yy = y0; yy < y1; ++yy) { | |
| 308 destPtr = pLineDst; | |
| 309 srcPtr = pLineSrc + (-x >> 3); | |
| 310 dest = *destPtr; | |
| 311 dest |= *srcPtr & m2; | |
| 312 *destPtr = (uint8_t)dest; | |
| 313 pLineDst += pDst->m_nStride; | |
| 314 pLineSrc += m_nStride; | |
| 315 } | |
| 316 } | |
| 317 break; | |
| 318 case JBIG2_COMPOSE_AND: { | |
| 319 for(yy = y0; yy < y1; ++yy) { | |
| 320 destPtr = pLineDst; | |
| 321 srcPtr = pLineSrc + (-x >> 3); | |
| 322 dest = *destPtr; | |
| 323 dest &= *srcPtr | m1; | |
| 324 *destPtr = (uint8_t)dest; | |
| 325 pLineDst += pDst->m_nStride; | |
| 326 pLineSrc += m_nStride; | |
| 327 } | |
| 328 } | |
| 329 break; | |
| 330 case JBIG2_COMPOSE_XOR: { | |
| 331 for(yy = y0; yy < y1; ++yy) { | |
| 332 destPtr = pLineDst; | |
| 333 srcPtr = pLineSrc + (-x >> 3); | |
| 334 dest = *destPtr; | |
| 335 dest ^= *srcPtr & m2; | |
| 336 *destPtr = (uint8_t)dest; | |
| 337 pLineDst += pDst->m_nStride; | |
| 338 pLineSrc += m_nStride; | |
| 339 } | |
| 340 } | |
| 341 break; | |
| 342 case JBIG2_COMPOSE_XNOR: { | |
| 343 for(yy = y0; yy < y1; ++yy) { | |
| 344 destPtr = pLineDst; | |
| 345 srcPtr = pLineSrc + (-x >> 3); | |
| 346 dest = *destPtr; | |
| 347 dest ^= (*srcPtr ^ 0xff) & m2; | |
| 348 *destPtr = (uint8_t)dest; | |
| 349 pLineDst += pDst->m_nStride; | |
| 350 pLineSrc += m_nStride; | |
| 351 } | |
| 352 } | |
| 353 break; | |
| 354 case JBIG2_COMPOSE_REPLACE: { | |
| 355 for(yy = y0; yy < y1; ++yy) { | |
| 356 destPtr = pLineDst; | |
| 357 srcPtr = pLineSrc + (-x >> 3); | |
| 358 dest = *destPtr; | |
| 359 dest = (*srcPtr & m2) | (dest & m1); | |
| 360 *destPtr = (uint8_t)dest; | |
| 361 pLineDst += pDst->m_nStride; | |
| 362 pLineSrc += m_nStride; | |
| 363 } | |
| 364 } | |
| 365 break; | |
| 366 } | |
| 367 } | |
| 368 } else { | |
| 369 if(x >= 0) { | |
| 370 switch(op) { | |
| 371 case JBIG2_COMPOSE_OR: { | |
| 372 for(yy = y0; yy < y1; ++yy) { | |
| 373 destPtr = pLineDst + (x >> 3); | |
| 374 srcPtr = pLineSrc; | |
| 375 src1 = *srcPtr++; | |
| 376 dest = *destPtr; | |
| 377 dest |= src1 >> s1; | |
| 378 *destPtr++ = (uint8_t)dest; | |
| 379 xx = x0 + 8; | |
| 380 for (; xx < x1 - 8; xx += 8) { | |
| 381 dest = *destPtr; | |
| 382 src0 = src1; | |
| 383 src1 = *srcPtr++; | |
| 384 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 385 dest |= src; | |
| 386 *destPtr++ = (uint8_t)dest; | |
| 387 } | |
| 388 dest = *destPtr; | |
| 389 src0 = src1; | |
| 390 if(srcPtr - pLineSrc < m_nStride) { | |
| 391 src1 = *srcPtr++; | |
| 392 } else { | |
| 393 src1 = 0; | |
| 394 } | |
| 395 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 396 dest |= src & m2; | |
| 397 *destPtr = (uint8_t)dest; | |
| 398 pLineDst += pDst->m_nStride; | |
| 399 pLineSrc += m_nStride; | |
| 400 } | |
| 401 } | |
| 402 break; | |
| 403 case JBIG2_COMPOSE_AND: { | |
| 404 for(yy = y0; yy < y1; ++yy) { | |
| 405 destPtr = pLineDst + (x >> 3); | |
| 406 srcPtr = pLineSrc; | |
| 407 src1 = *srcPtr++; | |
| 408 dest = *destPtr; | |
| 409 dest &= (0xff00 | src1) >> s1; | |
| 410 *destPtr++ = (uint8_t)dest; | |
| 411 xx = x0 + 8; | |
| 412 for (; xx < x1 - 8; xx += 8) { | |
| 413 dest = *destPtr; | |
| 414 src0 = src1; | |
| 415 src1 = *srcPtr++; | |
| 416 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 417 dest &= src; | |
| 418 *destPtr++ = (uint8_t)dest; | |
| 419 } | |
| 420 dest = *destPtr; | |
| 421 src0 = src1; | |
| 422 if(srcPtr - pLineSrc < m_nStride) { | |
| 423 src1 = *srcPtr++; | |
| 424 } else { | |
| 425 src1 = 0; | |
| 426 } | |
| 427 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 428 dest &= src | m1; | |
| 429 *destPtr = (uint8_t)dest; | |
| 430 pLineDst += pDst->m_nStride; | |
| 431 pLineSrc += m_nStride; | |
| 432 } | |
| 433 } | |
| 434 break; | |
| 435 case JBIG2_COMPOSE_XOR: { | |
| 436 for(yy = y0; yy < y1; ++yy) { | |
| 437 destPtr = pLineDst + (x >> 3); | |
| 438 srcPtr = pLineSrc; | |
| 439 src1 = *srcPtr++; | |
| 440 dest = *destPtr; | |
| 441 dest ^= src1 >> s1; | |
| 442 *destPtr++ = (uint8_t)dest; | |
| 443 xx = x0 + 8; | |
| 444 for (; xx < x1 - 8; xx += 8) { | |
| 445 dest = *destPtr; | |
| 446 src0 = src1; | |
| 447 src1 = *srcPtr++; | |
| 448 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 449 dest ^= src; | |
| 450 *destPtr++ = (uint8_t)dest; | |
| 451 } | |
| 452 dest = *destPtr; | |
| 453 src0 = src1; | |
| 454 if(srcPtr - pLineSrc < m_nStride) { | |
| 455 src1 = *srcPtr++; | |
| 456 } else { | |
| 457 src1 = 0; | |
| 458 } | |
| 459 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 460 dest ^= src & m2; | |
| 461 *destPtr = (uint8_t)dest; | |
| 462 pLineDst += pDst->m_nStride; | |
| 463 pLineSrc += m_nStride; | |
| 464 } | |
| 465 } | |
| 466 break; | |
| 467 case JBIG2_COMPOSE_XNOR: { | |
| 468 for(yy = y0; yy < y1; ++yy) { | |
| 469 destPtr = pLineDst + (x >> 3); | |
| 470 srcPtr = pLineSrc; | |
| 471 src1 = *srcPtr++; | |
| 472 dest = *destPtr; | |
| 473 dest ^= (src1 ^ 0xff) >> s1; | |
| 474 *destPtr++ = (uint8_t)dest; | |
| 475 xx = x0 + 8; | |
| 476 for (; xx < x1 - 8; xx += 8) { | |
| 477 dest = *destPtr; | |
| 478 src0 = src1; | |
| 479 src1 = *srcPtr++; | |
| 480 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 481 dest ^= src ^ 0xff; | |
| 482 *destPtr++ = (uint8_t)dest; | |
| 483 } | |
| 484 dest = *destPtr; | |
| 485 src0 = src1; | |
| 486 if(srcPtr - pLineSrc < m_nStride) { | |
| 487 src1 = *srcPtr++; | |
| 488 } else { | |
| 489 src1 = 0; | |
| 490 } | |
| 491 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 492 dest ^= (src ^ 0xff) & m2; | |
| 493 *destPtr = (uint8_t)dest; | |
| 494 pLineDst += pDst->m_nStride; | |
| 495 pLineSrc += m_nStride; | |
| 496 } | |
| 497 } | |
| 498 break; | |
| 499 case JBIG2_COMPOSE_REPLACE: { | |
| 500 for(yy = y0; yy < y1; ++yy) { | |
| 501 destPtr = pLineDst + (x >> 3); | |
| 502 srcPtr = pLineSrc; | |
| 503 src1 = *srcPtr++; | |
| 504 dest = *destPtr; | |
| 505 dest = (dest & (0xff << s2)) | (src1 >> s1); | |
| 506 *destPtr++ = (uint8_t)dest; | |
| 507 xx = x0 + 8; | |
| 508 for (; xx < x1 - 8; xx += 8) { | |
| 509 dest = *destPtr; | |
| 510 src0 = src1; | |
| 511 src1 = *srcPtr++; | |
| 512 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 513 dest = src; | |
| 514 *destPtr++ = (uint8_t)dest; | |
| 515 } | |
| 516 dest = *destPtr; | |
| 517 src0 = src1; | |
| 518 if(srcPtr - pLineSrc < m_nStride) { | |
| 519 src1 = *srcPtr++; | |
| 520 } else { | |
| 521 src1 = 0; | |
| 522 } | |
| 523 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 524 dest = (src & m2) | (dest & m1); | |
| 525 *destPtr = (uint8_t)dest; | |
| 526 pLineDst += pDst->m_nStride; | |
| 527 pLineSrc += m_nStride; | |
| 528 } | |
| 529 } | |
| 530 break; | |
| 531 } | |
| 532 } else { | |
| 533 switch(op) { | |
| 534 case JBIG2_COMPOSE_OR: { | |
| 535 for(yy = y0; yy < y1; ++yy) { | |
| 536 destPtr = pLineDst; | |
| 537 srcPtr = pLineSrc + (-x >> 3); | |
| 538 src1 = *srcPtr++; | |
| 539 xx = x0; | |
| 540 for (; xx < x1 - 8; xx += 8) { | |
| 541 dest = *destPtr; | |
| 542 src0 = src1; | |
| 543 src1 = *srcPtr++; | |
| 544 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 545 dest |= src; | |
| 546 *destPtr++ = (uint8_t)dest; | |
| 547 } | |
| 548 dest = *destPtr; | |
| 549 src0 = src1; | |
| 550 if(srcPtr - pLineSrc < m_nStride) { | |
| 551 src1 = *srcPtr++; | |
| 552 } else { | |
| 553 src1 = 0; | |
| 554 } | |
| 555 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 556 dest |= src & m2; | |
| 557 *destPtr = (uint8_t)dest; | |
| 558 pLineDst += pDst->m_nStride; | |
| 559 pLineSrc += m_nStride; | |
| 560 } | |
| 561 } | |
| 562 break; | |
| 563 case JBIG2_COMPOSE_AND: { | |
| 564 for(yy = y0; yy < y1; ++yy) { | |
| 565 destPtr = pLineDst; | |
| 566 srcPtr = pLineSrc + (-x >> 3); | |
| 567 src1 = *srcPtr++; | |
| 568 xx = x0; | |
| 569 for (; xx < x1 - 8; xx += 8) { | |
| 570 dest = *destPtr; | |
| 571 src0 = src1; | |
| 572 src1 = *srcPtr++; | |
| 573 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 574 dest &= src; | |
| 575 *destPtr++ = (uint8_t)dest; | |
| 576 } | |
| 577 dest = *destPtr; | |
| 578 src0 = src1; | |
| 579 if(srcPtr - pLineSrc < m_nStride) { | |
| 580 src1 = *srcPtr++; | |
| 581 } else { | |
| 582 src1 = 0; | |
| 583 } | |
| 584 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 585 dest &= src | m1; | |
| 586 *destPtr = (uint8_t)dest; | |
| 587 pLineDst += pDst->m_nStride; | |
| 588 pLineSrc += m_nStride; | |
| 589 } | |
| 590 } | |
| 591 break; | |
| 592 case JBIG2_COMPOSE_XOR: { | |
| 593 for(yy = y0; yy < y1; ++yy) { | |
| 594 destPtr = pLineDst; | |
| 595 srcPtr = pLineSrc + (-x >> 3); | |
| 596 src1 = *srcPtr++; | |
| 597 xx = x0; | |
| 598 for (; xx < x1 - 8; xx += 8) { | |
| 599 dest = *destPtr; | |
| 600 src0 = src1; | |
| 601 src1 = *srcPtr++; | |
| 602 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 603 dest ^= src; | |
| 604 *destPtr++ = (uint8_t)dest; | |
| 605 } | |
| 606 dest = *destPtr; | |
| 607 src0 = src1; | |
| 608 if(srcPtr - pLineSrc < m_nStride) { | |
| 609 src1 = *srcPtr++; | |
| 610 } else { | |
| 611 src1 = 0; | |
| 612 } | |
| 613 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 614 dest ^= src & m2; | |
| 615 *destPtr = (uint8_t)dest; | |
| 616 pLineDst += pDst->m_nStride; | |
| 617 pLineSrc += m_nStride; | |
| 618 } | |
| 619 } | |
| 620 break; | |
| 621 case JBIG2_COMPOSE_XNOR: { | |
| 622 for(yy = y0; yy < y1; ++yy) { | |
| 623 destPtr = pLineDst; | |
| 624 srcPtr = pLineSrc + (-x >> 3); | |
| 625 src1 = *srcPtr++; | |
| 626 xx = x0; | |
| 627 for (; xx < x1 - 8; xx += 8) { | |
| 628 dest = *destPtr; | |
| 629 src0 = src1; | |
| 630 src1 = *srcPtr++; | |
| 631 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 632 dest ^= src ^ 0xff; | |
| 633 *destPtr++ = (uint8_t)dest; | |
| 634 } | |
| 635 dest = *destPtr; | |
| 636 src0 = src1; | |
| 637 if(srcPtr - pLineSrc < m_nStride) { | |
| 638 src1 = *srcPtr++; | |
| 639 } else { | |
| 640 src1 = 0; | |
| 641 } | |
| 642 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 643 dest ^= (src ^ 0xff) & m2; | |
| 644 *destPtr = (uint8_t)dest; | |
| 645 pLineDst += pDst->m_nStride; | |
| 646 pLineSrc += m_nStride; | |
| 647 } | |
| 648 } | |
| 649 break; | |
| 650 case JBIG2_COMPOSE_REPLACE: { | |
| 651 for(yy = y0; yy < y1; ++yy) { | |
| 652 destPtr = pLineDst; | |
| 653 srcPtr = pLineSrc + (-x >> 3); | |
| 654 src1 = *srcPtr++; | |
| 655 xx = x0; | |
| 656 for (; xx < x1 - 8; xx += 8) { | |
| 657 dest = *destPtr; | |
| 658 src0 = src1; | |
| 659 src1 = *srcPtr++; | |
| 660 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 661 dest = src; | |
| 662 *destPtr++ = (uint8_t)dest; | |
| 663 } | |
| 664 dest = *destPtr; | |
| 665 src0 = src1; | |
| 666 if(srcPtr - pLineSrc < m_nStride) { | |
| 667 src1 = *srcPtr++; | |
| 668 } else { | |
| 669 src1 = 0; | |
| 670 } | |
| 671 src = (((src0 << 8) | src1) >> s1) & 0xff; | |
| 672 dest = (src & m2) | (dest & m1); | |
| 673 *destPtr = (uint8_t)dest; | |
| 674 pLineDst += pDst->m_nStride; | |
| 675 pLineSrc += m_nStride; | |
| 676 } | |
| 677 } | |
| 678 break; | |
| 679 } | |
| 680 } | |
| 681 } | |
| 682 return TRUE; | |
| 683 } | |
| 684 FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig
2ComposeOp op) | |
| 685 { | |
| 686 if (!m_pData) { | |
| 687 return FALSE; | |
| 688 } | |
| 689 return pSrc->composeTo(this, x, y, op); | |
| 690 } | |
| 691 FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig
2ComposeOp op, const FX_RECT* pSrcRect) | |
| 692 { | |
| 693 if (!m_pData) { | |
| 694 return FALSE; | |
| 695 } | |
| 696 return pSrc->composeTo(this, x, y, op, pSrcRect); | |
| 697 } | |
| 698 CJBig2_Image *CJBig2_Image::subImage_unopt(int32_t x, int32_t y, int32_t w, int3
2_t h) | |
| 699 { | |
| 700 CJBig2_Image *pImage; | |
| 701 int32_t i, j; | |
| 702 JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); | |
| 703 for(j = 0; j < h; j++) { | |
| 704 for(i = 0; i < w; i++) { | |
| 705 pImage->setPixel(i, j, getPixel(x + i, y + j)); | |
| 706 } | |
| 707 } | |
| 708 return pImage; | |
| 709 } | |
| 710 #define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16)
| ((buf)[2] << 8) | (buf)[3])) | |
| 711 CJBig2_Image *CJBig2_Image::subImage(int32_t x, int32_t y, int32_t w, int32_t h) | |
| 712 { | |
| 713 CJBig2_Image *pImage; | |
| 714 int32_t m, n, j; | |
| 715 uint8_t *pLineSrc, *pLineDst; | |
| 716 FX_DWORD wTmp; | |
| 717 uint8_t *pSrc, *pSrcEnd, *pDst, *pDstEnd; | |
| 718 if (w == 0 || h == 0) { | |
| 719 return NULL; | |
| 720 } | |
| 721 JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); | |
| 722 if (!m_pData) { | |
| 723 pImage->fill(0); | |
| 724 return pImage; | |
| 725 } | |
| 726 if (!pImage->m_pData) { | |
| 727 return pImage; | |
| 728 } | |
| 729 pLineSrc = m_pData + m_nStride * y; | |
| 730 pLineDst = pImage->m_pData; | |
| 731 m = (x >> 5) << 2; | |
| 732 n = x & 31; | |
| 733 if(n == 0) { | |
| 734 for(j = 0; j < h; j++) { | |
| 735 pSrc = pLineSrc + m; | |
| 736 pSrcEnd = pLineSrc + m_nStride; | |
| 737 pDst = pLineDst; | |
| 738 pDstEnd = pLineDst + pImage->m_nStride; | |
| 739 for(; pDst < pDstEnd; pSrc += 4, pDst += 4) { | |
| 740 *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc); | |
| 741 } | |
| 742 pLineSrc += m_nStride; | |
| 743 pLineDst += pImage->m_nStride; | |
| 744 } | |
| 745 } else { | |
| 746 for(j = 0; j < h; j++) { | |
| 747 pSrc = pLineSrc + m; | |
| 748 pSrcEnd = pLineSrc + m_nStride; | |
| 749 pDst = pLineDst; | |
| 750 pDstEnd = pLineDst + pImage->m_nStride; | |
| 751 for(; pDst < pDstEnd; pSrc += 4, pDst += 4) { | |
| 752 if(pSrc + 4 < pSrcEnd) { | |
| 753 wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc +
4) >> (32 - n)); | |
| 754 } else { | |
| 755 wTmp = JBIG2_GETDWORD(pSrc) << n; | |
| 756 } | |
| 757 pDst[0] = (uint8_t)(wTmp >> 24); | |
| 758 pDst[1] = (uint8_t)(wTmp >> 16); | |
| 759 pDst[2] = (uint8_t)(wTmp >> 8); | |
| 760 pDst[3] = (uint8_t)wTmp; | |
| 761 } | |
| 762 pLineSrc += m_nStride; | |
| 763 pLineDst += pImage->m_nStride; | |
| 764 } | |
| 765 } | |
| 766 return pImage; | |
| 767 } | |
| 768 void CJBig2_Image::expand(int32_t h, FX_BOOL v) | |
| 769 { | |
| 770 if (!m_pData || h <= m_nHeight) { | |
| 771 return; | |
| 772 } | |
| 773 FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h); | |
| 774 FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride); | |
| 775 FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight); | |
| 776 FX_SAFE_DWORD safeMemSize = dwH; | |
| 777 safeMemSize *= dwStride; | |
| 778 if (!safeMemSize.IsValid()) { | |
| 779 return; | |
| 780 } | |
| 781 //The guaranteed reallocated memory is to be < 4GB (unsigned int). | |
| 782 m_pData = (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie
()); | |
| 783 //The result of dwHeight * dwStride doesn't overflow after the | |
| 784 //checking of safeMemSize. | |
| 785 //The same as the result of (dwH - dwHeight) * dwStride) because | |
| 786 //dwH - dwHeight is always less than dwH(h) which is checked in | |
| 787 //the calculation of dwH * dwStride. | |
| 788 JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, (dwH - dwHeight) *
dwStride); | |
| 789 m_nHeight = h; | |
| 790 } | |
| 791 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, J
Big2ComposeOp op) | |
| 792 { | |
| 793 int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0
, xd1 = 0, | |
| 794 yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords =
0, lineLeft = 0; | |
| 795 | |
| 796 FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 =
0, | |
| 797 tmp = 0, tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM =
0; | |
| 798 | |
| 799 uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL; | |
| 800 | |
| 801 if (!m_pData) { | |
| 802 return FALSE; | |
| 803 } | |
| 804 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { | |
| 805 return FALSE; | |
| 806 } | |
| 807 if(y < 0) { | |
| 808 ys0 = -y; | |
| 809 } | |
| 810 if(y + m_nHeight > pDst->m_nHeight) { | |
| 811 ys1 = pDst->m_nHeight - y; | |
| 812 } else { | |
| 813 ys1 = m_nHeight; | |
| 814 } | |
| 815 if(x < 0) { | |
| 816 xs0 = -x; | |
| 817 } | |
| 818 if(x + m_nWidth > pDst->m_nWidth) { | |
| 819 xs1 = pDst->m_nWidth - x; | |
| 820 } else { | |
| 821 xs1 = m_nWidth; | |
| 822 } | |
| 823 if((ys0 >= ys1) || (xs0 >= xs1)) { | |
| 824 return 0; | |
| 825 } | |
| 826 w = xs1 - xs0; | |
| 827 h = ys1 - ys0; | |
| 828 if(y >= 0) { | |
| 829 yd0 = y; | |
| 830 } | |
| 831 if(x >= 0) { | |
| 832 xd0 = x; | |
| 833 } | |
| 834 xd1 = xd0 + w; | |
| 835 yd1 = yd0 + h; | |
| 836 d1 = xd0 & 31; | |
| 837 d2 = xd1 & 31; | |
| 838 s1 = xs0 & 31; | |
| 839 maskL = 0xffffffff >> d1; | |
| 840 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); | |
| 841 maskM = maskL & maskR; | |
| 842 lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2); | |
| 843 lineLeft = m_nStride - ((xs0 >> 5) << 2); | |
| 844 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); | |
| 845 if((xd0 & ~31) == ((xd1 - 1) & ~31)) { | |
| 846 if((xs0 & ~31) == ((xs1 - 1) & ~31)) { | |
| 847 if(s1 > d1) { | |
| 848 shift = s1 - d1; | |
| 849 for(yy = yd0; yy < yd1; yy++) { | |
| 850 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; | |
| 851 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 852 switch(op) { | |
| 853 case JBIG2_COMPOSE_OR: | |
| 854 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 855 break; | |
| 856 case JBIG2_COMPOSE_AND: | |
| 857 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 858 break; | |
| 859 case JBIG2_COMPOSE_XOR: | |
| 860 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 861 break; | |
| 862 case JBIG2_COMPOSE_XNOR: | |
| 863 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 864 break; | |
| 865 case JBIG2_COMPOSE_REPLACE: | |
| 866 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 867 break; | |
| 868 } | |
| 869 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 870 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 871 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 872 lineDst[3] = (uint8_t)tmp; | |
| 873 lineSrc += m_nStride; | |
| 874 lineDst += pDst->m_nStride; | |
| 875 } | |
| 876 } else { | |
| 877 shift = d1 - s1; | |
| 878 for(yy = yd0; yy < yd1; yy++) { | |
| 879 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; | |
| 880 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 881 switch(op) { | |
| 882 case JBIG2_COMPOSE_OR: | |
| 883 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 884 break; | |
| 885 case JBIG2_COMPOSE_AND: | |
| 886 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 887 break; | |
| 888 case JBIG2_COMPOSE_XOR: | |
| 889 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 890 break; | |
| 891 case JBIG2_COMPOSE_XNOR: | |
| 892 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 893 break; | |
| 894 case JBIG2_COMPOSE_REPLACE: | |
| 895 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 896 break; | |
| 897 } | |
| 898 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 899 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 900 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 901 lineDst[3] = (uint8_t)tmp; | |
| 902 lineSrc += m_nStride; | |
| 903 lineDst += pDst->m_nStride; | |
| 904 } | |
| 905 } | |
| 906 } else { | |
| 907 shift1 = s1 - d1; | |
| 908 shift2 = 32 - shift1; | |
| 909 for(yy = yd0; yy < yd1; yy++) { | |
| 910 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lin
eSrc + 4) >> shift2); | |
| 911 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 912 switch(op) { | |
| 913 case JBIG2_COMPOSE_OR: | |
| 914 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 915 break; | |
| 916 case JBIG2_COMPOSE_AND: | |
| 917 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 918 break; | |
| 919 case JBIG2_COMPOSE_XOR: | |
| 920 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 921 break; | |
| 922 case JBIG2_COMPOSE_XNOR: | |
| 923 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 924 break; | |
| 925 case JBIG2_COMPOSE_REPLACE: | |
| 926 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 927 break; | |
| 928 } | |
| 929 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 930 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 931 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 932 lineDst[3] = (uint8_t)tmp; | |
| 933 lineSrc += m_nStride; | |
| 934 lineDst += pDst->m_nStride; | |
| 935 } | |
| 936 } | |
| 937 } else { | |
| 938 if(s1 > d1) { | |
| 939 shift1 = s1 - d1; | |
| 940 shift2 = 32 - shift1; | |
| 941 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 942 for(yy = yd0; yy < yd1; yy++) { | |
| 943 sp = lineSrc; | |
| 944 dp = lineDst; | |
| 945 if(d1 != 0) { | |
| 946 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp +
4) >> shift2); | |
| 947 tmp2 = JBIG2_GETDWORD(dp); | |
| 948 switch(op) { | |
| 949 case JBIG2_COMPOSE_OR: | |
| 950 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 951 break; | |
| 952 case JBIG2_COMPOSE_AND: | |
| 953 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 954 break; | |
| 955 case JBIG2_COMPOSE_XOR: | |
| 956 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 957 break; | |
| 958 case JBIG2_COMPOSE_XNOR: | |
| 959 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 960 break; | |
| 961 case JBIG2_COMPOSE_REPLACE: | |
| 962 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 963 break; | |
| 964 } | |
| 965 dp[0] = (uint8_t)(tmp >> 24); | |
| 966 dp[1] = (uint8_t)(tmp >> 16); | |
| 967 dp[2] = (uint8_t)(tmp >> 8); | |
| 968 dp[3] = (uint8_t)tmp; | |
| 969 sp += 4; | |
| 970 dp += 4; | |
| 971 } | |
| 972 for(xx = 0; xx < middleDwords; xx++) { | |
| 973 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp +
4) >> shift2); | |
| 974 tmp2 = JBIG2_GETDWORD(dp); | |
| 975 switch(op) { | |
| 976 case JBIG2_COMPOSE_OR: | |
| 977 tmp = tmp1 | tmp2; | |
| 978 break; | |
| 979 case JBIG2_COMPOSE_AND: | |
| 980 tmp = tmp1 & tmp2; | |
| 981 break; | |
| 982 case JBIG2_COMPOSE_XOR: | |
| 983 tmp = tmp1 ^ tmp2; | |
| 984 break; | |
| 985 case JBIG2_COMPOSE_XNOR: | |
| 986 tmp = ~(tmp1 ^ tmp2); | |
| 987 break; | |
| 988 case JBIG2_COMPOSE_REPLACE: | |
| 989 tmp = tmp1; | |
| 990 break; | |
| 991 } | |
| 992 dp[0] = (uint8_t)(tmp >> 24); | |
| 993 dp[1] = (uint8_t)(tmp >> 16); | |
| 994 dp[2] = (uint8_t)(tmp >> 8); | |
| 995 dp[3] = (uint8_t)tmp; | |
| 996 sp += 4; | |
| 997 dp += 4; | |
| 998 } | |
| 999 if(d2 != 0) { | |
| 1000 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | ( | |
| 1001 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s
p + 4) : 0) >> shift2); | |
| 1002 tmp2 = JBIG2_GETDWORD(dp); | |
| 1003 switch(op) { | |
| 1004 case JBIG2_COMPOSE_OR: | |
| 1005 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1006 break; | |
| 1007 case JBIG2_COMPOSE_AND: | |
| 1008 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1009 break; | |
| 1010 case JBIG2_COMPOSE_XOR: | |
| 1011 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1012 break; | |
| 1013 case JBIG2_COMPOSE_XNOR: | |
| 1014 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1015 break; | |
| 1016 case JBIG2_COMPOSE_REPLACE: | |
| 1017 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1018 break; | |
| 1019 } | |
| 1020 dp[0] = (uint8_t)(tmp >> 24); | |
| 1021 dp[1] = (uint8_t)(tmp >> 16); | |
| 1022 dp[2] = (uint8_t)(tmp >> 8); | |
| 1023 dp[3] = (uint8_t)tmp; | |
| 1024 } | |
| 1025 lineSrc += m_nStride; | |
| 1026 lineDst += pDst->m_nStride; | |
| 1027 } | |
| 1028 } else if(s1 == d1) { | |
| 1029 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1030 for(yy = yd0; yy < yd1; yy++) { | |
| 1031 sp = lineSrc; | |
| 1032 dp = lineDst; | |
| 1033 if(d1 != 0) { | |
| 1034 tmp1 = JBIG2_GETDWORD(sp); | |
| 1035 tmp2 = JBIG2_GETDWORD(dp); | |
| 1036 switch(op) { | |
| 1037 case JBIG2_COMPOSE_OR: | |
| 1038 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1039 break; | |
| 1040 case JBIG2_COMPOSE_AND: | |
| 1041 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1042 break; | |
| 1043 case JBIG2_COMPOSE_XOR: | |
| 1044 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1045 break; | |
| 1046 case JBIG2_COMPOSE_XNOR: | |
| 1047 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1048 break; | |
| 1049 case JBIG2_COMPOSE_REPLACE: | |
| 1050 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1051 break; | |
| 1052 } | |
| 1053 dp[0] = (uint8_t)(tmp >> 24); | |
| 1054 dp[1] = (uint8_t)(tmp >> 16); | |
| 1055 dp[2] = (uint8_t)(tmp >> 8); | |
| 1056 dp[3] = (uint8_t)tmp; | |
| 1057 sp += 4; | |
| 1058 dp += 4; | |
| 1059 } | |
| 1060 for(xx = 0; xx < middleDwords; xx++) { | |
| 1061 tmp1 = JBIG2_GETDWORD(sp); | |
| 1062 tmp2 = JBIG2_GETDWORD(dp); | |
| 1063 switch(op) { | |
| 1064 case JBIG2_COMPOSE_OR: | |
| 1065 tmp = tmp1 | tmp2; | |
| 1066 break; | |
| 1067 case JBIG2_COMPOSE_AND: | |
| 1068 tmp = tmp1 & tmp2; | |
| 1069 break; | |
| 1070 case JBIG2_COMPOSE_XOR: | |
| 1071 tmp = tmp1 ^ tmp2; | |
| 1072 break; | |
| 1073 case JBIG2_COMPOSE_XNOR: | |
| 1074 tmp = ~(tmp1 ^ tmp2); | |
| 1075 break; | |
| 1076 case JBIG2_COMPOSE_REPLACE: | |
| 1077 tmp = tmp1; | |
| 1078 break; | |
| 1079 } | |
| 1080 dp[0] = (uint8_t)(tmp >> 24); | |
| 1081 dp[1] = (uint8_t)(tmp >> 16); | |
| 1082 dp[2] = (uint8_t)(tmp >> 8); | |
| 1083 dp[3] = (uint8_t)tmp; | |
| 1084 sp += 4; | |
| 1085 dp += 4; | |
| 1086 } | |
| 1087 if(d2 != 0) { | |
| 1088 tmp1 = JBIG2_GETDWORD(sp); | |
| 1089 tmp2 = JBIG2_GETDWORD(dp); | |
| 1090 switch(op) { | |
| 1091 case JBIG2_COMPOSE_OR: | |
| 1092 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1093 break; | |
| 1094 case JBIG2_COMPOSE_AND: | |
| 1095 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1096 break; | |
| 1097 case JBIG2_COMPOSE_XOR: | |
| 1098 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1099 break; | |
| 1100 case JBIG2_COMPOSE_XNOR: | |
| 1101 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1102 break; | |
| 1103 case JBIG2_COMPOSE_REPLACE: | |
| 1104 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1105 break; | |
| 1106 } | |
| 1107 dp[0] = (uint8_t)(tmp >> 24); | |
| 1108 dp[1] = (uint8_t)(tmp >> 16); | |
| 1109 dp[2] = (uint8_t)(tmp >> 8); | |
| 1110 dp[3] = (uint8_t)tmp; | |
| 1111 } | |
| 1112 lineSrc += m_nStride; | |
| 1113 lineDst += pDst->m_nStride; | |
| 1114 } | |
| 1115 } else { | |
| 1116 shift1 = d1 - s1; | |
| 1117 shift2 = 32 - shift1; | |
| 1118 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1119 for(yy = yd0; yy < yd1; yy++) { | |
| 1120 sp = lineSrc; | |
| 1121 dp = lineDst; | |
| 1122 if(d1 != 0) { | |
| 1123 tmp1 = JBIG2_GETDWORD(sp) >> shift1; | |
| 1124 tmp2 = JBIG2_GETDWORD(dp); | |
| 1125 switch(op) { | |
| 1126 case JBIG2_COMPOSE_OR: | |
| 1127 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1128 break; | |
| 1129 case JBIG2_COMPOSE_AND: | |
| 1130 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1131 break; | |
| 1132 case JBIG2_COMPOSE_XOR: | |
| 1133 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1134 break; | |
| 1135 case JBIG2_COMPOSE_XNOR: | |
| 1136 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1137 break; | |
| 1138 case JBIG2_COMPOSE_REPLACE: | |
| 1139 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1140 break; | |
| 1141 } | |
| 1142 dp[0] = (uint8_t)(tmp >> 24); | |
| 1143 dp[1] = (uint8_t)(tmp >> 16); | |
| 1144 dp[2] = (uint8_t)(tmp >> 8); | |
| 1145 dp[3] = (uint8_t)tmp; | |
| 1146 dp += 4; | |
| 1147 } | |
| 1148 for(xx = 0; xx < middleDwords; xx++) { | |
| 1149 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp
+ 4)) >> shift1); | |
| 1150 tmp2 = JBIG2_GETDWORD(dp); | |
| 1151 switch(op) { | |
| 1152 case JBIG2_COMPOSE_OR: | |
| 1153 tmp = tmp1 | tmp2; | |
| 1154 break; | |
| 1155 case JBIG2_COMPOSE_AND: | |
| 1156 tmp = tmp1 & tmp2; | |
| 1157 break; | |
| 1158 case JBIG2_COMPOSE_XOR: | |
| 1159 tmp = tmp1 ^ tmp2; | |
| 1160 break; | |
| 1161 case JBIG2_COMPOSE_XNOR: | |
| 1162 tmp = ~(tmp1 ^ tmp2); | |
| 1163 break; | |
| 1164 case JBIG2_COMPOSE_REPLACE: | |
| 1165 tmp = tmp1; | |
| 1166 break; | |
| 1167 } | |
| 1168 dp[0] = (uint8_t)(tmp >> 24); | |
| 1169 dp[1] = (uint8_t)(tmp >> 16); | |
| 1170 dp[2] = (uint8_t)(tmp >> 8); | |
| 1171 dp[3] = (uint8_t)tmp; | |
| 1172 sp += 4; | |
| 1173 dp += 4; | |
| 1174 } | |
| 1175 if(d2 != 0) { | |
| 1176 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ( | |
| 1177 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s
p + 4) : 0) >> shift1); | |
| 1178 tmp2 = JBIG2_GETDWORD(dp); | |
| 1179 switch(op) { | |
| 1180 case JBIG2_COMPOSE_OR: | |
| 1181 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1182 break; | |
| 1183 case JBIG2_COMPOSE_AND: | |
| 1184 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1185 break; | |
| 1186 case JBIG2_COMPOSE_XOR: | |
| 1187 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1188 break; | |
| 1189 case JBIG2_COMPOSE_XNOR: | |
| 1190 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1191 break; | |
| 1192 case JBIG2_COMPOSE_REPLACE: | |
| 1193 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1194 break; | |
| 1195 } | |
| 1196 dp[0] = (uint8_t)(tmp >> 24); | |
| 1197 dp[1] = (uint8_t)(tmp >> 16); | |
| 1198 dp[2] = (uint8_t)(tmp >> 8); | |
| 1199 dp[3] = (uint8_t)tmp; | |
| 1200 } | |
| 1201 lineSrc += m_nStride; | |
| 1202 lineDst += pDst->m_nStride; | |
| 1203 } | |
| 1204 } | |
| 1205 } | |
| 1206 return 1; | |
| 1207 } | |
| 1208 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, J
Big2ComposeOp op, const FX_RECT* pSrcRect) | |
| 1209 { | |
| 1210 int32_t xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords,
lineLeft; | |
| 1211 FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, m
askM; | |
| 1212 uint8_t *lineSrc, *lineDst, *sp, *dp; | |
| 1213 int32_t sw, sh; | |
| 1214 if (!m_pData) { | |
| 1215 return FALSE; | |
| 1216 } | |
| 1217 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { | |
| 1218 return FALSE; | |
| 1219 } | |
| 1220 sw = pSrcRect->Width(); | |
| 1221 sh = pSrcRect->Height(); | |
| 1222 if(y < 0) { | |
| 1223 ys0 = -y; | |
| 1224 } else { | |
| 1225 ys0 = 0; | |
| 1226 } | |
| 1227 if(y + sh > pDst->m_nHeight) { | |
| 1228 ys1 = pDst->m_nHeight - y; | |
| 1229 } else { | |
| 1230 ys1 = sh; | |
| 1231 } | |
| 1232 if(x < 0) { | |
| 1233 xs0 = -x; | |
| 1234 } else { | |
| 1235 xs0 = 0; | |
| 1236 } | |
| 1237 if(x + sw > pDst->m_nWidth) { | |
| 1238 xs1 = pDst->m_nWidth - x; | |
| 1239 } else { | |
| 1240 xs1 = sw; | |
| 1241 } | |
| 1242 if((ys0 >= ys1) || (xs0 >= xs1)) { | |
| 1243 return 0; | |
| 1244 } | |
| 1245 w = xs1 - xs0; | |
| 1246 h = ys1 - ys0; | |
| 1247 if(y < 0) { | |
| 1248 yd0 = 0; | |
| 1249 } else { | |
| 1250 yd0 = y; | |
| 1251 } | |
| 1252 if(x < 0) { | |
| 1253 xd0 = 0; | |
| 1254 } else { | |
| 1255 xd0 = x; | |
| 1256 } | |
| 1257 xd1 = xd0 + w; | |
| 1258 yd1 = yd0 + h; | |
| 1259 d1 = xd0 & 31; | |
| 1260 d2 = xd1 & 31; | |
| 1261 s1 = xs0 & 31; | |
| 1262 maskL = 0xffffffff >> d1; | |
| 1263 maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); | |
| 1264 maskM = maskL & maskR; | |
| 1265 lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->l
eft) >> 5) << 2); | |
| 1266 lineLeft = m_nStride - ((xs0 >> 5) << 2); | |
| 1267 lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); | |
| 1268 if((xd0 & ~31) == ((xd1 - 1) & ~31)) { | |
| 1269 if((xs0 & ~31) == ((xs1 - 1) & ~31)) { | |
| 1270 if(s1 > d1) { | |
| 1271 shift = s1 - d1; | |
| 1272 for(yy = yd0; yy < yd1; yy++) { | |
| 1273 tmp1 = JBIG2_GETDWORD(lineSrc) << shift; | |
| 1274 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 1275 switch(op) { | |
| 1276 case JBIG2_COMPOSE_OR: | |
| 1277 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 1278 break; | |
| 1279 case JBIG2_COMPOSE_AND: | |
| 1280 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 1281 break; | |
| 1282 case JBIG2_COMPOSE_XOR: | |
| 1283 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 1284 break; | |
| 1285 case JBIG2_COMPOSE_XNOR: | |
| 1286 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 1287 break; | |
| 1288 case JBIG2_COMPOSE_REPLACE: | |
| 1289 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 1290 break; | |
| 1291 } | |
| 1292 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 1293 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 1294 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 1295 lineDst[3] = (uint8_t)tmp; | |
| 1296 lineSrc += m_nStride; | |
| 1297 lineDst += pDst->m_nStride; | |
| 1298 } | |
| 1299 } else { | |
| 1300 shift = d1 - s1; | |
| 1301 for(yy = yd0; yy < yd1; yy++) { | |
| 1302 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; | |
| 1303 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 1304 switch(op) { | |
| 1305 case JBIG2_COMPOSE_OR: | |
| 1306 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 1307 break; | |
| 1308 case JBIG2_COMPOSE_AND: | |
| 1309 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 1310 break; | |
| 1311 case JBIG2_COMPOSE_XOR: | |
| 1312 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 1313 break; | |
| 1314 case JBIG2_COMPOSE_XNOR: | |
| 1315 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 1316 break; | |
| 1317 case JBIG2_COMPOSE_REPLACE: | |
| 1318 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 1319 break; | |
| 1320 } | |
| 1321 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 1322 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 1323 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 1324 lineDst[3] = (uint8_t)tmp; | |
| 1325 lineSrc += m_nStride; | |
| 1326 lineDst += pDst->m_nStride; | |
| 1327 } | |
| 1328 } | |
| 1329 } else { | |
| 1330 shift1 = s1 - d1; | |
| 1331 shift2 = 32 - shift1; | |
| 1332 for(yy = yd0; yy < yd1; yy++) { | |
| 1333 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lin
eSrc + 4) >> shift2); | |
| 1334 tmp2 = JBIG2_GETDWORD(lineDst); | |
| 1335 switch(op) { | |
| 1336 case JBIG2_COMPOSE_OR: | |
| 1337 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); | |
| 1338 break; | |
| 1339 case JBIG2_COMPOSE_AND: | |
| 1340 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); | |
| 1341 break; | |
| 1342 case JBIG2_COMPOSE_XOR: | |
| 1343 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); | |
| 1344 break; | |
| 1345 case JBIG2_COMPOSE_XNOR: | |
| 1346 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); | |
| 1347 break; | |
| 1348 case JBIG2_COMPOSE_REPLACE: | |
| 1349 tmp = (tmp2 & ~maskM) | (tmp1 & maskM); | |
| 1350 break; | |
| 1351 } | |
| 1352 lineDst[0] = (uint8_t)(tmp >> 24); | |
| 1353 lineDst[1] = (uint8_t)(tmp >> 16); | |
| 1354 lineDst[2] = (uint8_t)(tmp >> 8); | |
| 1355 lineDst[3] = (uint8_t)tmp; | |
| 1356 lineSrc += m_nStride; | |
| 1357 lineDst += pDst->m_nStride; | |
| 1358 } | |
| 1359 } | |
| 1360 } else { | |
| 1361 if(s1 > d1) { | |
| 1362 shift1 = s1 - d1; | |
| 1363 shift2 = 32 - shift1; | |
| 1364 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1365 for(yy = yd0; yy < yd1; yy++) { | |
| 1366 sp = lineSrc; | |
| 1367 dp = lineDst; | |
| 1368 if(d1 != 0) { | |
| 1369 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp +
4) >> shift2); | |
| 1370 tmp2 = JBIG2_GETDWORD(dp); | |
| 1371 switch(op) { | |
| 1372 case JBIG2_COMPOSE_OR: | |
| 1373 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1374 break; | |
| 1375 case JBIG2_COMPOSE_AND: | |
| 1376 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1377 break; | |
| 1378 case JBIG2_COMPOSE_XOR: | |
| 1379 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1380 break; | |
| 1381 case JBIG2_COMPOSE_XNOR: | |
| 1382 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1383 break; | |
| 1384 case JBIG2_COMPOSE_REPLACE: | |
| 1385 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1386 break; | |
| 1387 } | |
| 1388 dp[0] = (uint8_t)(tmp >> 24); | |
| 1389 dp[1] = (uint8_t)(tmp >> 16); | |
| 1390 dp[2] = (uint8_t)(tmp >> 8); | |
| 1391 dp[3] = (uint8_t)tmp; | |
| 1392 sp += 4; | |
| 1393 dp += 4; | |
| 1394 } | |
| 1395 for(xx = 0; xx < middleDwords; xx++) { | |
| 1396 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp +
4) >> shift2); | |
| 1397 tmp2 = JBIG2_GETDWORD(dp); | |
| 1398 switch(op) { | |
| 1399 case JBIG2_COMPOSE_OR: | |
| 1400 tmp = tmp1 | tmp2; | |
| 1401 break; | |
| 1402 case JBIG2_COMPOSE_AND: | |
| 1403 tmp = tmp1 & tmp2; | |
| 1404 break; | |
| 1405 case JBIG2_COMPOSE_XOR: | |
| 1406 tmp = tmp1 ^ tmp2; | |
| 1407 break; | |
| 1408 case JBIG2_COMPOSE_XNOR: | |
| 1409 tmp = ~(tmp1 ^ tmp2); | |
| 1410 break; | |
| 1411 case JBIG2_COMPOSE_REPLACE: | |
| 1412 tmp = tmp1; | |
| 1413 break; | |
| 1414 } | |
| 1415 dp[0] = (uint8_t)(tmp >> 24); | |
| 1416 dp[1] = (uint8_t)(tmp >> 16); | |
| 1417 dp[2] = (uint8_t)(tmp >> 8); | |
| 1418 dp[3] = (uint8_t)tmp; | |
| 1419 sp += 4; | |
| 1420 dp += 4; | |
| 1421 } | |
| 1422 if(d2 != 0) { | |
| 1423 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | ( | |
| 1424 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s
p + 4) : 0) >> shift2); | |
| 1425 tmp2 = JBIG2_GETDWORD(dp); | |
| 1426 switch(op) { | |
| 1427 case JBIG2_COMPOSE_OR: | |
| 1428 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1429 break; | |
| 1430 case JBIG2_COMPOSE_AND: | |
| 1431 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1432 break; | |
| 1433 case JBIG2_COMPOSE_XOR: | |
| 1434 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1435 break; | |
| 1436 case JBIG2_COMPOSE_XNOR: | |
| 1437 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1438 break; | |
| 1439 case JBIG2_COMPOSE_REPLACE: | |
| 1440 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1441 break; | |
| 1442 } | |
| 1443 dp[0] = (uint8_t)(tmp >> 24); | |
| 1444 dp[1] = (uint8_t)(tmp >> 16); | |
| 1445 dp[2] = (uint8_t)(tmp >> 8); | |
| 1446 dp[3] = (uint8_t)tmp; | |
| 1447 } | |
| 1448 lineSrc += m_nStride; | |
| 1449 lineDst += pDst->m_nStride; | |
| 1450 } | |
| 1451 } else if(s1 == d1) { | |
| 1452 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1453 for(yy = yd0; yy < yd1; yy++) { | |
| 1454 sp = lineSrc; | |
| 1455 dp = lineDst; | |
| 1456 if(d1 != 0) { | |
| 1457 tmp1 = JBIG2_GETDWORD(sp); | |
| 1458 tmp2 = JBIG2_GETDWORD(dp); | |
| 1459 switch(op) { | |
| 1460 case JBIG2_COMPOSE_OR: | |
| 1461 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1462 break; | |
| 1463 case JBIG2_COMPOSE_AND: | |
| 1464 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1465 break; | |
| 1466 case JBIG2_COMPOSE_XOR: | |
| 1467 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1468 break; | |
| 1469 case JBIG2_COMPOSE_XNOR: | |
| 1470 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1471 break; | |
| 1472 case JBIG2_COMPOSE_REPLACE: | |
| 1473 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1474 break; | |
| 1475 } | |
| 1476 dp[0] = (uint8_t)(tmp >> 24); | |
| 1477 dp[1] = (uint8_t)(tmp >> 16); | |
| 1478 dp[2] = (uint8_t)(tmp >> 8); | |
| 1479 dp[3] = (uint8_t)tmp; | |
| 1480 sp += 4; | |
| 1481 dp += 4; | |
| 1482 } | |
| 1483 for(xx = 0; xx < middleDwords; xx++) { | |
| 1484 tmp1 = JBIG2_GETDWORD(sp); | |
| 1485 tmp2 = JBIG2_GETDWORD(dp); | |
| 1486 switch(op) { | |
| 1487 case JBIG2_COMPOSE_OR: | |
| 1488 tmp = tmp1 | tmp2; | |
| 1489 break; | |
| 1490 case JBIG2_COMPOSE_AND: | |
| 1491 tmp = tmp1 & tmp2; | |
| 1492 break; | |
| 1493 case JBIG2_COMPOSE_XOR: | |
| 1494 tmp = tmp1 ^ tmp2; | |
| 1495 break; | |
| 1496 case JBIG2_COMPOSE_XNOR: | |
| 1497 tmp = ~(tmp1 ^ tmp2); | |
| 1498 break; | |
| 1499 case JBIG2_COMPOSE_REPLACE: | |
| 1500 tmp = tmp1; | |
| 1501 break; | |
| 1502 } | |
| 1503 dp[0] = (uint8_t)(tmp >> 24); | |
| 1504 dp[1] = (uint8_t)(tmp >> 16); | |
| 1505 dp[2] = (uint8_t)(tmp >> 8); | |
| 1506 dp[3] = (uint8_t)tmp; | |
| 1507 sp += 4; | |
| 1508 dp += 4; | |
| 1509 } | |
| 1510 if(d2 != 0) { | |
| 1511 tmp1 = JBIG2_GETDWORD(sp); | |
| 1512 tmp2 = JBIG2_GETDWORD(dp); | |
| 1513 switch(op) { | |
| 1514 case JBIG2_COMPOSE_OR: | |
| 1515 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1516 break; | |
| 1517 case JBIG2_COMPOSE_AND: | |
| 1518 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1519 break; | |
| 1520 case JBIG2_COMPOSE_XOR: | |
| 1521 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1522 break; | |
| 1523 case JBIG2_COMPOSE_XNOR: | |
| 1524 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1525 break; | |
| 1526 case JBIG2_COMPOSE_REPLACE: | |
| 1527 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1528 break; | |
| 1529 } | |
| 1530 dp[0] = (uint8_t)(tmp >> 24); | |
| 1531 dp[1] = (uint8_t)(tmp >> 16); | |
| 1532 dp[2] = (uint8_t)(tmp >> 8); | |
| 1533 dp[3] = (uint8_t)tmp; | |
| 1534 } | |
| 1535 lineSrc += m_nStride; | |
| 1536 lineDst += pDst->m_nStride; | |
| 1537 } | |
| 1538 } else { | |
| 1539 shift1 = d1 - s1; | |
| 1540 shift2 = 32 - shift1; | |
| 1541 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); | |
| 1542 for(yy = yd0; yy < yd1; yy++) { | |
| 1543 sp = lineSrc; | |
| 1544 dp = lineDst; | |
| 1545 if(d1 != 0) { | |
| 1546 tmp1 = JBIG2_GETDWORD(sp) >> shift1; | |
| 1547 tmp2 = JBIG2_GETDWORD(dp); | |
| 1548 switch(op) { | |
| 1549 case JBIG2_COMPOSE_OR: | |
| 1550 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); | |
| 1551 break; | |
| 1552 case JBIG2_COMPOSE_AND: | |
| 1553 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); | |
| 1554 break; | |
| 1555 case JBIG2_COMPOSE_XOR: | |
| 1556 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); | |
| 1557 break; | |
| 1558 case JBIG2_COMPOSE_XNOR: | |
| 1559 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); | |
| 1560 break; | |
| 1561 case JBIG2_COMPOSE_REPLACE: | |
| 1562 tmp = (tmp2 & ~maskL) | (tmp1 & maskL); | |
| 1563 break; | |
| 1564 } | |
| 1565 dp[0] = (uint8_t)(tmp >> 24); | |
| 1566 dp[1] = (uint8_t)(tmp >> 16); | |
| 1567 dp[2] = (uint8_t)(tmp >> 8); | |
| 1568 dp[3] = (uint8_t)tmp; | |
| 1569 dp += 4; | |
| 1570 } | |
| 1571 for(xx = 0; xx < middleDwords; xx++) { | |
| 1572 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp
+ 4)) >> shift1); | |
| 1573 tmp2 = JBIG2_GETDWORD(dp); | |
| 1574 switch(op) { | |
| 1575 case JBIG2_COMPOSE_OR: | |
| 1576 tmp = tmp1 | tmp2; | |
| 1577 break; | |
| 1578 case JBIG2_COMPOSE_AND: | |
| 1579 tmp = tmp1 & tmp2; | |
| 1580 break; | |
| 1581 case JBIG2_COMPOSE_XOR: | |
| 1582 tmp = tmp1 ^ tmp2; | |
| 1583 break; | |
| 1584 case JBIG2_COMPOSE_XNOR: | |
| 1585 tmp = ~(tmp1 ^ tmp2); | |
| 1586 break; | |
| 1587 case JBIG2_COMPOSE_REPLACE: | |
| 1588 tmp = tmp1; | |
| 1589 break; | |
| 1590 } | |
| 1591 dp[0] = (uint8_t)(tmp >> 24); | |
| 1592 dp[1] = (uint8_t)(tmp >> 16); | |
| 1593 dp[2] = (uint8_t)(tmp >> 8); | |
| 1594 dp[3] = (uint8_t)tmp; | |
| 1595 sp += 4; | |
| 1596 dp += 4; | |
| 1597 } | |
| 1598 if(d2 != 0) { | |
| 1599 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ( | |
| 1600 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(s
p + 4) : 0) >> shift1); | |
| 1601 tmp2 = JBIG2_GETDWORD(dp); | |
| 1602 switch(op) { | |
| 1603 case JBIG2_COMPOSE_OR: | |
| 1604 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); | |
| 1605 break; | |
| 1606 case JBIG2_COMPOSE_AND: | |
| 1607 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); | |
| 1608 break; | |
| 1609 case JBIG2_COMPOSE_XOR: | |
| 1610 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); | |
| 1611 break; | |
| 1612 case JBIG2_COMPOSE_XNOR: | |
| 1613 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); | |
| 1614 break; | |
| 1615 case JBIG2_COMPOSE_REPLACE: | |
| 1616 tmp = (tmp2 & ~maskR) | (tmp1 & maskR); | |
| 1617 break; | |
| 1618 } | |
| 1619 dp[0] = (uint8_t)(tmp >> 24); | |
| 1620 dp[1] = (uint8_t)(tmp >> 16); | |
| 1621 dp[2] = (uint8_t)(tmp >> 8); | |
| 1622 dp[3] = (uint8_t)tmp; | |
| 1623 } | |
| 1624 lineSrc += m_nStride; | |
| 1625 lineDst += pDst->m_nStride; | |
| 1626 } | |
| 1627 } | |
| 1628 } | |
| 1629 return 1; | |
| 1630 } | |
| OLD | NEW |