void rsxSetupContextData(gcmContextData *context,const u32 *addr,const u32 size,gcmContextCallback cb) { u32 alignedSize = size&~0x3; context->begin = __get_addr32(addr); context->current = __get_addr32(addr); context->end = __get_addr32(addr + alignedSize - 4); context->callback = __get_addr32(__get_opd32(cb)); }
s32 pngLoadFromFile(const char *filename,pngData *out) { pngDecSource source; memset(&source,0,sizeof(pngDecSource)); source.stream = PNGDEC_FILE; source.file_name = __get_addr32(filename); source.enable = PNGDEC_DISABLE; return decodePNG(&source,out); }
s32 pngLoadFromBuffer(const void *buffer,u32 size,pngData *out) { pngDecSource source; memset(&source,0,sizeof(pngDecSource)); source.stream = PNGDEC_BUFFER; source.stream_ptr = __get_addr32(buffer); source.stream_size = size; source.enable = PNGDEC_DISABLE; return decodePNG(&source,out); }
static bool ps3_load_jpeg(const char *path, struct texture_image *out_img) { size_t img_size; #ifndef __PSL1GHT__ CtrlMallocArg MallocArg; CtrlFreeArg FreeArg; CellJpgDecDataCtrlParam dCtrlParam; #endif CellJpgDecMainHandle mHandle = PTR_NULL; CellJpgDecSubHandle sHandle = PTR_NULL; CellJpgDecThreadInParam InParam; CellJpgDecThreadOutParam OutParam; CellJpgDecSrc src; CellJpgDecOpnInfo opnInfo; CellJpgDecInfo info; CellJpgDecInParam inParam; CellJpgDecOutParam outParam; CellJpgDecDataOutInfo dOutInfo; InParam.spu_enable = CELL_JPGDEC_SPU_THREAD_ENABLE; InParam.ppu_prio = 1001; InParam.spu_prio = 250; #ifdef __PSL1GHT__ InParam.malloc_func = __get_addr32(__get_opd32(img_malloc)); InParam.free_func = __get_addr32(__get_opd32(img_free)); InParam.malloc_arg = 0; InParam.free_arg = 0; #else MallocArg.mallocCallCounts = 0; FreeArg.freeCallCounts = 0; InParam.malloc_func = img_malloc; InParam.free_func = img_free; InParam.malloc_arg = &MallocArg; InParam.free_arg = &FreeArg; #endif int ret_jpeg, ret = -1; ret_jpeg = cellJpgDecCreate(&mHandle, &InParam, &OutParam); if (ret_jpeg != CELL_OK) goto error; memset(&src, 0, sizeof(CellJpgDecSrc)); src.stream_select = CELL_JPGDEC_FILE; #ifdef __PSL1GHT__ src.file_name = __get_addr32(path); #else src.file_name = path; #endif src.file_offset = 0; src.file_size = 0; src.stream_ptr = PTR_NULL; src.stream_size = 0; src.spu_enable = CELL_JPGDEC_SPU_THREAD_ENABLE; ret = cellJpgDecOpen(mHandle, &sHandle, &src, &opnInfo); if (ret != CELL_OK) goto error; ret = cellJpgDecReadHeader(mHandle, sHandle, &info); if (ret != CELL_OK) goto error; inParam.cmd_ptr = PTR_NULL; inParam.quality = CELL_JPGDEC_FAST; inParam.output_mode = CELL_JPGDEC_TOP_TO_BOTTOM; inParam.color_space = CELL_JPG_ARGB; inParam.down_scale = 1; inParam.color_alpha = 0xfe; ret = cellJpgDecSetParameter(mHandle, sHandle, &inParam, &outParam); if (ret != CELL_OK) goto error; img_size = outParam.output_width * outParam.output_height * sizeof(uint32_t); out_img->pixels = (uint32_t*)malloc(img_size); memset(out_img->pixels, 0, img_size); #ifdef __PSL1GHT__ uint64_t output_bytes_per_line = outParam.output_width * 4; ret = cellJpgDecDecodeData(mHandle, sHandle, (uint8_t*)out_img->pixels, &output_bytes_per_line, &dOutInfo); #else dCtrlParam.output_bytes_per_line = outParam.output_width * 4; ret = cellJpgDecDecodeData(mHandle, sHandle, (uint8_t*)out_img->pixels, &dCtrlParam, &dOutInfo); #endif if (ret != CELL_OK || dOutInfo.status != CELL_JPGDEC_DEC_STATUS_FINISH) goto error; out_img->width = outParam.output_width; out_img->height = outParam.output_height; cellJpgDecClose(mHandle, sHandle); cellJpgDecDestroy(mHandle); return true; error: if (out_img->pixels) free(out_img->pixels); out_img->pixels = 0; if (mHandle && sHandle) cellJpgDecClose(mHandle, sHandle); if (mHandle) cellJpgDecDestroy(mHandle); return false; }
static s32 decodePNG(pngDecSource *src,pngData *out) { s32 mHandle,sHandle,ret; u32 space_allocated; u64 bytes_per_line; pngDecInfo DecInfo; pngDecInParam inParam; pngDecOutParam outParam; pngDecDataInfo DecDataInfo; pngDecThreadInParam InThdParam; pngDecThreadOutParam OutThdParam; InThdParam.enable = 0; InThdParam.ppu_prio = 512; InThdParam.spu_prio = 200; InThdParam.malloc_func = __get_addr32(__get_opd32(png_malloc)); InThdParam.malloc_arg = 0; // no args InThdParam.free_func = __get_addr32(__get_opd32(png_free)); InThdParam.free_arg = 0; // no args ret= pngDecCreate(&mHandle, &InThdParam, &OutThdParam); out->bmp_out = NULL; if(ret==0) { ret = pngDecOpen(mHandle,&sHandle,src,&space_allocated); if(ret==0) { ret = pngDecReadHeader(mHandle,sHandle,&DecInfo); if(ret==0) { inParam.cmd_ptr = 0; inParam.mode = PNGDEC_TOP_TO_BOTTOM; inParam.space = PNGDEC_ARGB; inParam.bit_depth = 8; inParam.pack_flag = 1; if(DecInfo.space==PNGDEC_GRAYSCALE_ALPHA || DecInfo.space==PNGDEC_RGBA || DecInfo.chunk_info&0x10) inParam.alpha_select = 0; else inParam.alpha_select = 1; inParam.alpha = 0xff; ret = pngDecSetParameter(mHandle,sHandle,&inParam,&outParam); } if(ret==0) { out->pitch = bytes_per_line = outParam.width*4; //out->bmp_out = malloc(out->pitch*outParam.height); out->bmp_out = rsxMemalign(64, out->pitch*outParam.height); if(!out->bmp_out) ret = -1; else { memset(out->bmp_out,0,(bytes_per_line*outParam.height)); ret = pngDecDecodeData(mHandle,sHandle,out->bmp_out,&bytes_per_line,&DecDataInfo); if(ret==0 && DecDataInfo.status==0) { out->width = outParam.width; out->height = outParam.height; ret = 0; } } } pngDecClose(mHandle,sHandle); } if(ret && out->bmp_out) { free(out->bmp_out); out->bmp_out = NULL; } pngDecDestroy(mHandle); } return ret; }