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