/* top level function for decompression */ int Decompress1( Ipp8u **ppSrc, int SrcLen, Ipp8u **ppDst, int *pDstLen, bwtState *pState ) { int st; IppHuffState_8u * pHuffState = (IppHuffState_8u *)(pState->pHuffState); IppMTFState_8u * pMTFState = (IppMTFState_8u *)(pState->pMTFState); Ipp8u * pBwtAddBuffer = pState->pBwtAddBuffer; Ipp8u * pSrc = *ppSrc; Ipp8u * pDst = *ppDst; int rleLen = *pDstLen, rleLenZ = *pDstLen, mtfLen = *pDstLen, hufLen = *pDstLen; /* does the Huffman Decoding (see file huffman.c for implementation details) */ if( ippStsNoErr != ( st = DecodeHuffman( pSrc, SrcLen, pDst, &hufLen, pHuffState ) ) ) { fprintf(stderr, "Error <%d> while trying to decode Huffman. Exiting.\n", st ); return st; } /* swaps two pointers */ EXCHANGEBUFFERS( pSrc, pDst ); /* does the Run-Length Decoding (see file rle.c for implementation details) */ if( ippStsNoErr != ( st = DecodeRLE( pSrc, hufLen, pDst, &rleLen ) ) ) { fprintf(stderr, "Error <%d> while trying to decode RLE. Exiting.\n", st ); return st; } /* swaps two pointers */ EXCHANGEBUFFERS( pSrc, pDst ); /* does backward Move-To-Front transform (see file mtf.c for implementation details) */ if( ippStsNoErr != ( st = InverseMTF( pSrc, rleLen, pDst, &mtfLen, pMTFState ) ) ) { fprintf(stderr, "Error <%d> while trying backward MTF Transformation. Exiting.\n", st ); return st; } /* swaps two pointers */ EXCHANGEBUFFERS( pSrc, pDst ); /* does backward Burrows-Wheller transform (see file bwt.c for implementation details) */ if( ippStsNoErr != ( st = InverseBWT( pSrc, mtfLen, pDst, &rleLenZ, pBwtAddBuffer ) ) ) { fprintf(stderr, "Error <%d> while trying backward BWT Transformation. Exiting.\n", st ); return st; } /* swaps two pointers */ EXCHANGEBUFFERS( pSrc, pDst ); /* does the Run-Length Decoding (see file rle.c for implementation details) */ if( ippStsNoErr != ( st = DecodeRLE( pSrc, rleLenZ, pDst, pDstLen ) ) ) { fprintf(stderr, "Error <%d> while trying to decode RLE. Exiting.\n", st ); return st; } *ppSrc = pSrc; *ppDst = pDst; return st; } /* Decompress1() */
//************************************************************************ PDIB CDib::GetDib(BOOL fDecodeRLE) //************************************************************************ { if ((GetCompression() == BI_RLE8) && fDecodeRLE) { DWORD dwSize = (long)GetWidthBytes() * (long)abs(GetHeight()); LPTR lp = AllocX(dwSize, GMEM_ZEROINIT ); if (!lp) return(NULL); PDIB pDib = new CDib(this, lp, FALSE); if (!pDib) { FreeUp(lp); return(NULL); } DecodeRLE(lp); pDib->SetCompression(BI_RGB); pDib->SetSizeImage(dwSize); return(pDib); } else { AddRef(); return(this); } }
static int PostDecodeSubpicture(SPHandler *H, unsigned char *buf, int len) { // TODO: handle regions better to optimize... memset(H->subpicbuffer, 0, 720*576); if(H->subpicenabled) { if(H->offsetfield1!=-1) { DecodeRLE(H, H->subpicbuffer, H->rect[0], H->rect[2], H->rect[1], H->rect[3], buf, H->offsetfield1, len); } if(H->offsetfield2!=-1) { DecodeRLE(H, H->subpicbuffer, H->rect[0], H->rect[2]+1, H->rect[1], H->rect[3], buf, H->offsetfield2, len); } } GFX_flipBuffer(); }
void OnSector(const Formats::CHS& loc, const uint8_t* rawData, std::size_t rawSize, SectorDataType type, std::size_t targetSize) override { Dump result; switch (type) { case RAW_SECTOR: result.assign(rawData, rawData + rawSize); break; case R2P_SECTOR: DecodeR2P(rawData, rawSize, result); break; case RLE_SECTOR: DecodeRLE(rawData, rawSize, result); break; } Require(result.size() == targetSize); Builder->SetSector(loc, result); }