Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/encode/strenc.c view on Meta::CPAN
//================================================================
// Color Conversion
// functions to get image data from input buffer
// this inlcudes necessary color conversion and boundary padding
//================================================================
#define _CC(r, g, b) (b -= r, r += ((b + 1) >> 1) - g, g += ((r + 0) >> 1))
#define _CC_CMYK(c, m, y, k) (y -= c, c += ((y + 1) >> 1) - m, m += (c >> 1) - k, k += ((m + 1) >> 1))
//================================================================
// BitIOInfo init/term for encoding
const size_t MAX_MEMORY_SIZE_IN_WORDS = 64 << 20; // 1 << 20 \approx 1 million
Int StrIOEncInit(CWMImageStrCodec* pSC)
{
pSC->m_param.bIndexTable = !(pSC->WMISCP.bfBitstreamFormat == SPATIAL && pSC->WMISCP.cNumOfSliceMinus1H + pSC->WMISCP.cNumOfSliceMinus1V == 0);
if(allocateBitIOInfo(pSC) != ICERR_OK){
return ICERR_ERROR;
}
attachISWrite(pSC->pIOHeader, pSC->WMISCP.pWStream);
if(pSC->cNumBitIO > 0){
size_t i;
#if defined(_WINDOWS_) || defined(UNDER_CE) // tmpnam does not exist in VS2005 WinCE CRT
TCHAR szPath[MAX_PATH];
DWORD cSize, j, k;
#endif
char * pFilename;
pSC->ppWStream = (struct WMPStream **)malloc(pSC->cNumBitIO * sizeof(struct WMPStream *));
if(pSC->ppWStream == NULL) return ICERR_ERROR;
memset(pSC->ppWStream, 0, pSC->cNumBitIO * sizeof(struct WMPStream *));
if (pSC->cmbHeight * pSC->cmbWidth * pSC->WMISCP.cChannel >= MAX_MEMORY_SIZE_IN_WORDS) {
#ifdef _WINDOWS_
pSC->ppTempFile = (TCHAR **)malloc(pSC->cNumBitIO * sizeof(TCHAR *));
if(pSC->ppTempFile == NULL) return ICERR_ERROR;
memset(pSC->ppTempFile, 0, pSC->cNumBitIO * sizeof(TCHAR *));
#else
pSC->ppTempFile = (char **)malloc(pSC->cNumBitIO * sizeof(char *));
if(pSC->ppTempFile == NULL) return ICERR_ERROR;
memset(pSC->ppTempFile, 0, pSC->cNumBitIO * sizeof(char *));
#endif
}
for(i = 0; i < pSC->cNumBitIO; i ++){
if (pSC->cmbHeight * pSC->cmbWidth * pSC->WMISCP.cChannel >= MAX_MEMORY_SIZE_IN_WORDS) {
#if defined(_WINDOWS_) || defined(UNDER_CE) // tmpnam does not exist in VS2005 WinCE CRT
Bool bUnicode = sizeof(TCHAR) == 2;
pSC->ppTempFile[i] = (TCHAR *)malloc(MAX_PATH * sizeof(TCHAR));
if(pSC->ppTempFile[i] == NULL) return ICERR_ERROR;
pFilename = (char *)pSC->ppTempFile[i];
cSize = GetTempPath(MAX_PATH, szPath);
if(cSize == 0 || cSize >= MAX_PATH)
return ICERR_ERROR;
if(!GetTempFileName(szPath, TEXT("wdp"), 0, pSC->ppTempFile[i]))
return ICERR_ERROR;
if(bUnicode){ // unicode file name
for(k = j = cSize = 0; cSize < MAX_PATH; cSize ++, j += 2){
if(pSC->ppTempFile[i][cSize] == '\0')
break;
if(pFilename[j] != '\0')
pFilename[k ++] = pFilename[j];
if(pFilename[j + 1] != '\0')
pFilename[k ++] = pFilename[j + 1];
}
pFilename[cSize] = '\0';
}
#else //DPK needs to support ANSI
pSC->ppTempFile[i] = (char *)malloc(FILENAME_MAX * sizeof(char));
if(pSC->ppTempFile[i] == NULL) return ICERR_ERROR;
if ((pFilename = tmpnam(NULL)) == NULL)
return ICERR_ERROR;
strcpy(pSC->ppTempFile[i], pFilename);
#endif
if(CreateWS_File(pSC->ppWStream + i, pFilename, "w+b") != ICERR_OK) return ICERR_ERROR;
}
else {
if(CreateWS_List(pSC->ppWStream + i) != ICERR_OK) return ICERR_ERROR;
}
attachISWrite(pSC->m_ppBitIO[i], pSC->ppWStream[i]);
}
}
return ICERR_OK;
}
#define PUTBITS putBit16
/*************************************************************************
Write variable length byte aligned integer
*************************************************************************/
static Void PutVLWordEsc(BitIOInfo* pIO, Int iEscape, size_t s)
{
if (iEscape) {
assert(iEscape <= 0xff && iEscape > 0xfc); // fd,fe,ff are the only valid escapes
PUTBITS(pIO, iEscape, 8);
}
else if (s < 0xfb00) {
PUTBITS(pIO, (U32) s, 16);
}
else {
size_t t = s >> 16;
if ((t >> 16) == 0) {
PUTBITS(pIO, 0xfb, 8);
}
else {
t >>= 16;
PUTBITS(pIO, 0xfc, 8);
PUTBITS(pIO, (U32)(t >> 16) & 0xffff, 16);
PUTBITS(pIO, (U32) t & 0xffff, 16);
}
PUTBITS(pIO, (U32) t & 0xffff, 16);
PUTBITS(pIO, (U32) s & 0xffff, 16);
}
}
( run in 3.150 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )