1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
7 #include "JBig2_Image.h"
8 #include "../../../include/fxcrt/fx_basic.h"
9 #include "../../../include/fxcrt/fx_coordinates.h"
11 CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)
15 if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
20 m_nStride = ((w + 31) >> 5) << 2;
21 if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
22 m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
28 CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)
36 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;
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);
50 CJBig2_Image::~CJBig2_Image()
52 if(m_bNeedFree && m_pData) {
53 m_pModule->JBig2_Free(m_pData);
56 FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)
62 if(x < 0 || x >= m_nWidth) {
65 if(y < 0 || y >= m_nHeight) {
68 m = y * m_nStride + (x >> 3);
70 return ((m_pData[m] >> (7 - n)) & 1);
73 FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)
79 if(x < 0 || x >= m_nWidth) {
82 if(y < 0 || y >= m_nHeight) {
85 m = y * m_nStride + (x >> 3);
88 m_pData[m] |= 1 << (7 - n);
90 m_pData[m] &= ~(1 << (7 - n));
94 void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)
99 if(hFrom < 0 || hFrom >= m_nHeight) {
100 JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
102 JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);
105 void CJBig2_Image::fill(FX_BOOL v)
110 JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
112 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
117 return composeTo_opt2(pDst, x, y, op);
119 FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
124 if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
125 return composeTo_opt2(pDst, x, y, op);
127 return composeTo_opt2(pDst, x, y, op, pSrcRect);
129 FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
131 FX_INT32 w, h, dx, dy;
146 if(x + w > pDst->m_nWidth) {
147 w = pDst->m_nWidth - x;
149 if(y + h > pDst->m_nHeight) {
150 h = pDst->m_nHeight - y;
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);
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);
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);
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);
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));
196 FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
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;
210 if (y + m_nHeight > pDst->m_nHeight) {
211 y1 = pDst->m_nHeight - y;
224 if (x1 > pDst->m_nWidth) {
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;
241 case JBIG2_COMPOSE_OR: {
242 for (yy = y0; yy < y1; ++yy) {
243 destPtr = pLineDst + (x >> 3);
246 dest |= (*srcPtr >> s1) & m2;
247 *destPtr = (FX_BYTE)dest;
248 pLineDst += pDst->m_nStride;
249 pLineSrc += m_nStride;
253 case JBIG2_COMPOSE_AND: {
254 for (yy = y0; yy < y1; ++yy) {
255 destPtr = pLineDst + (x >> 3);
258 dest &= ((0xff00 | *srcPtr) >> s1) | m1;
259 *destPtr = (FX_BYTE)dest;
260 pLineDst += pDst->m_nStride;
261 pLineSrc += m_nStride;
265 case JBIG2_COMPOSE_XOR: {
266 for (yy = y0; yy < y1; ++yy) {
267 destPtr = pLineDst + (x >> 3);
270 dest ^= (*srcPtr >> s1) & m2;
271 *destPtr = (FX_BYTE)dest;
272 pLineDst += pDst->m_nStride;
273 pLineSrc += m_nStride;
277 case JBIG2_COMPOSE_XNOR: {
278 for (yy = y0; yy < y1; ++yy) {
279 destPtr = pLineDst + (x >> 3);
282 dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
283 *destPtr = (FX_BYTE)dest;
284 pLineDst += pDst->m_nStride;
285 pLineSrc += m_nStride;
289 case JBIG2_COMPOSE_REPLACE: {
290 for (yy = y0; yy < y1; ++yy) {
291 destPtr = pLineDst + (x >> 3);
294 dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
295 *destPtr = (FX_BYTE)dest;
296 pLineDst += pDst->m_nStride;
297 pLineSrc += m_nStride;
304 case JBIG2_COMPOSE_OR: {
305 for(yy = y0; yy < y1; ++yy) {
307 srcPtr = pLineSrc + (-x >> 3);
309 dest |= *srcPtr & m2;
310 *destPtr = (FX_BYTE)dest;
311 pLineDst += pDst->m_nStride;
312 pLineSrc += m_nStride;
316 case JBIG2_COMPOSE_AND: {
317 for(yy = y0; yy < y1; ++yy) {
319 srcPtr = pLineSrc + (-x >> 3);
321 dest &= *srcPtr | m1;
322 *destPtr = (FX_BYTE)dest;
323 pLineDst += pDst->m_nStride;
324 pLineSrc += m_nStride;
328 case JBIG2_COMPOSE_XOR: {
329 for(yy = y0; yy < y1; ++yy) {
331 srcPtr = pLineSrc + (-x >> 3);
333 dest ^= *srcPtr & m2;
334 *destPtr = (FX_BYTE)dest;
335 pLineDst += pDst->m_nStride;
336 pLineSrc += m_nStride;
340 case JBIG2_COMPOSE_XNOR: {
341 for(yy = y0; yy < y1; ++yy) {
343 srcPtr = pLineSrc + (-x >> 3);
345 dest ^= (*srcPtr ^ 0xff) & m2;
346 *destPtr = (FX_BYTE)dest;
347 pLineDst += pDst->m_nStride;
348 pLineSrc += m_nStride;
352 case JBIG2_COMPOSE_REPLACE: {
353 for(yy = y0; yy < y1; ++yy) {
355 srcPtr = pLineSrc + (-x >> 3);
357 dest = (*srcPtr & m2) | (dest & m1);
358 *destPtr = (FX_BYTE)dest;
359 pLineDst += pDst->m_nStride;
360 pLineSrc += m_nStride;
369 case JBIG2_COMPOSE_OR: {
370 for(yy = y0; yy < y1; ++yy) {
371 destPtr = pLineDst + (x >> 3);
376 *destPtr++ = (FX_BYTE)dest;
378 for (; xx < x1 - 8; xx += 8) {
382 src = (((src0 << 8) | src1) >> s1) & 0xff;
384 *destPtr++ = (FX_BYTE)dest;
388 if(srcPtr - pLineSrc < m_nStride) {
393 src = (((src0 << 8) | src1) >> s1) & 0xff;
395 *destPtr = (FX_BYTE)dest;
396 pLineDst += pDst->m_nStride;
397 pLineSrc += m_nStride;
401 case JBIG2_COMPOSE_AND: {
402 for(yy = y0; yy < y1; ++yy) {
403 destPtr = pLineDst + (x >> 3);
407 dest &= (0xff00 | src1) >> s1;
408 *destPtr++ = (FX_BYTE)dest;
410 for (; xx < x1 - 8; xx += 8) {
414 src = (((src0 << 8) | src1) >> s1) & 0xff;
416 *destPtr++ = (FX_BYTE)dest;
420 if(srcPtr - pLineSrc < m_nStride) {
425 src = (((src0 << 8) | src1) >> s1) & 0xff;
427 *destPtr = (FX_BYTE)dest;
428 pLineDst += pDst->m_nStride;
429 pLineSrc += m_nStride;
433 case JBIG2_COMPOSE_XOR: {
434 for(yy = y0; yy < y1; ++yy) {
435 destPtr = pLineDst + (x >> 3);
440 *destPtr++ = (FX_BYTE)dest;
442 for (; xx < x1 - 8; xx += 8) {
446 src = (((src0 << 8) | src1) >> s1) & 0xff;
448 *destPtr++ = (FX_BYTE)dest;
452 if(srcPtr - pLineSrc < m_nStride) {
457 src = (((src0 << 8) | src1) >> s1) & 0xff;
459 *destPtr = (FX_BYTE)dest;
460 pLineDst += pDst->m_nStride;
461 pLineSrc += m_nStride;
465 case JBIG2_COMPOSE_XNOR: {
466 for(yy = y0; yy < y1; ++yy) {
467 destPtr = pLineDst + (x >> 3);
471 dest ^= (src1 ^ 0xff) >> s1;
472 *destPtr++ = (FX_BYTE)dest;
474 for (; xx < x1 - 8; xx += 8) {
478 src = (((src0 << 8) | src1) >> s1) & 0xff;
480 *destPtr++ = (FX_BYTE)dest;
484 if(srcPtr - pLineSrc < m_nStride) {
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;
497 case JBIG2_COMPOSE_REPLACE: {
498 for(yy = y0; yy < y1; ++yy) {
499 destPtr = pLineDst + (x >> 3);
503 dest = (dest & (0xff << s2)) | (src1 >> s1);
504 *destPtr++ = (FX_BYTE)dest;
506 for (; xx < x1 - 8; xx += 8) {
510 src = (((src0 << 8) | src1) >> s1) & 0xff;
512 *destPtr++ = (FX_BYTE)dest;
516 if(srcPtr - pLineSrc < m_nStride) {
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;
532 case JBIG2_COMPOSE_OR: {
533 for(yy = y0; yy < y1; ++yy) {
535 srcPtr = pLineSrc + (-x >> 3);
538 for (; xx < x1 - 8; xx += 8) {
542 src = (((src0 << 8) | src1) >> s1) & 0xff;
544 *destPtr++ = (FX_BYTE)dest;
548 if(srcPtr - pLineSrc < m_nStride) {
553 src = (((src0 << 8) | src1) >> s1) & 0xff;
555 *destPtr = (FX_BYTE)dest;
556 pLineDst += pDst->m_nStride;
557 pLineSrc += m_nStride;
561 case JBIG2_COMPOSE_AND: {
562 for(yy = y0; yy < y1; ++yy) {
564 srcPtr = pLineSrc + (-x >> 3);
567 for (; xx < x1 - 8; xx += 8) {
571 src = (((src0 << 8) | src1) >> s1) & 0xff;
573 *destPtr++ = (FX_BYTE)dest;
577 if(srcPtr - pLineSrc < m_nStride) {
582 src = (((src0 << 8) | src1) >> s1) & 0xff;
584 *destPtr = (FX_BYTE)dest;
585 pLineDst += pDst->m_nStride;
586 pLineSrc += m_nStride;
590 case JBIG2_COMPOSE_XOR: {
591 for(yy = y0; yy < y1; ++yy) {
593 srcPtr = pLineSrc + (-x >> 3);
596 for (; xx < x1 - 8; xx += 8) {
600 src = (((src0 << 8) | src1) >> s1) & 0xff;
602 *destPtr++ = (FX_BYTE)dest;
606 if(srcPtr - pLineSrc < m_nStride) {
611 src = (((src0 << 8) | src1) >> s1) & 0xff;
613 *destPtr = (FX_BYTE)dest;
614 pLineDst += pDst->m_nStride;
615 pLineSrc += m_nStride;
619 case JBIG2_COMPOSE_XNOR: {
620 for(yy = y0; yy < y1; ++yy) {
622 srcPtr = pLineSrc + (-x >> 3);
625 for (; xx < x1 - 8; xx += 8) {
629 src = (((src0 << 8) | src1) >> s1) & 0xff;
631 *destPtr++ = (FX_BYTE)dest;
635 if(srcPtr - pLineSrc < m_nStride) {
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;
648 case JBIG2_COMPOSE_REPLACE: {
649 for(yy = y0; yy < y1; ++yy) {
651 srcPtr = pLineSrc + (-x >> 3);
654 for (; xx < x1 - 8; xx += 8) {
658 src = (((src0 << 8) | src1) >> s1) & 0xff;
660 *destPtr++ = (FX_BYTE)dest;
664 if(srcPtr - pLineSrc < m_nStride) {
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;
682 FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)
687 return pSrc->composeTo(this, x, y, op);
689 FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)
694 return pSrc->composeTo(this, x, y, op, pSrcRect);
696 CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
698 CJBig2_Image *pImage;
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));
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_INT32 h)
711 CJBig2_Image *pImage;
713 FX_BYTE *pLineSrc, *pLineDst;
715 FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;
716 if (w == 0 || h == 0) {
719 JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
724 if (!pImage->m_pData) {
727 pLineSrc = m_pData + m_nStride * y;
728 pLineDst = pImage->m_pData;
732 for(j = 0; j < h; j++) {
734 pSrcEnd = pLineSrc + m_nStride;
736 pDstEnd = pLineDst + pImage->m_nStride;
737 for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
738 *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
740 pLineSrc += m_nStride;
741 pLineDst += pImage->m_nStride;
744 for(j = 0; j < h; j++) {
746 pSrcEnd = pLineSrc + m_nStride;
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));
753 wTmp = JBIG2_GETDWORD(pSrc) << n;
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;
760 pLineSrc += m_nStride;
761 pLineDst += pImage->m_nStride;
766 void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
771 m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);
773 JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
777 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
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;
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;
785 FX_BYTE *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL;
790 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
796 if(y + m_nHeight > pDst->m_nHeight) {
797 ys1 = pDst->m_nHeight - y;
804 if(x + m_nWidth > pDst->m_nWidth) {
805 xs1 = pDst->m_nWidth - x;
809 if((ys0 >= ys1) || (xs0 >= xs1)) {
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)) {
835 for(yy = yd0; yy < yd1; yy++) {
836 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
837 tmp2 = JBIG2_GETDWORD(lineDst);
839 case JBIG2_COMPOSE_OR:
840 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
842 case JBIG2_COMPOSE_AND:
843 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
845 case JBIG2_COMPOSE_XOR:
846 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
848 case JBIG2_COMPOSE_XNOR:
849 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
851 case JBIG2_COMPOSE_REPLACE:
852 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
864 for(yy = yd0; yy < yd1; yy++) {
865 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
866 tmp2 = JBIG2_GETDWORD(lineDst);
868 case JBIG2_COMPOSE_OR:
869 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
871 case JBIG2_COMPOSE_AND:
872 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
874 case JBIG2_COMPOSE_XOR:
875 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
877 case JBIG2_COMPOSE_XNOR:
878 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
880 case JBIG2_COMPOSE_REPLACE:
881 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
894 shift2 = 32 - shift1;
895 for(yy = yd0; yy < yd1; yy++) {
896 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
897 tmp2 = JBIG2_GETDWORD(lineDst);
899 case JBIG2_COMPOSE_OR:
900 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
902 case JBIG2_COMPOSE_AND:
903 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
905 case JBIG2_COMPOSE_XOR:
906 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
908 case JBIG2_COMPOSE_XNOR:
909 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
911 case JBIG2_COMPOSE_REPLACE:
912 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
926 shift2 = 32 - shift1;
927 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
928 for(yy = yd0; yy < yd1; yy++) {
932 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
933 tmp2 = JBIG2_GETDWORD(dp);
935 case JBIG2_COMPOSE_OR:
936 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
938 case JBIG2_COMPOSE_AND:
939 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
941 case JBIG2_COMPOSE_XOR:
942 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
944 case JBIG2_COMPOSE_XNOR:
945 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
947 case JBIG2_COMPOSE_REPLACE:
948 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
958 for(xx = 0; xx < middleDwords; xx++) {
959 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
960 tmp2 = JBIG2_GETDWORD(dp);
962 case JBIG2_COMPOSE_OR:
965 case JBIG2_COMPOSE_AND:
968 case JBIG2_COMPOSE_XOR:
971 case JBIG2_COMPOSE_XNOR:
972 tmp = ~(tmp1 ^ tmp2);
974 case JBIG2_COMPOSE_REPLACE:
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;
986 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
987 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
988 tmp2 = JBIG2_GETDWORD(dp);
990 case JBIG2_COMPOSE_OR:
991 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
993 case JBIG2_COMPOSE_AND:
994 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
996 case JBIG2_COMPOSE_XOR:
997 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
999 case JBIG2_COMPOSE_XNOR:
1000 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1002 case JBIG2_COMPOSE_REPLACE:
1003 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1011 lineSrc += m_nStride;
1012 lineDst += pDst->m_nStride;
1014 } else if(s1 == d1) {
1015 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1016 for(yy = yd0; yy < yd1; yy++) {
1020 tmp1 = JBIG2_GETDWORD(sp);
1021 tmp2 = JBIG2_GETDWORD(dp);
1023 case JBIG2_COMPOSE_OR:
1024 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1026 case JBIG2_COMPOSE_AND:
1027 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1029 case JBIG2_COMPOSE_XOR:
1030 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1032 case JBIG2_COMPOSE_XNOR:
1033 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1035 case JBIG2_COMPOSE_REPLACE:
1036 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
1046 for(xx = 0; xx < middleDwords; xx++) {
1047 tmp1 = JBIG2_GETDWORD(sp);
1048 tmp2 = JBIG2_GETDWORD(dp);
1050 case JBIG2_COMPOSE_OR:
1053 case JBIG2_COMPOSE_AND:
1056 case JBIG2_COMPOSE_XOR:
1059 case JBIG2_COMPOSE_XNOR:
1060 tmp = ~(tmp1 ^ tmp2);
1062 case JBIG2_COMPOSE_REPLACE:
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;
1074 tmp1 = JBIG2_GETDWORD(sp);
1075 tmp2 = JBIG2_GETDWORD(dp);
1077 case JBIG2_COMPOSE_OR:
1078 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1080 case JBIG2_COMPOSE_AND:
1081 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1083 case JBIG2_COMPOSE_XOR:
1084 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1086 case JBIG2_COMPOSE_XNOR:
1087 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1089 case JBIG2_COMPOSE_REPLACE:
1090 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1098 lineSrc += m_nStride;
1099 lineDst += pDst->m_nStride;
1103 shift2 = 32 - shift1;
1104 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1105 for(yy = yd0; yy < yd1; yy++) {
1109 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1110 tmp2 = JBIG2_GETDWORD(dp);
1112 case JBIG2_COMPOSE_OR:
1113 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1115 case JBIG2_COMPOSE_AND:
1116 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1118 case JBIG2_COMPOSE_XOR:
1119 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1121 case JBIG2_COMPOSE_XNOR:
1122 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1124 case JBIG2_COMPOSE_REPLACE:
1125 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
1134 for(xx = 0; xx < middleDwords; xx++) {
1135 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1136 tmp2 = JBIG2_GETDWORD(dp);
1138 case JBIG2_COMPOSE_OR:
1141 case JBIG2_COMPOSE_AND:
1144 case JBIG2_COMPOSE_XOR:
1147 case JBIG2_COMPOSE_XNOR:
1148 tmp = ~(tmp1 ^ tmp2);
1150 case JBIG2_COMPOSE_REPLACE:
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;
1162 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
1163 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
1164 tmp2 = JBIG2_GETDWORD(dp);
1166 case JBIG2_COMPOSE_OR:
1167 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1169 case JBIG2_COMPOSE_AND:
1170 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1172 case JBIG2_COMPOSE_XOR:
1173 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1175 case JBIG2_COMPOSE_XNOR:
1176 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1178 case JBIG2_COMPOSE_REPLACE:
1179 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1187 lineSrc += m_nStride;
1188 lineDst += pDst->m_nStride;
1194 FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
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, maskM;
1198 FX_BYTE *lineSrc, *lineDst, *sp, *dp;
1203 if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
1206 sw = pSrcRect->Width();
1207 sh = pSrcRect->Height();
1213 if(y + sh > pDst->m_nHeight) {
1214 ys1 = pDst->m_nHeight - y;
1223 if(x + sw > pDst->m_nWidth) {
1224 xs1 = pDst->m_nWidth - x;
1228 if((ys0 >= ys1) || (xs0 >= xs1)) {
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->left) >> 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)) {
1258 for(yy = yd0; yy < yd1; yy++) {
1259 tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
1260 tmp2 = JBIG2_GETDWORD(lineDst);
1262 case JBIG2_COMPOSE_OR:
1263 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1265 case JBIG2_COMPOSE_AND:
1266 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1268 case JBIG2_COMPOSE_XOR:
1269 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1271 case JBIG2_COMPOSE_XNOR:
1272 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1274 case JBIG2_COMPOSE_REPLACE:
1275 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
1287 for(yy = yd0; yy < yd1; yy++) {
1288 tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
1289 tmp2 = JBIG2_GETDWORD(lineDst);
1291 case JBIG2_COMPOSE_OR:
1292 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1294 case JBIG2_COMPOSE_AND:
1295 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1297 case JBIG2_COMPOSE_XOR:
1298 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1300 case JBIG2_COMPOSE_XNOR:
1301 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1303 case JBIG2_COMPOSE_REPLACE:
1304 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
1317 shift2 = 32 - shift1;
1318 for(yy = yd0; yy < yd1; yy++) {
1319 tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
1320 tmp2 = JBIG2_GETDWORD(lineDst);
1322 case JBIG2_COMPOSE_OR:
1323 tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
1325 case JBIG2_COMPOSE_AND:
1326 tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
1328 case JBIG2_COMPOSE_XOR:
1329 tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
1331 case JBIG2_COMPOSE_XNOR:
1332 tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
1334 case JBIG2_COMPOSE_REPLACE:
1335 tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
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;
1349 shift2 = 32 - shift1;
1350 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1351 for(yy = yd0; yy < yd1; yy++) {
1355 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
1356 tmp2 = JBIG2_GETDWORD(dp);
1358 case JBIG2_COMPOSE_OR:
1359 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1361 case JBIG2_COMPOSE_AND:
1362 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1364 case JBIG2_COMPOSE_XOR:
1365 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1367 case JBIG2_COMPOSE_XNOR:
1368 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1370 case JBIG2_COMPOSE_REPLACE:
1371 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
1381 for(xx = 0; xx < middleDwords; xx++) {
1382 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
1383 tmp2 = JBIG2_GETDWORD(dp);
1385 case JBIG2_COMPOSE_OR:
1388 case JBIG2_COMPOSE_AND:
1391 case JBIG2_COMPOSE_XOR:
1394 case JBIG2_COMPOSE_XNOR:
1395 tmp = ~(tmp1 ^ tmp2);
1397 case JBIG2_COMPOSE_REPLACE:
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;
1409 tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
1410 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
1411 tmp2 = JBIG2_GETDWORD(dp);
1413 case JBIG2_COMPOSE_OR:
1414 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1416 case JBIG2_COMPOSE_AND:
1417 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1419 case JBIG2_COMPOSE_XOR:
1420 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1422 case JBIG2_COMPOSE_XNOR:
1423 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1425 case JBIG2_COMPOSE_REPLACE:
1426 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1434 lineSrc += m_nStride;
1435 lineDst += pDst->m_nStride;
1437 } else if(s1 == d1) {
1438 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1439 for(yy = yd0; yy < yd1; yy++) {
1443 tmp1 = JBIG2_GETDWORD(sp);
1444 tmp2 = JBIG2_GETDWORD(dp);
1446 case JBIG2_COMPOSE_OR:
1447 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1449 case JBIG2_COMPOSE_AND:
1450 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1452 case JBIG2_COMPOSE_XOR:
1453 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1455 case JBIG2_COMPOSE_XNOR:
1456 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1458 case JBIG2_COMPOSE_REPLACE:
1459 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
1469 for(xx = 0; xx < middleDwords; xx++) {
1470 tmp1 = JBIG2_GETDWORD(sp);
1471 tmp2 = JBIG2_GETDWORD(dp);
1473 case JBIG2_COMPOSE_OR:
1476 case JBIG2_COMPOSE_AND:
1479 case JBIG2_COMPOSE_XOR:
1482 case JBIG2_COMPOSE_XNOR:
1483 tmp = ~(tmp1 ^ tmp2);
1485 case JBIG2_COMPOSE_REPLACE:
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;
1497 tmp1 = JBIG2_GETDWORD(sp);
1498 tmp2 = JBIG2_GETDWORD(dp);
1500 case JBIG2_COMPOSE_OR:
1501 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1503 case JBIG2_COMPOSE_AND:
1504 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1506 case JBIG2_COMPOSE_XOR:
1507 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1509 case JBIG2_COMPOSE_XNOR:
1510 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1512 case JBIG2_COMPOSE_REPLACE:
1513 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1521 lineSrc += m_nStride;
1522 lineDst += pDst->m_nStride;
1526 shift2 = 32 - shift1;
1527 middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
1528 for(yy = yd0; yy < yd1; yy++) {
1532 tmp1 = JBIG2_GETDWORD(sp) >> shift1;
1533 tmp2 = JBIG2_GETDWORD(dp);
1535 case JBIG2_COMPOSE_OR:
1536 tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
1538 case JBIG2_COMPOSE_AND:
1539 tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
1541 case JBIG2_COMPOSE_XOR:
1542 tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
1544 case JBIG2_COMPOSE_XNOR:
1545 tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
1547 case JBIG2_COMPOSE_REPLACE:
1548 tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
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;
1557 for(xx = 0; xx < middleDwords; xx++) {
1558 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
1559 tmp2 = JBIG2_GETDWORD(dp);
1561 case JBIG2_COMPOSE_OR:
1564 case JBIG2_COMPOSE_AND:
1567 case JBIG2_COMPOSE_XOR:
1570 case JBIG2_COMPOSE_XNOR:
1571 tmp = ~(tmp1 ^ tmp2);
1573 case JBIG2_COMPOSE_REPLACE:
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;
1585 tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
1586 ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
1587 tmp2 = JBIG2_GETDWORD(dp);
1589 case JBIG2_COMPOSE_OR:
1590 tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
1592 case JBIG2_COMPOSE_AND:
1593 tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
1595 case JBIG2_COMPOSE_XOR:
1596 tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
1598 case JBIG2_COMPOSE_XNOR:
1599 tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
1601 case JBIG2_COMPOSE_REPLACE:
1602 tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
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;
1610 lineSrc += m_nStride;
1611 lineDst += pDst->m_nStride;