diff options
Diffstat (limited to 'core/src/fxcodec/jbig2/JBig2_Image.cpp')
-rw-r--r-- | core/src/fxcodec/jbig2/JBig2_Image.cpp | 3161 |
1 files changed, 1593 insertions, 1568 deletions
diff --git a/core/src/fxcodec/jbig2/JBig2_Image.cpp b/core/src/fxcodec/jbig2/JBig2_Image.cpp index 9ef4464ef0..772e4e5f62 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; } |