#pragma once #include "cellPng.h" enum : u32 { PNGDEC_CODEC_VERSION = 0x00420000, }; struct PngDecoder; struct PngStream; typedef vm::ptr CellPngDecMainHandle; typedef vm::ptr CellPngDecSubHandle; // Return Codes enum { CELL_PNGDEC_ERROR_HEADER = 0x80611201, CELL_PNGDEC_ERROR_STREAM_FORMAT = 0x80611202, CELL_PNGDEC_ERROR_ARG = 0x80611203, CELL_PNGDEC_ERROR_SEQ = 0x80611204, CELL_PNGDEC_ERROR_BUSY = 0x80611205, CELL_PNGDEC_ERROR_FATAL = 0x80611206, CELL_PNGDEC_ERROR_OPEN_FILE = 0x80611207, CELL_PNGDEC_ERROR_SPU_UNSUPPORT = 0x80611208, CELL_PNGDEC_ERROR_SPU_ERROR = 0x80611209, CELL_PNGDEC_ERROR_CB_PARAM = 0x8061120a, }; // Consts enum CellPngDecColorSpace : u32 { CELL_PNGDEC_GRAYSCALE = 1, CELL_PNGDEC_RGB = 2, CELL_PNGDEC_PALETTE = 4, CELL_PNGDEC_GRAYSCALE_ALPHA = 9, CELL_PNGDEC_RGBA = 10, CELL_PNGDEC_ARGB = 20, }; enum CellPngDecSpuThreadEna : u32 { CELL_PNGDEC_SPU_THREAD_DISABLE = 0, CELL_PNGDEC_SPU_THREAD_ENABLE = 1, }; enum CellPngDecStreamSrcSel : u32 { CELL_PNGDEC_FILE = 0, CELL_PNGDEC_BUFFER = 1, }; enum CellPngDecInterlaceMode : u32 { CELL_PNGDEC_NO_INTERLACE = 0, CELL_PNGDEC_ADAM7_INTERLACE = 1, }; enum CellPngDecOutputMode : u32 { CELL_PNGDEC_TOP_TO_BOTTOM = 0, CELL_PNGDEC_BOTTOM_TO_TOP = 1, }; enum CellPngDecPackFlag : u32 { CELL_PNGDEC_1BYTE_PER_NPIXEL = 0, CELL_PNGDEC_1BYTE_PER_1PIXEL = 1, }; enum CellPngDecAlphaSelect : u32 { CELL_PNGDEC_STREAM_ALPHA = 0, CELL_PNGDEC_FIX_ALPHA = 1, }; enum CellPngDecCommand : u32 { CELL_PNGDEC_CONTINUE = 0, CELL_PNGDEC_STOP = 1, }; enum CellPngDecDecodeStatus : u32 { CELL_PNGDEC_DEC_STATUS_FINISH = 0, CELL_PNGDEC_DEC_STATUS_STOP = 1, }; // Callbacks typedef vm::ptr(*CellPngDecCbControlMalloc)(u32 size, vm::ptr cbCtrlMallocArg); typedef s32(*CellPngDecCbControlFree)(vm::ptr ptr, vm::ptr cbCtrlFreeArg); // Structs struct CellPngDecThreadInParam { be_t spuThreadEnable; be_t ppuThreadPriority; be_t spuThreadPriority; vm::bptr cbCtrlMallocFunc; vm::bptr cbCtrlMallocArg; vm::bptr cbCtrlFreeFunc; vm::bptr cbCtrlFreeArg; }; struct CellPngDecExtThreadInParam { be_t spurs_addr; // it could be vm::bptr, but nobody will use SPURS in HLE implementation u8 priority[8]; be_t maxContention; }; struct CellPngDecThreadOutParam { be_t pngCodecVersion; }; struct CellPngDecExtThreadOutParam { be_t reserved; }; struct CellPngDecSrc { be_t srcSelect; vm::bptr fileName; be_t fileOffset; be_t fileSize; vm::bptr streamPtr; be_t streamSize; be_t spuThreadEnable; }; struct CellPngDecOpnInfo { be_t initSpaceAllocated; }; struct CellPngDecInfo { be_t imageWidth; be_t imageHeight; be_t numComponents; be_t colorSpace; be_t bitDepth; be_t interlaceMethod; be_t chunkInformation; }; struct CellPngDecInParam { vm::bptr commandPtr; be_t outputMode; be_t outputColorSpace; be_t outputBitDepth; be_t outputPackFlag; be_t outputAlphaSelect; be_t outputColorAlpha; }; struct CellPngDecOutParam { be_t outputWidthByte; be_t outputWidth; be_t outputHeight; be_t outputComponents; be_t outputBitDepth; be_t outputMode; be_t outputColorSpace; be_t useMemorySpace; }; struct CellPngDecDataCtrlParam { be_t outputBytesPerLine; }; struct CellPngDecDataOutInfo { be_t chunkInformation; be_t numText; be_t numUnknownChunk; be_t status; }; // Functions s64 cellPngDecCreate(vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam); s64 cellPngDecExtCreate( vm::ptr mainHandle, vm::ptr threadInParam, vm::ptr threadOutParam, vm::ptr extThreadInParam, vm::ptr extThreadOutParam); s64 cellPngDecOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo); s64 cellPngDecReadHeader(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info); s64 cellPngDecSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, vm::ptr outParam); s64 cellPngDecDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, vm::ptr dataCtrlParam, vm::ptr dataOutInfo); s64 cellPngDecClose(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle); s64 cellPngDecDestroy(CellPngDecMainHandle mainHandle); s64 cellPngDecGetTextChunk( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr textInfoNum, vm::ptr> textInfo); s64 cellPngDecGetPLTE(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr plte); s64 cellPngDecGetgAMA(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr gama); s64 cellPngDecGetsRGB(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr srgb); s64 cellPngDecGetiCCP(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr iccp); s64 cellPngDecGetsBIT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr sbit); s64 cellPngDecGettRNS(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr trns); s64 cellPngDecGethIST(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr hist); s64 cellPngDecGettIME(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr time); s64 cellPngDecGetbKGD(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr bkgd); s64 cellPngDecGetsPLT(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr splt); s64 cellPngDecGetoFFs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr offs); s64 cellPngDecGetpHYs(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr phys); s64 cellPngDecGetsCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr scal); s64 cellPngDecGetcHRM(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr chrm); s64 cellPngDecGetpCAL(CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr pcal); s64 cellPngDecGetUnknownChunks( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr> unknownChunk, vm::ptr unknownChunkNumber); enum CellPngDecBufferMode { CELL_PNGDEC_LINE_MODE = 1, }; enum CellPngDecSpuMode { CELL_PNGDEC_RECEIVE_EVENT = 0, CELL_PNGDEC_TRYRECEIVE_EVENT = 1, }; // Structs struct CellPngDecStrmInfo { be_t decodedStrmSize; }; struct CellPngDecStrmParam { vm::bptr strmPtr; be_t strmSize; }; typedef s32(*CellPngDecCbControlStream)( vm::ptr strmInfo, vm::ptr strmParam, vm::ptr cbCtrlStrmArg ); struct CellPngDecDispInfo { be_t outputFrameWidthByte; be_t outputFrameHeight; be_t outputStartXByte; be_t outputStartY; be_t outputWidthByte; be_t outputHeight; be_t outputBitDepth; be_t outputComponents; be_t nextOutputStartY; be_t scanPassCount; vm::bptr outputImage; }; struct CellPngDecDispParam { vm::bptr nextOutputImage; }; // Callback typedef s32(*CellPngDecCbControlDisp)(vm::ptr dispInfo, vm::ptr dispParam, vm::ptr cbCtrlDispArg); // Structs struct CellPngDecOpnParam { be_t selectChunk; }; struct CellPngDecCbCtrlStrm { vm::bptr cbCtrlStrmFunc; be_t> cbCtrlStrmArg; }; struct CellPngDecExtInfo { be_t reserved; }; struct CellPngDecExtInParam { be_t bufferMode; be_t outputCounts; be_t spuMode; }; struct CellPngDecExtOutParam { be_t outputWidthByte; be_t outputHeight; }; struct CellPngDecCbCtrlDisp { vm::bptr cbCtrlDispFunc; be_t> cbCtrlDispArg; }; // Functions s64 cellPngDecExtOpen( CellPngDecMainHandle mainHandle, vm::ptr subHandle, vm::ptr src, vm::ptr openInfo, vm::ptr cbCtrlStrm, vm::ptr opnParam); s64 cellPngDecExtReadHeader( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr info, vm::ptr extInfo); s64 cellPngDecExtSetParameter( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr inParam, vm::ptr outParam, vm::ptr extInParam, vm::ptr extOutParam); s64 cellPngDecExtDecodeData( CellPngDecMainHandle mainHandle, CellPngDecSubHandle subHandle, vm::ptr data, vm::ptr dataCtrlParam, vm::ptr dataOutInfo, vm::ptr cbCtrlDisp, vm::ptr dispParam); // Custom structs struct PngDecoder { vm::ptr malloc; vm::ptr malloc_arg; vm::ptr free; vm::ptr free_arg; }; struct PngStream { CellPngDecMainHandle dec; // old data: u32 fd; u64 fileSize; CellPngDecInfo info; CellPngDecOutParam outParam; CellPngDecSrc src; CellPngDecStrmInfo streamInfo; CellPngDecStrmParam streamParam; };