Index: core/src/fxcodec/jbig2/JBig2_Image.cpp |
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp |
index 9ef4464ef08a0486a6c7b83e9dd6d53e4814b3e6..772e4e5f62084b0f7dd11961d23c227cc7baf2f5 100644 |
--- a/core/src/fxcodec/jbig2/JBig2_Image.cpp |
+++ b/core/src/fxcodec/jbig2/JBig2_Image.cpp |
@@ -1,7 +1,7 @@ |
// 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 <limits.h> |
@@ -10,1621 +10,1646 @@ |
#include "../../../include/fxcrt/fx_safe_types.h" |
#include "JBig2_Image.h" |
-CJBig2_Image::CJBig2_Image(int32_t w, int32_t 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 = (uint8_t *)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); |
- } else { |
- m_pData = NULL; |
- } |
- m_bNeedFree = TRUE; |
-} |
-CJBig2_Image::CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t*pBuf) |
-{ |
- m_nWidth = w; |
- m_nHeight = h; |
- m_nStride = stride; |
- m_pData = pBuf; |
+CJBig2_Image::CJBig2_Image(int32_t w, int32_t 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 = (uint8_t*)m_pModule->JBig2_Malloc2(m_nStride, m_nHeight); |
+ } else { |
+ m_pData = NULL; |
+ } |
+ m_bNeedFree = TRUE; |
} |
-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 = (uint8_t*)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(int32_t w, |
+ int32_t h, |
+ int32_t stride, |
+ uint8_t* pBuf) { |
+ m_nWidth = w; |
+ m_nHeight = h; |
+ m_nStride = stride; |
+ m_pData = pBuf; |
+ m_bNeedFree = FALSE; |
} |
-CJBig2_Image::~CJBig2_Image() |
-{ |
- if(m_bNeedFree && m_pData) { |
- m_pModule->JBig2_Free(m_pData); |
- } |
+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 = (uint8_t*)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; |
} |
-FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) |
-{ |
- if (!m_pData) { |
- return 0; |
- } |
- int32_t 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); |
+CJBig2_Image::~CJBig2_Image() { |
+ if (m_bNeedFree && m_pData) { |
+ m_pModule->JBig2_Free(m_pData); |
+ } |
+} |
+FX_BOOL CJBig2_Image::getPixel(int32_t x, int32_t y) { |
+ if (!m_pData) { |
+ return 0; |
+ } |
+ int32_t 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); |
} |
-int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) |
-{ |
- if (!m_pData) { |
- return 0; |
- } |
- int32_t 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; |
+int32_t CJBig2_Image::setPixel(int32_t x, int32_t y, FX_BOOL v) { |
+ if (!m_pData) { |
+ return 0; |
+ } |
+ int32_t 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(int32_t hTo, int32_t 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::copyLine(int32_t hTo, int32_t 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); |
+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, int32_t x, int32_t y, JBig2ComposeOp op) |
-{ |
- if (!m_pData) { |
- return FALSE; |
- } |
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, |
+ int32_t x, |
+ int32_t y, |
+ JBig2ComposeOp op) { |
+ if (!m_pData) { |
+ return FALSE; |
+ } |
+ return composeTo_opt2(pDst, x, y, op); |
+} |
+FX_BOOL CJBig2_Image::composeTo(CJBig2_Image* pDst, |
+ int32_t x, |
+ int32_t 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(CJBig2_Image *pDst, int32_t x, int32_t 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, |
+ int32_t x, |
+ int32_t y, |
+ JBig2ComposeOp op) { |
+ int32_t w, h, dx, dy; |
+ int32_t 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_unopt(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op) |
-{ |
- int32_t w, h, dx, dy; |
- int32_t 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; |
+ |
+FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image* pDst, |
+ int32_t x, |
+ int32_t y, |
+ JBig2ComposeOp op) { |
+ int32_t x0, x1, y0, y1, xx, yy; |
+ uint8_t *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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)dest; |
+ pLineDst += pDst->m_nStride; |
+ pLineSrc += m_nStride; |
+ } |
+ } break; |
+ } |
} |
- 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); |
- } |
+ } 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++ = (uint8_t)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++ = (uint8_t)dest; |
} |
- 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); |
- } |
+ dest = *destPtr; |
+ src0 = src1; |
+ if (srcPtr - pLineSrc < m_nStride) { |
+ src1 = *srcPtr++; |
+ } else { |
+ src1 = 0; |
} |
- 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); |
- } |
+ src = (((src0 << 8) | src1) >> s1) & 0xff; |
+ dest |= src & m2; |
+ *destPtr = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)dest; |
} |
- 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); |
- } |
+ dest = *destPtr; |
+ src0 = src1; |
+ if (srcPtr - pLineSrc < m_nStride) { |
+ src1 = *srcPtr++; |
+ } else { |
+ src1 = 0; |
} |
- 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)); |
- } |
+ src = (((src0 << 8) | src1) >> s1) & 0xff; |
+ dest &= src | m1; |
+ *destPtr = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)dest; |
} |
- break; |
- } |
- return TRUE; |
-} |
- |
-FX_BOOL CJBig2_Image::composeTo_opt(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op) |
-{ |
- int32_t x0, x1, y0, y1, xx, yy; |
- uint8_t *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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)dest; |
- pLineDst += pDst->m_nStride; |
- pLineSrc += m_nStride; |
- } |
- } |
- break; |
+ dest = *destPtr; |
+ src0 = src1; |
+ if (srcPtr - pLineSrc < m_nStride) { |
+ src1 = *srcPtr++; |
+ } else { |
+ src1 = 0; |
} |
- } 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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)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 = (uint8_t)dest; |
- pLineDst += pDst->m_nStride; |
- pLineSrc += m_nStride; |
- } |
- } |
- break; |
+ src = (((src0 << 8) | src1) >> s1) & 0xff; |
+ dest ^= src & m2; |
+ *destPtr = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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++ = (uint8_t)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 = (uint8_t)dest; |
- pLineDst += pDst->m_nStride; |
- pLineSrc += m_nStride; |
- } |
- } |
- break; |
+ 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++ = (uint8_t)dest; |
} |
- } 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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)dest; |
- pLineDst += pDst->m_nStride; |
- pLineSrc += m_nStride; |
- } |
- } |
- break; |
+ dest = *destPtr; |
+ src0 = src1; |
+ if (srcPtr - pLineSrc < m_nStride) { |
+ src1 = *srcPtr++; |
+ } else { |
+ src1 = 0; |
} |
- } |
+ src = (((src0 << 8) | src1) >> s1) & 0xff; |
+ dest |= src & m2; |
+ *destPtr = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)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++ = (uint8_t)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 = (uint8_t)dest; |
+ pLineDst += pDst->m_nStride; |
+ pLineSrc += m_nStride; |
+ } |
+ } break; |
+ } |
} |
- return TRUE; |
+ } |
+ return TRUE; |
} |
-FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig2ComposeOp op) |
-{ |
- if (!m_pData) { |
- return FALSE; |
- } |
- return pSrc->composeTo(this, x, y, op); |
+FX_BOOL CJBig2_Image::composeFrom(int32_t x, |
+ int32_t y, |
+ CJBig2_Image* pSrc, |
+ JBig2ComposeOp op) { |
+ if (!m_pData) { |
+ return FALSE; |
+ } |
+ return pSrc->composeTo(this, x, y, op); |
} |
-FX_BOOL CJBig2_Image::composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect) |
-{ |
- if (!m_pData) { |
- return FALSE; |
- } |
- return pSrc->composeTo(this, x, y, op, pSrcRect); |
+FX_BOOL CJBig2_Image::composeFrom(int32_t x, |
+ int32_t 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(int32_t x, int32_t y, int32_t w, int32_t h) |
-{ |
- CJBig2_Image *pImage; |
- int32_t 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)); |
- } |
+CJBig2_Image* CJBig2_Image::subImage_unopt(int32_t x, |
+ int32_t y, |
+ int32_t w, |
+ int32_t h) { |
+ CJBig2_Image* pImage; |
+ int32_t 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; |
+ } |
+ return pImage; |
} |
-#define JBIG2_GETDWORD(buf) ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) |
-CJBig2_Image *CJBig2_Image::subImage(int32_t x, int32_t y, int32_t w, int32_t h) |
-{ |
- CJBig2_Image *pImage; |
- int32_t m, n, j; |
- uint8_t *pLineSrc, *pLineDst; |
- FX_DWORD wTmp; |
- uint8_t *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; |
+#define JBIG2_GETDWORD(buf) \ |
+ ((FX_DWORD)(((buf)[0] << 24) | ((buf)[1] << 16) | ((buf)[2] << 8) | (buf)[3])) |
+CJBig2_Image* CJBig2_Image::subImage(int32_t x, |
+ int32_t y, |
+ int32_t w, |
+ int32_t h) { |
+ CJBig2_Image* pImage; |
+ int32_t m, n, j; |
+ uint8_t *pLineSrc, *pLineDst; |
+ FX_DWORD wTmp; |
+ uint8_t *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; |
} |
- 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] = (uint8_t)(wTmp >> 24); |
- pDst[1] = (uint8_t)(wTmp >> 16); |
- pDst[2] = (uint8_t)(wTmp >> 8); |
- pDst[3] = (uint8_t)wTmp; |
- } |
- 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] = (uint8_t)(wTmp >> 24); |
+ pDst[1] = (uint8_t)(wTmp >> 16); |
+ pDst[2] = (uint8_t)(wTmp >> 8); |
+ pDst[3] = (uint8_t)wTmp; |
+ } |
+ pLineSrc += m_nStride; |
+ pLineDst += pImage->m_nStride; |
} |
- return pImage; |
+ } |
+ return pImage; |
} |
-void CJBig2_Image::expand(int32_t h, FX_BOOL v) |
-{ |
- if (!m_pData || h <= m_nHeight) { |
- return; |
- } |
- FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h); |
- FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride); |
- FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight); |
- FX_SAFE_DWORD safeMemSize = dwH; |
- safeMemSize *= dwStride; |
- if (!safeMemSize.IsValid()) { |
- return; |
- } |
- //The guaranteed reallocated memory is to be < 4GB (unsigned int). |
- m_pData = (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie()); |
- //The result of dwHeight * dwStride doesn't overflow after the |
- //checking of safeMemSize. |
- //The same as the result of (dwH - dwHeight) * dwStride) because |
- //dwH - dwHeight is always less than dwH(h) which is checked in |
- //the calculation of dwH * dwStride. |
- JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, (dwH - dwHeight) * dwStride); |
- m_nHeight = h; |
+void CJBig2_Image::expand(int32_t h, FX_BOOL v) { |
+ if (!m_pData || h <= m_nHeight) { |
+ return; |
+ } |
+ FX_DWORD dwH = pdfium::base::checked_cast<FX_DWORD>(h); |
+ FX_DWORD dwStride = pdfium::base::checked_cast<FX_DWORD>(m_nStride); |
+ FX_DWORD dwHeight = pdfium::base::checked_cast<FX_DWORD>(m_nHeight); |
+ FX_SAFE_DWORD safeMemSize = dwH; |
+ safeMemSize *= dwStride; |
+ if (!safeMemSize.IsValid()) { |
+ return; |
+ } |
+ // The guaranteed reallocated memory is to be < 4GB (unsigned int). |
+ m_pData = |
+ (uint8_t*)m_pModule->JBig2_Realloc(m_pData, safeMemSize.ValueOrDie()); |
+ // The result of dwHeight * dwStride doesn't overflow after the |
+ // checking of safeMemSize. |
+ // The same as the result of (dwH - dwHeight) * dwStride) because |
+ // dwH - dwHeight is always less than dwH(h) which is checked in |
+ // the calculation of dwH * dwStride. |
+ JBIG2_memset(m_pData + dwHeight * dwStride, v ? 0xff : 0, |
+ (dwH - dwHeight) * dwStride); |
+ m_nHeight = h; |
} |
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op) |
-{ |
- int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0, |
- yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0; |
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, |
+ int32_t x, |
+ int32_t y, |
+ JBig2ComposeOp op) { |
+ int32_t xs0 = 0, ys0 = 0, xs1 = 0, ys1 = 0, xd0 = 0, yd0 = 0, xd1 = 0, |
+ yd1 = 0, xx = 0, yy = 0, w = 0, h = 0, middleDwords = 0, lineLeft = 0; |
- FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, |
- tmp = 0, tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0; |
+ FX_DWORD s1 = 0, d1 = 0, d2 = 0, shift = 0, shift1 = 0, shift2 = 0, tmp = 0, |
+ tmp1 = 0, tmp2 = 0, maskL = 0, maskR = 0, maskM = 0; |
- uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL; |
+ uint8_t *lineSrc = NULL, *lineDst = NULL, *sp = NULL, *dp = NULL; |
- if (!m_pData) { |
- return FALSE; |
- } |
- if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { |
- return FALSE; |
- } |
- if(y < 0) { |
- ys0 = -y; |
- } |
- if(y + m_nHeight > pDst->m_nHeight) { |
- ys1 = pDst->m_nHeight - y; |
- } else { |
- ys1 = m_nHeight; |
- } |
- if(x < 0) { |
- xs0 = -x; |
- } |
- if(x + m_nWidth > pDst->m_nWidth) { |
- xs1 = pDst->m_nWidth - x; |
+ if (!m_pData) { |
+ return FALSE; |
+ } |
+ if (x < -1048576 || x > 1048576 || y < -1048576 || y > 1048576) { |
+ return FALSE; |
+ } |
+ if (y < 0) { |
+ ys0 = -y; |
+ } |
+ if (y + m_nHeight > pDst->m_nHeight) { |
+ ys1 = pDst->m_nHeight - y; |
+ } else { |
+ ys1 = m_nHeight; |
+ } |
+ if (x < 0) { |
+ xs0 = -x; |
+ } |
+ 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 = y; |
+ } |
+ if (x >= 0) { |
+ 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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)tmp; |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
+ } |
} else { |
- xs1 = m_nWidth; |
- } |
- if((ys0 >= ys1) || (xs0 >= xs1)) { |
- return 0; |
- } |
- w = xs1 - xs0; |
- h = ys1 - ys0; |
- if(y >= 0) { |
- yd0 = y; |
- } |
- if(x >= 0) { |
- xd0 = x; |
+ 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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)tmp; |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
} |
- 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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)tmp; |
- } |
- lineSrc += m_nStride; |
- lineDst += pDst->m_nStride; |
- } |
+ 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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)tmp; |
+ } |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
} |
- return 1; |
+ } |
+ return 1; |
} |
-FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op, const FX_RECT* pSrcRect) |
-{ |
- int32_t 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; |
- uint8_t *lineSrc, *lineDst, *sp, *dp; |
- int32_t 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; |
+FX_BOOL CJBig2_Image::composeTo_opt2(CJBig2_Image* pDst, |
+ int32_t x, |
+ int32_t y, |
+ JBig2ComposeOp op, |
+ const FX_RECT* pSrcRect) { |
+ int32_t 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; |
+ uint8_t *lineSrc, *lineDst, *sp, *dp; |
+ int32_t 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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)tmp; |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
+ } |
} else { |
- xd0 = x; |
+ 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] = (uint8_t)(tmp >> 24); |
+ lineDst[1] = (uint8_t)(tmp >> 16); |
+ lineDst[2] = (uint8_t)(tmp >> 8); |
+ lineDst[3] = (uint8_t)tmp; |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
} |
- 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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- lineDst[1] = (uint8_t)(tmp >> 16); |
- lineDst[2] = (uint8_t)(tmp >> 8); |
- lineDst[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
- dp[1] = (uint8_t)(tmp >> 16); |
- dp[2] = (uint8_t)(tmp >> 8); |
- dp[3] = (uint8_t)tmp; |
- } |
- lineSrc += m_nStride; |
- lineDst += pDst->m_nStride; |
- } |
+ 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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)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] = (uint8_t)(tmp >> 24); |
+ dp[1] = (uint8_t)(tmp >> 16); |
+ dp[2] = (uint8_t)(tmp >> 8); |
+ dp[3] = (uint8_t)tmp; |
} |
+ lineSrc += m_nStride; |
+ lineDst += pDst->m_nStride; |
+ } |
} |
- return 1; |
+ } |
+ return 1; |
} |