diff options
author | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-23 17:28:10 -0700 |
---|---|---|
committer | John Abd-El-Malek <jabdelmalek@google.com> | 2014-05-23 17:41:56 -0700 |
commit | 3f3b45cc74b0499912409f766a595945dbbfc4c5 (patch) | |
tree | ec400b6965477b88ea7f0d335f7e5c52044c346c /core/src/fxcodec/jbig2/JBig2_Image.cpp | |
parent | 6fe4aed948337175f6f7f81bb03c37b9c7f535da (diff) | |
download | pdfium-3f3b45cc74b0499912409f766a595945dbbfc4c5.tar.xz |
Convert all line endings to LF.
Diffstat (limited to 'core/src/fxcodec/jbig2/JBig2_Image.cpp')
-rw-r--r-- | core/src/fxcodec/jbig2/JBig2_Image.cpp | 3238 |
1 files changed, 1619 insertions, 1619 deletions
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp index 1719028176..09353c0e81 100644 --- a/core/src/fxcodec/jbig2/JBig2_Image.cpp +++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp @@ -1,1619 +1,1619 @@ -// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "JBig2_Image.h"
-#include "../../../include/fxcrt/fx_basic.h"
-#include "../../../include/fxcrt/fx_coordinates.h"
-#include <limits.h>
-CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h)
-{
- m_nWidth = w;
- m_nHeight = h;
- if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) {
- m_pData = NULL;
- m_bNeedFree = FALSE;
- return;
- }
- m_nStride = ((w + 31) >> 5) << 2;
- if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) {
- m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
- } else {
- m_pData = NULL;
- }
- m_bNeedFree = TRUE;
-}
-CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf)
-{
- m_nWidth = w;
- m_nHeight = h;
- m_nStride = stride;
- m_pData = pBuf;
- m_bNeedFree = FALSE;
-}
-CJBig2_Image::CJBig2_Image(CJBig2_Image &im)
-{
- m_pModule = im.m_pModule;
- m_nWidth = im.m_nWidth;
- m_nHeight = im.m_nHeight;
- m_nStride = im.m_nStride;
- if (im.m_pData) {
- m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight);
- JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight);
- } else {
- m_pData = NULL;
- }
- m_bNeedFree = TRUE;
-}
-CJBig2_Image::~CJBig2_Image()
-{
- if(m_bNeedFree && m_pData) {
- m_pModule->JBig2_Free(m_pData);
- }
-}
-FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y)
-{
- if (!m_pData) {
- return 0;
- }
- FX_INT32 m, n;
- if(x < 0 || x >= m_nWidth) {
- return 0;
- }
- if(y < 0 || y >= m_nHeight) {
- return 0;
- }
- m = y * m_nStride + (x >> 3);
- n = x & 7;
- return ((m_pData[m] >> (7 - n)) & 1);
-}
-
-FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v)
-{
- if (!m_pData) {
- return 0;
- }
- FX_INT32 m, n;
- if(x < 0 || x >= m_nWidth) {
- return 0;
- }
- if(y < 0 || y >= m_nHeight) {
- return 0;
- }
- m = y * m_nStride + (x >> 3);
- n = x & 7;
- if(v) {
- m_pData[m] |= 1 << (7 - n);
- } else {
- m_pData[m] &= ~(1 << (7 - n));
- }
- return 1;
-}
-void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom)
-{
- if (!m_pData) {
- return;
- }
- if(hFrom < 0 || hFrom >= m_nHeight) {
- JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride);
- } else {
- JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride);
- }
-}
-void CJBig2_Image::fill(FX_BOOL v)
-{
- if (!m_pData) {
- return;
- }
- JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight);
-}
-FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- if (!m_pData) {
- return FALSE;
- }
- return composeTo_opt2(pDst, x, y, op);
-}
-FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- if (!m_pData) {
- return FALSE;
- }
- if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) {
- return composeTo_opt2(pDst, x, y, op);
- }
- return composeTo_opt2(pDst, x, y, op, pSrcRect);
-}
-FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 w, h, dx, dy;
- FX_INT32 i, j;
- w = m_nWidth;
- h = m_nHeight;
- dx = dy = 0;
- if(x < 0) {
- dx += -x;
- w -= -x;
- x = 0;
- }
- if(y < 0) {
- dy += -y;
- h -= -y;
- y = 0;
- }
- if(x + w > pDst->m_nWidth) {
- w = pDst->m_nWidth - x;
- }
- if(y + h > pDst->m_nHeight) {
- h = pDst->m_nHeight - y;
- }
- switch(op) {
- case JBIG2_COMPOSE_OR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_AND:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_XOR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j,
- (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1);
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE:
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy));
- }
- }
- break;
- }
- return TRUE;
-}
-
-FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 x0, x1, y0, y1, xx, yy;
- FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr;
- FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3;
- FX_BOOL oneByte;
- if (!m_pData) {
- return FALSE;
- }
- if (y < 0) {
- y0 = -y;
- } else {
- y0 = 0;
- }
- if (y + m_nHeight > pDst->m_nHeight) {
- y1 = pDst->m_nHeight - y;
- } else {
- y1 = m_nHeight;
- }
- if (y0 >= y1) {
- return FALSE;
- }
- if (x >= 0) {
- x0 = x & ~7;
- } else {
- x0 = 0;
- }
- x1 = x + m_nWidth;
- if (x1 > pDst->m_nWidth) {
- x1 = pDst->m_nWidth;
- }
- if (x0 >= x1) {
- return FALSE;
- }
- s1 = x & 7;
- s2 = 8 - s1;
- m1 = 0xff >> (x1 & 7);
- m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
- m3 = (0xff >> s1) & m2;
- oneByte = x0 == ((x1 - 1) & ~7);
- pLineDst = pDst->m_pData + y * pDst->m_nStride;
- pLineSrc = m_pData + y0 * m_nStride;
- if(oneByte) {
- if(x >= 0) {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest |= (*srcPtr >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest &= ((0xff00 | *srcPtr) >> s1) | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest ^= (*srcPtr >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest ^= ((*srcPtr ^ 0xff) >> s1) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for (yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- dest = *destPtr;
- dest = (dest & ~m3) | ((*srcPtr >> s1) & m3);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- } else {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest |= *srcPtr & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest &= *srcPtr | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest ^= *srcPtr & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest ^= (*srcPtr ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- dest = *destPtr;
- dest = (*srcPtr & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- }
- } else {
- if(x >= 0) {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest |= src1 >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest &= (0xff00 | src1) >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest ^= src1 >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest ^= (src1 ^ 0xff) >> s1;
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src ^ 0xff;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= (src ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst + (x >> 3);
- srcPtr = pLineSrc;
- src1 = *srcPtr++;
- dest = *destPtr;
- dest = (dest & (0xff << s2)) | (src1 >> s1);
- *destPtr++ = (FX_BYTE)dest;
- xx = x0 + 8;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = (src & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- } else {
- switch(op) {
- case JBIG2_COMPOSE_OR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest |= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_AND: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest &= src | m1;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_XNOR: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= src ^ 0xff;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest ^= (src ^ 0xff) & m2;
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- case JBIG2_COMPOSE_REPLACE: {
- for(yy = y0; yy < y1; ++yy) {
- destPtr = pLineDst;
- srcPtr = pLineSrc + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = src;
- *destPtr++ = (FX_BYTE)dest;
- }
- dest = *destPtr;
- src0 = src1;
- if(srcPtr - pLineSrc < m_nStride) {
- src1 = *srcPtr++;
- } else {
- src1 = 0;
- }
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- dest = (src & m2) | (dest & m1);
- *destPtr = (FX_BYTE)dest;
- pLineDst += pDst->m_nStride;
- pLineSrc += m_nStride;
- }
- }
- break;
- }
- }
- }
- return TRUE;
-}
-FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op)
-{
- if (!m_pData) {
- return FALSE;
- }
- return pSrc->composeTo(this, x, y, op);
-}
-FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- if (!m_pData) {
- return FALSE;
- }
- return pSrc->composeTo(this, x, y, op, pSrcRect);
-}
-CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
-{
- CJBig2_Image *pImage;
- FX_INT32 i, j;
- JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
- for(j = 0; j < h; j++) {
- for(i = 0; i < w; i++) {
- pImage->setPixel(i, j, getPixel(x + i, y + j));
- }
- }
- return pImage;
-}
-#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3]))
-CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h)
-{
- CJBig2_Image *pImage;
- FX_INT32 m, n, j;
- FX_BYTE *pLineSrc, *pLineDst;
- FX_DWORD wTmp;
- FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd;
- if (w == 0 || h == 0) {
- return NULL;
- }
- JBIG2_ALLOC(pImage, CJBig2_Image(w, h));
- if (!m_pData) {
- pImage->fill(0);
- return pImage;
- }
- if (!pImage->m_pData) {
- return pImage;
- }
- pLineSrc = m_pData + m_nStride * y;
- pLineDst = pImage->m_pData;
- m = (x >> 5) << 2;
- n = x & 31;
- if(n == 0) {
- for(j = 0; j < h; j++) {
- pSrc = pLineSrc + m;
- pSrcEnd = pLineSrc + m_nStride;
- pDst = pLineDst;
- pDstEnd = pLineDst + pImage->m_nStride;
- for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
- *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc);
- }
- pLineSrc += m_nStride;
- pLineDst += pImage->m_nStride;
- }
- } else {
- for(j = 0; j < h; j++) {
- pSrc = pLineSrc + m;
- pSrcEnd = pLineSrc + m_nStride;
- pDst = pLineDst;
- pDstEnd = pLineDst + pImage->m_nStride;
- for(; pDst < pDstEnd; pSrc += 4, pDst += 4) {
- if(pSrc + 4 < pSrcEnd) {
- wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n));
- } else {
- wTmp = JBIG2_GETDWORD(pSrc) << n;
- }
- pDst[0] = (FX_BYTE)(wTmp >> 24);
- pDst[1] = (FX_BYTE)(wTmp >> 16);
- pDst[2] = (FX_BYTE)(wTmp >> 8);
- pDst[3] = (FX_BYTE)wTmp;
- }
- pLineSrc += m_nStride;
- pLineDst += pImage->m_nStride;
- }
- }
- return pImage;
-}
-void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v)
-{
- if (!m_pData) {
- return;
- }
- m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride);
- if(h > m_nHeight) {
- JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride);
- }
- m_nHeight = h;
-}
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op)
-{
- FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
- FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
- FX_BYTE *lineSrc, *lineDst, *sp, *dp;
- if (!m_pData) {
- return FALSE;
- }
- if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
- return FALSE;
- }
- if(y < 0) {
- ys0 = -y;
- } else {
- ys0 = 0;
- }
- if(y + m_nHeight > pDst->m_nHeight) {
- ys1 = pDst->m_nHeight - y;
- } else {
- ys1 = m_nHeight;
- }
- if(x < 0) {
- xs0 = -x;
- } else {
- xs0 = 0;
- }
- if(x + m_nWidth > pDst->m_nWidth) {
- xs1 = pDst->m_nWidth - x;
- } else {
- xs1 = m_nWidth;
- }
- if((ys0 >= ys1) || (xs0 >= xs1)) {
- return 0;
- }
- w = xs1 - xs0;
- h = ys1 - ys0;
- if(y < 0) {
- yd0 = 0;
- } else {
- yd0 = y;
- }
- if(x < 0) {
- xd0 = 0;
- } else {
- xd0 = x;
- }
- xd1 = xd0 + w;
- yd1 = yd0 + h;
- d1 = xd0 & 31;
- d2 = xd1 & 31;
- s1 = xs0 & 31;
- maskL = 0xffffffff >> d1;
- maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
- maskM = maskL & maskR;
- lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2);
- lineLeft = m_nStride - ((xs0 >> 5) << 2);
- lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
- if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
- if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
- if(s1 > d1) {
- shift = s1 - d1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift = d1 - s1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- if(s1 > d1) {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else if(s1 == d1) {
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift1 = d1 - s1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp) >> shift1;
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- }
- return 1;
-}
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect)
-{
- FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft;
- FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM;
- FX_BYTE *lineSrc, *lineDst, *sp, *dp;
- FX_INT32 sw, sh;
- if (!m_pData) {
- return FALSE;
- }
- if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) {
- return FALSE;
- }
- sw = pSrcRect->Width();
- sh = pSrcRect->Height();
- if(y < 0) {
- ys0 = -y;
- } else {
- ys0 = 0;
- }
- if(y + sh > pDst->m_nHeight) {
- ys1 = pDst->m_nHeight - y;
- } else {
- ys1 = sh;
- }
- if(x < 0) {
- xs0 = -x;
- } else {
- xs0 = 0;
- }
- if(x + sw > pDst->m_nWidth) {
- xs1 = pDst->m_nWidth - x;
- } else {
- xs1 = sw;
- }
- if((ys0 >= ys1) || (xs0 >= xs1)) {
- return 0;
- }
- w = xs1 - xs0;
- h = ys1 - ys0;
- if(y < 0) {
- yd0 = 0;
- } else {
- yd0 = y;
- }
- if(x < 0) {
- xd0 = 0;
- } else {
- xd0 = x;
- }
- xd1 = xd0 + w;
- yd1 = yd0 + h;
- d1 = xd0 & 31;
- d2 = xd1 & 31;
- s1 = xs0 & 31;
- maskL = 0xffffffff >> d1;
- maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32);
- maskM = maskL & maskR;
- lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2);
- lineLeft = m_nStride - ((xs0 >> 5) << 2);
- lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2);
- if((xd0 & ~31) == ((xd1 - 1) & ~31)) {
- if((xs0 & ~31) == ((xs1 - 1) & ~31)) {
- if(s1 > d1) {
- shift = s1 - d1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) << shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift = d1 - s1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = JBIG2_GETDWORD(lineSrc) >> shift;
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- for(yy = yd0; yy < yd1; yy++) {
- tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(lineDst);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskM) | (tmp1 & maskM);
- break;
- }
- lineDst[0] = (FX_BYTE)(tmp >> 24);
- lineDst[1] = (FX_BYTE)(tmp >> 16);
- lineDst[2] = (FX_BYTE)(tmp >> 8);
- lineDst[3] = (FX_BYTE)tmp;
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- } else {
- if(s1 > d1) {
- shift1 = s1 - d1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else if(s1 == d1) {
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = JBIG2_GETDWORD(sp);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- } else {
- shift1 = d1 - s1;
- shift2 = 32 - shift1;
- middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5);
- for(yy = yd0; yy < yd1; yy++) {
- sp = lineSrc;
- dp = lineDst;
- if(d1 != 0) {
- tmp1 = JBIG2_GETDWORD(sp) >> shift1;
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskL) | (tmp1 & maskL);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- dp += 4;
- }
- for(xx = 0; xx < middleDwords; xx++) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = tmp1 | tmp2;
- break;
- case JBIG2_COMPOSE_AND:
- tmp = tmp1 & tmp2;
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = tmp1 ^ tmp2;
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = ~(tmp1 ^ tmp2);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = tmp1;
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- sp += 4;
- dp += 4;
- }
- if(d2 != 0) {
- tmp1 = (JBIG2_GETDWORD(sp) << shift2) | (
- ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1);
- tmp2 = JBIG2_GETDWORD(dp);
- switch(op) {
- case JBIG2_COMPOSE_OR:
- tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_AND:
- tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XOR:
- tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR);
- break;
- case JBIG2_COMPOSE_XNOR:
- tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR);
- break;
- case JBIG2_COMPOSE_REPLACE:
- tmp = (tmp2 & ~maskR) | (tmp1 & maskR);
- break;
- }
- dp[0] = (FX_BYTE)(tmp >> 24);
- dp[1] = (FX_BYTE)(tmp >> 16);
- dp[2] = (FX_BYTE)(tmp >> 8);
- dp[3] = (FX_BYTE)tmp;
- }
- lineSrc += m_nStride;
- lineDst += pDst->m_nStride;
- }
- }
- }
- return 1;
-}
+// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#include "JBig2_Image.h" +#include "../../../include/fxcrt/fx_basic.h" +#include "../../../include/fxcrt/fx_coordinates.h" +#include <limits.h> +CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h) +{ + m_nWidth = w; + m_nHeight = h; + if (m_nWidth <= 0 || m_nHeight <= 0 || m_nWidth > INT_MAX - 31) { + m_pData = NULL; + m_bNeedFree = FALSE; + return; + } + m_nStride = ((w + 31) >> 5) << 2; + if (m_nStride * m_nHeight > 0 && 104857600 / (int)m_nStride > m_nHeight) { + m_pData = (FX_BYTE *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); + } else { + m_pData = NULL; + } + m_bNeedFree = TRUE; +} +CJBig2_Image::CJBig2_Image(FX_INT32 w, FX_INT32 h, FX_INT32 stride, FX_BYTE*pBuf) +{ + m_nWidth = w; + m_nHeight = h; + m_nStride = stride; + m_pData = pBuf; + m_bNeedFree = FALSE; +} +CJBig2_Image::CJBig2_Image(CJBig2_Image &im) +{ + m_pModule = im.m_pModule; + m_nWidth = im.m_nWidth; + m_nHeight = im.m_nHeight; + m_nStride = im.m_nStride; + if (im.m_pData) { + m_pData = (FX_BYTE*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); + JBIG2_memcpy(m_pData, im.m_pData, m_nStride * m_nHeight); + } else { + m_pData = NULL; + } + m_bNeedFree = TRUE; +} +CJBig2_Image::~CJBig2_Image() +{ + if(m_bNeedFree && m_pData) { + m_pModule->JBig2_Free(m_pData); + } +} +FX_BOOL CJBig2_Image::getPixel(FX_INT32 x, FX_INT32 y) +{ + if (!m_pData) { + return 0; + } + FX_INT32 m, n; + if(x < 0 || x >= m_nWidth) { + return 0; + } + if(y < 0 || y >= m_nHeight) { + return 0; + } + m = y * m_nStride + (x >> 3); + n = x & 7; + return ((m_pData[m] >> (7 - n)) & 1); +} + +FX_INT32 CJBig2_Image::setPixel(FX_INT32 x, FX_INT32 y, FX_BOOL v) +{ + if (!m_pData) { + return 0; + } + FX_INT32 m, n; + if(x < 0 || x >= m_nWidth) { + return 0; + } + if(y < 0 || y >= m_nHeight) { + return 0; + } + m = y * m_nStride + (x >> 3); + n = x & 7; + if(v) { + m_pData[m] |= 1 << (7 - n); + } else { + m_pData[m] &= ~(1 << (7 - n)); + } + return 1; +} +void CJBig2_Image::copyLine(FX_INT32 hTo, FX_INT32 hFrom) +{ + if (!m_pData) { + return; + } + if(hFrom < 0 || hFrom >= m_nHeight) { + JBIG2_memset(m_pData + hTo * m_nStride, 0, m_nStride); + } else { + JBIG2_memcpy(m_pData + hTo * m_nStride, m_pData + hFrom * m_nStride, m_nStride); + } +} +void CJBig2_Image::fill(FX_BOOL v) +{ + if (!m_pData) { + return; + } + JBIG2_memset(m_pData, v ? 0xff : 0, m_nStride * m_nHeight); +} +FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op) +{ + if (!m_pData) { + return FALSE; + } + return composeTo_opt2(pDst, x, y, op); +} +FX_BOOL CJBig2_Image::composeTo(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect) +{ + if (!m_pData) { + return FALSE; + } + if (NULL == pSrcRect || *pSrcRect == FX_RECT(0, 0, m_nWidth, m_nHeight)) { + return composeTo_opt2(pDst, x, y, op); + } + return composeTo_opt2(pDst, x, y, op, pSrcRect); +} +FX_BOOL CJBig2_Image::composeTo_unopt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op) +{ + FX_INT32 w, h, dx, dy; + FX_INT32 i, j; + w = m_nWidth; + h = m_nHeight; + dx = dy = 0; + if(x < 0) { + dx += -x; + w -= -x; + x = 0; + } + if(y < 0) { + dy += -y; + h -= -y; + y = 0; + } + if(x + w > pDst->m_nWidth) { + w = pDst->m_nWidth - x; + } + if(y + h > pDst->m_nHeight) { + h = pDst->m_nHeight - y; + } + switch(op) { + case JBIG2_COMPOSE_OR: + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pDst->setPixel(x + i, y + j, + (getPixel(i + dx, j + dy) | pDst->getPixel(x + i, y + j)) & 1); + } + } + break; + case JBIG2_COMPOSE_AND: + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pDst->setPixel(x + i, y + j, + (getPixel(i + dx, j + dy) & pDst->getPixel(x + i, y + j)) & 1); + } + } + break; + case JBIG2_COMPOSE_XOR: + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pDst->setPixel(x + i, y + j, + (getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j)) & 1); + } + } + break; + case JBIG2_COMPOSE_XNOR: + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pDst->setPixel(x + i, y + j, + (~(getPixel(i + dx, j + dy) ^ pDst->getPixel(x + i, y + j))) & 1); + } + } + break; + case JBIG2_COMPOSE_REPLACE: + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pDst->setPixel(x + i, y + j, getPixel(i + dx, j + dy)); + } + } + break; + } + return TRUE; +} + +FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op) +{ + FX_INT32 x0, x1, y0, y1, xx, yy; + FX_BYTE *pLineSrc, *pLineDst, *srcPtr, *destPtr; + FX_DWORD src0, src1, src, dest, s1, s2, m1, m2, m3; + FX_BOOL oneByte; + if (!m_pData) { + return FALSE; + } + if (y < 0) { + y0 = -y; + } else { + y0 = 0; + } + if (y + m_nHeight > pDst->m_nHeight) { + y1 = pDst->m_nHeight - y; + } else { + y1 = m_nHeight; + } + if (y0 >= y1) { + return FALSE; + } + if (x >= 0) { + x0 = x & ~7; + } else { + x0 = 0; + } + x1 = x + m_nWidth; + if (x1 > pDst->m_nWidth) { + x1 = pDst->m_nWidth; + } + if (x0 >= x1) { + return FALSE; + } + s1 = x & 7; + s2 = 8 - s1; + m1 = 0xff >> (x1 & 7); + m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7)); + m3 = (0xff >> s1) & m2; + oneByte = x0 == ((x1 - 1) & ~7); + pLineDst = pDst->m_pData + y * pDst->m_nStride; + pLineSrc = m_pData + y0 * m_nStride; + if(oneByte) { + if(x >= 0) { + switch(op) { + case JBIG2_COMPOSE_OR: { + for (yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + dest = *destPtr; + dest |= (*srcPtr >> s1) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_AND: { + for (yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + dest = *destPtr; + dest &= ((0xff00 | *srcPtr) >> s1) | m1; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XOR: { + for (yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + dest = *destPtr; + dest ^= (*srcPtr >> s1) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XNOR: { + for (yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + dest = *destPtr; + dest ^= ((*srcPtr ^ 0xff) >> s1) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_REPLACE: { + for (yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + dest = *destPtr; + dest = (dest & ~m3) | ((*srcPtr >> s1) & m3); + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + } + } else { + switch(op) { + case JBIG2_COMPOSE_OR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + dest = *destPtr; + dest |= *srcPtr & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_AND: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + dest = *destPtr; + dest &= *srcPtr | m1; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + dest = *destPtr; + dest ^= *srcPtr & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XNOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + dest = *destPtr; + dest ^= (*srcPtr ^ 0xff) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_REPLACE: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + dest = *destPtr; + dest = (*srcPtr & m2) | (dest & m1); + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + } + } + } else { + if(x >= 0) { + switch(op) { + case JBIG2_COMPOSE_OR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + src1 = *srcPtr++; + dest = *destPtr; + dest |= src1 >> s1; + *destPtr++ = (FX_BYTE)dest; + xx = x0 + 8; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest |= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest |= src & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_AND: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + src1 = *srcPtr++; + dest = *destPtr; + dest &= (0xff00 | src1) >> s1; + *destPtr++ = (FX_BYTE)dest; + xx = x0 + 8; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest &= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest &= src | m1; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + src1 = *srcPtr++; + dest = *destPtr; + dest ^= src1 >> s1; + *destPtr++ = (FX_BYTE)dest; + xx = x0 + 8; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XNOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + src1 = *srcPtr++; + dest = *destPtr; + dest ^= (src1 ^ 0xff) >> s1; + *destPtr++ = (FX_BYTE)dest; + xx = x0 + 8; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src ^ 0xff; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= (src ^ 0xff) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_REPLACE: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst + (x >> 3); + srcPtr = pLineSrc; + src1 = *srcPtr++; + dest = *destPtr; + dest = (dest & (0xff << s2)) | (src1 >> s1); + *destPtr++ = (FX_BYTE)dest; + xx = x0 + 8; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest = src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest = (src & m2) | (dest & m1); + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + } + } else { + switch(op) { + case JBIG2_COMPOSE_OR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest |= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest |= src & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_AND: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest &= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest &= src | m1; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_XNOR: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= src ^ 0xff; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest ^= (src ^ 0xff) & m2; + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + case JBIG2_COMPOSE_REPLACE: { + for(yy = y0; yy < y1; ++yy) { + destPtr = pLineDst; + srcPtr = pLineSrc + (-x >> 3); + src1 = *srcPtr++; + xx = x0; + for (; xx < x1 - 8; xx += 8) { + dest = *destPtr; + src0 = src1; + src1 = *srcPtr++; + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest = src; + *destPtr++ = (FX_BYTE)dest; + } + dest = *destPtr; + src0 = src1; + if(srcPtr - pLineSrc < m_nStride) { + src1 = *srcPtr++; + } else { + src1 = 0; + } + src = (((src0 << 8) | src1) >> s1) & 0xff; + dest = (src & m2) | (dest & m1); + *destPtr = (FX_BYTE)dest; + pLineDst += pDst->m_nStride; + pLineSrc += m_nStride; + } + } + break; + } + } + } + return TRUE; +} +FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op) +{ + if (!m_pData) { + return FALSE; + } + return pSrc->composeTo(this, x, y, op); +} +FX_BOOL CJBig2_Image::composeFrom(FX_INT32 x, FX_INT32 y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect) +{ + if (!m_pData) { + return FALSE; + } + return pSrc->composeTo(this, x, y, op, pSrcRect); +} +CJBig2_Image *CJBig2_Image::subImage_unopt(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h) +{ + CJBig2_Image *pImage; + FX_INT32 i, j; + JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); + for(j = 0; j < h; j++) { + for(i = 0; i < w; i++) { + pImage->setPixel(i, j, getPixel(x + i, y + j)); + } + } + return pImage; +} +#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) +CJBig2_Image *CJBig2_Image::subImage(FX_INT32 x, FX_INT32 y, FX_INT32 w, FX_INT32 h) +{ + CJBig2_Image *pImage; + FX_INT32 m, n, j; + FX_BYTE *pLineSrc, *pLineDst; + FX_DWORD wTmp; + FX_BYTE *pSrc, *pSrcEnd, *pDst, *pDstEnd; + if (w == 0 || h == 0) { + return NULL; + } + JBIG2_ALLOC(pImage, CJBig2_Image(w, h)); + if (!m_pData) { + pImage->fill(0); + return pImage; + } + if (!pImage->m_pData) { + return pImage; + } + pLineSrc = m_pData + m_nStride * y; + pLineDst = pImage->m_pData; + m = (x >> 5) << 2; + n = x & 31; + if(n == 0) { + for(j = 0; j < h; j++) { + pSrc = pLineSrc + m; + pSrcEnd = pLineSrc + m_nStride; + pDst = pLineDst; + pDstEnd = pLineDst + pImage->m_nStride; + for(; pDst < pDstEnd; pSrc += 4, pDst += 4) { + *((FX_DWORD *)pDst) = *((FX_DWORD *)pSrc); + } + pLineSrc += m_nStride; + pLineDst += pImage->m_nStride; + } + } else { + for(j = 0; j < h; j++) { + pSrc = pLineSrc + m; + pSrcEnd = pLineSrc + m_nStride; + pDst = pLineDst; + pDstEnd = pLineDst + pImage->m_nStride; + for(; pDst < pDstEnd; pSrc += 4, pDst += 4) { + if(pSrc + 4 < pSrcEnd) { + wTmp = (JBIG2_GETDWORD(pSrc) << n) | (JBIG2_GETDWORD(pSrc + 4) >> (32 - n)); + } else { + wTmp = JBIG2_GETDWORD(pSrc) << n; + } + pDst[0] = (FX_BYTE)(wTmp >> 24); + pDst[1] = (FX_BYTE)(wTmp >> 16); + pDst[2] = (FX_BYTE)(wTmp >> 8); + pDst[3] = (FX_BYTE)wTmp; + } + pLineSrc += m_nStride; + pLineDst += pImage->m_nStride; + } + } + return pImage; +} +void CJBig2_Image::expand(FX_INT32 h, FX_BOOL v) +{ + if (!m_pData) { + return; + } + m_pData = (FX_BYTE*)m_pModule->JBig2_Realloc(m_pData, h * m_nStride); + if(h > m_nHeight) { + JBIG2_memset(m_pData + m_nHeight * m_nStride, v ? 0xff : 0, (h - m_nHeight)*m_nStride); + } + m_nHeight = h; +} +FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op) +{ + FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft; + FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM; + FX_BYTE *lineSrc, *lineDst, *sp, *dp; + if (!m_pData) { + return FALSE; + } + if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { + return FALSE; + } + if(y < 0) { + ys0 = -y; + } else { + ys0 = 0; + } + if(y + m_nHeight > pDst->m_nHeight) { + ys1 = pDst->m_nHeight - y; + } else { + ys1 = m_nHeight; + } + if(x < 0) { + xs0 = -x; + } else { + xs0 = 0; + } + if(x + m_nWidth > pDst->m_nWidth) { + xs1 = pDst->m_nWidth - x; + } else { + xs1 = m_nWidth; + } + if((ys0 >= ys1) || (xs0 >= xs1)) { + return 0; + } + w = xs1 - xs0; + h = ys1 - ys0; + if(y < 0) { + yd0 = 0; + } else { + yd0 = y; + } + if(x < 0) { + xd0 = 0; + } else { + xd0 = x; + } + xd1 = xd0 + w; + yd1 = yd0 + h; + d1 = xd0 & 31; + d2 = xd1 & 31; + s1 = xs0 & 31; + maskL = 0xffffffff >> d1; + maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); + maskM = maskL & maskR; + lineSrc = m_pData + ys0 * m_nStride + ((xs0 >> 5) << 2); + lineLeft = m_nStride - ((xs0 >> 5) << 2); + lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); + if((xd0 & ~31) == ((xd1 - 1) & ~31)) { + if((xs0 & ~31) == ((xs1 - 1) & ~31)) { + if(s1 > d1) { + shift = s1 - d1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) << shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift = d1 - s1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + shift1 = s1 - d1; + shift2 = 32 - shift1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + if(s1 > d1) { + shift1 = s1 - d1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | ( + ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else if(s1 == d1) { + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift1 = d1 - s1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp) >> shift1; + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ( + ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } + return 1; +} +FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, FX_INT32 x, FX_INT32 y, JBig2ComposeOp op, const FX_RECT* pSrcRect) +{ + FX_INT32 xs0, ys0, xs1, ys1, xd0, yd0, xd1, yd1, xx, yy, w, h, middleDwords, lineLeft; + FX_DWORD s1, d1, d2, shift, shift1, shift2, tmp, tmp1, tmp2, maskL, maskR, maskM; + FX_BYTE *lineSrc, *lineDst, *sp, *dp; + FX_INT32 sw, sh; + if (!m_pData) { + return FALSE; + } + if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { + return FALSE; + } + sw = pSrcRect->Width(); + sh = pSrcRect->Height(); + if(y < 0) { + ys0 = -y; + } else { + ys0 = 0; + } + if(y + sh > pDst->m_nHeight) { + ys1 = pDst->m_nHeight - y; + } else { + ys1 = sh; + } + if(x < 0) { + xs0 = -x; + } else { + xs0 = 0; + } + if(x + sw > pDst->m_nWidth) { + xs1 = pDst->m_nWidth - x; + } else { + xs1 = sw; + } + if((ys0 >= ys1) || (xs0 >= xs1)) { + return 0; + } + w = xs1 - xs0; + h = ys1 - ys0; + if(y < 0) { + yd0 = 0; + } else { + yd0 = y; + } + if(x < 0) { + xd0 = 0; + } else { + xd0 = x; + } + xd1 = xd0 + w; + yd1 = yd0 + h; + d1 = xd0 & 31; + d2 = xd1 & 31; + s1 = xs0 & 31; + maskL = 0xffffffff >> d1; + maskR = 0xffffffff << ((32 - (xd1 & 31)) % 32); + maskM = maskL & maskR; + lineSrc = m_pData + (pSrcRect->top + ys0) * m_nStride + (((xs0 + pSrcRect->left) >> 5) << 2); + lineLeft = m_nStride - ((xs0 >> 5) << 2); + lineDst = pDst->m_pData + yd0 * pDst->m_nStride + ((xd0 >> 5) << 2); + if((xd0 & ~31) == ((xd1 - 1) & ~31)) { + if((xs0 & ~31) == ((xs1 - 1) & ~31)) { + if(s1 > d1) { + shift = s1 - d1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) << shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift = d1 - s1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = JBIG2_GETDWORD(lineSrc) >> shift; + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + shift1 = s1 - d1; + shift2 = 32 - shift1; + for(yy = yd0; yy < yd1; yy++) { + tmp1 = (JBIG2_GETDWORD(lineSrc) << shift1) | (JBIG2_GETDWORD(lineSrc + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(lineDst); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskM) | ((tmp1 | tmp2) & maskM); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskM) | ((tmp1 & tmp2) & maskM); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskM) | ((tmp1 ^ tmp2) & maskM); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskM) | ((~(tmp1 ^ tmp2)) & maskM); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskM) | (tmp1 & maskM); + break; + } + lineDst[0] = (FX_BYTE)(tmp >> 24); + lineDst[1] = (FX_BYTE)(tmp >> 16); + lineDst[2] = (FX_BYTE)(tmp >> 8); + lineDst[3] = (FX_BYTE)tmp; + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } else { + if(s1 > d1) { + shift1 = s1 - d1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | (JBIG2_GETDWORD(sp + 4) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift1) | ( + ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift2); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else if(s1 == d1) { + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = JBIG2_GETDWORD(sp); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } else { + shift1 = d1 - s1; + shift2 = 32 - shift1; + middleDwords = (xd1 >> 5) - ((xd0 + 31) >> 5); + for(yy = yd0; yy < yd1; yy++) { + sp = lineSrc; + dp = lineDst; + if(d1 != 0) { + tmp1 = JBIG2_GETDWORD(sp) >> shift1; + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskL) | ((tmp1 | tmp2) & maskL); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskL) | ((tmp1 & tmp2) & maskL); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskL) | ((tmp1 ^ tmp2) & maskL); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskL) | ((~(tmp1 ^ tmp2)) & maskL); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskL) | (tmp1 & maskL); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + dp += 4; + } + for(xx = 0; xx < middleDwords; xx++) { + tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ((JBIG2_GETDWORD(sp + 4)) >> shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = tmp1 | tmp2; + break; + case JBIG2_COMPOSE_AND: + tmp = tmp1 & tmp2; + break; + case JBIG2_COMPOSE_XOR: + tmp = tmp1 ^ tmp2; + break; + case JBIG2_COMPOSE_XNOR: + tmp = ~(tmp1 ^ tmp2); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = tmp1; + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + sp += 4; + dp += 4; + } + if(d2 != 0) { + tmp1 = (JBIG2_GETDWORD(sp) << shift2) | ( + ((sp + 4) < lineSrc + lineLeft ? JBIG2_GETDWORD(sp + 4) : 0) >> shift1); + tmp2 = JBIG2_GETDWORD(dp); + switch(op) { + case JBIG2_COMPOSE_OR: + tmp = (tmp2 & ~maskR) | ((tmp1 | tmp2) & maskR); + break; + case JBIG2_COMPOSE_AND: + tmp = (tmp2 & ~maskR) | ((tmp1 & tmp2) & maskR); + break; + case JBIG2_COMPOSE_XOR: + tmp = (tmp2 & ~maskR) | ((tmp1 ^ tmp2) & maskR); + break; + case JBIG2_COMPOSE_XNOR: + tmp = (tmp2 & ~maskR) | ((~(tmp1 ^ tmp2)) & maskR); + break; + case JBIG2_COMPOSE_REPLACE: + tmp = (tmp2 & ~maskR) | (tmp1 & maskR); + break; + } + dp[0] = (FX_BYTE)(tmp >> 24); + dp[1] = (FX_BYTE)(tmp >> 16); + dp[2] = (FX_BYTE)(tmp >> 8); + dp[3] = (FX_BYTE)tmp; + } + lineSrc += m_nStride; + lineDst += pDst->m_nStride; + } + } + } + return 1; +} |