|
|
@@ -22,6 +22,9 @@ |
|
|
|
#elif defined ANDROID_NDK |
|
|
|
# include <jni.h> |
|
|
|
# include <android/log.h> |
|
|
|
#elif defined __CELLOS_LV2__ |
|
|
|
# include <cell/sysmodule.h> |
|
|
|
# include <cell/codec/pngdec.h> |
|
|
|
#endif |
|
|
|
|
|
|
|
#include "core.h" |
|
|
@@ -56,6 +59,10 @@ private: |
|
|
|
jobject bmp; |
|
|
|
jintArray array; |
|
|
|
jint *pixels; |
|
|
|
#elif defined __CELLOS_LV2__ |
|
|
|
static void* Malloc(uint32_t size, void* data) { return malloc(size); }; |
|
|
|
static int32_t Free(void* ptr, void* data) { free(ptr); return 0; }; |
|
|
|
uint8_t *pixels; |
|
|
|
#else |
|
|
|
uint8_t *pixels; |
|
|
|
#endif |
|
|
@@ -69,11 +76,11 @@ Image::Image(char const *path) |
|
|
|
: data(new ImageData()) |
|
|
|
{ |
|
|
|
#if defined __APPLE__ && defined __MACH__ |
|
|
|
NSString *fullpath = [NSString stringWithUTF8String:path]; |
|
|
|
NSArray *chunks = [fullpath componentsSeparatedByString: @"/"]; |
|
|
|
NSString *filename = [chunks objectAtIndex: [chunks count] - 1]; |
|
|
|
chunks = [filename componentsSeparatedByString: @"."]; |
|
|
|
NSString *prefix = [chunks objectAtIndex: 0]; |
|
|
|
NSString *fullpath = [NSString stringWithUTF8String:path]; |
|
|
|
NSArray *chunks = [fullpath componentsSeparatedByString: @"/"]; |
|
|
|
NSString *filename = [chunks objectAtIndex: [chunks count] - 1]; |
|
|
|
chunks = [filename componentsSeparatedByString: @"."]; |
|
|
|
NSString *prefix = [chunks objectAtIndex: 0]; |
|
|
|
NSString *mypath = [[NSBundle mainBundle] pathForResource:prefix ofType:@"png"]; |
|
|
|
NSData *pngdata = [[NSData alloc] initWithContentsOfFile:mypath]; |
|
|
|
UIImage *image = [[UIImage alloc] initWithData:pngdata]; |
|
|
@@ -149,6 +156,138 @@ Image::Image(char const *path) |
|
|
|
data->pixels[n] = u; |
|
|
|
} |
|
|
|
data->format = FORMAT_RGBA; |
|
|
|
#elif defined __CELLOS_LV2__ |
|
|
|
int32_t err; |
|
|
|
|
|
|
|
/* Initialise decoding library */ |
|
|
|
CellPngDecMainHandle hmain; |
|
|
|
|
|
|
|
err = cellSysmoduleLoadModule(CELL_SYSMODULE_FS); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not open Fs sysmodule\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
err = cellSysmoduleLoadModule(CELL_SYSMODULE_PNGDEC); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not open PngDec sysmodule\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
CellPngDecThreadInParam in_param; |
|
|
|
in_param.spuThreadEnable = CELL_PNGDEC_SPU_THREAD_ENABLE; |
|
|
|
in_param.ppuThreadPriority = 1000; |
|
|
|
in_param.spuThreadPriority = 200; |
|
|
|
in_param.cbCtrlMallocFunc = ImageData::Malloc; |
|
|
|
in_param.cbCtrlMallocArg = NULL; |
|
|
|
in_param.cbCtrlFreeFunc = ImageData::Free; |
|
|
|
in_param.cbCtrlFreeArg = NULL; |
|
|
|
CellPngDecThreadOutParam out_param; |
|
|
|
err = cellPngDecCreate(&hmain, &in_param, &out_param); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not create PngDec library\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
/* Create decoder */ |
|
|
|
CellPngDecSubHandle hsub; |
|
|
|
|
|
|
|
char file[1024]; |
|
|
|
sprintf(file, "/app_home/c:/Users/s.hocevar/lolengine/%s", path); |
|
|
|
|
|
|
|
CellPngDecSrc dec_src; |
|
|
|
dec_src.srcSelect = CELL_PNGDEC_FILE; |
|
|
|
dec_src.fileName = file; |
|
|
|
dec_src.fileOffset = 0; |
|
|
|
dec_src.fileSize = 0; |
|
|
|
dec_src.streamPtr = NULL; |
|
|
|
dec_src.streamSize = 0; |
|
|
|
dec_src.spuThreadEnable = CELL_PNGDEC_SPU_THREAD_ENABLE; |
|
|
|
CellPngDecOpnInfo open_info; |
|
|
|
err = cellPngDecOpen(hmain, &hsub, &dec_src, &open_info); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not open %s for decoding\n", file); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
CellPngDecInfo info; |
|
|
|
err = cellPngDecReadHeader(hmain, hsub, &info); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not read image header\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
CellPngDecInParam in_dec_param; |
|
|
|
in_dec_param.commandPtr = NULL; |
|
|
|
in_dec_param.outputMode = CELL_PNGDEC_TOP_TO_BOTTOM; |
|
|
|
in_dec_param.outputColorSpace = CELL_PNGDEC_RGBA; |
|
|
|
in_dec_param.outputBitDepth = 8; |
|
|
|
in_dec_param.outputPackFlag = CELL_PNGDEC_1BYTE_PER_1PIXEL; |
|
|
|
in_dec_param.outputAlphaSelect = CELL_PNGDEC_STREAM_ALPHA; |
|
|
|
in_dec_param.outputColorAlpha = 0xff; |
|
|
|
CellPngDecOutParam out_dec_param; |
|
|
|
err = cellPngDecSetParameter(hmain, hsub, &in_dec_param, &out_dec_param); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not configure PngDec decoder\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
/* Decode image */ |
|
|
|
data->size = vec2i(info.imageWidth, info.imageHeight); |
|
|
|
data->format = FORMAT_RGBA; |
|
|
|
data->pixels = (uint8_t *)malloc(info.imageWidth * 4 * info.imageHeight); |
|
|
|
CellPngDecDataCtrlParam data_ctrl_param; |
|
|
|
data_ctrl_param.outputBytesPerLine = info.imageWidth * 4; |
|
|
|
CellPngDecDataOutInfo data_out_info; |
|
|
|
err = cellPngDecDecodeData(hmain, hsub, data->pixels, |
|
|
|
&data_ctrl_param, &data_out_info); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not run PngDec decoder\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
/* Close decoder */ |
|
|
|
err = cellPngDecClose(hmain, hsub); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not close PngDec decoder\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
|
|
|
|
/* Deinitialise library */ |
|
|
|
err = cellPngDecDestroy(hmain); |
|
|
|
if (err != CELL_OK) |
|
|
|
{ |
|
|
|
#if !LOL_RELEASE |
|
|
|
Log::Error("could not destroy PngDec decoder\n"); |
|
|
|
#endif |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
err = cellSysmoduleUnloadModule(CELL_SYSMODULE_PNGDEC); |
|
|
|
err = cellSysmoduleUnloadModule(CELL_SYSMODULE_FS); |
|
|
|
#else |
|
|
|
data->size = 256; |
|
|
|
data->format = FORMAT_RGBA; |
|
|
@@ -183,6 +322,8 @@ void * Image::GetData() const |
|
|
|
return data->img->pixels; |
|
|
|
#elif defined ANDROID_NDK |
|
|
|
return data->pixels; |
|
|
|
#elif defined __CELLOS_LV2__ |
|
|
|
return data->pixels; |
|
|
|
#else |
|
|
|
return data->pixels; |
|
|
|
#endif |
|
|
@@ -205,6 +346,8 @@ Image::~Image() |
|
|
|
mid = g_env->GetMethodID(cls, "closeImage", "(Landroid/graphics/Bitmap;)V"); |
|
|
|
g_env->CallVoidMethod(g_ctx, mid, data->bmp); |
|
|
|
g_env->DeleteGlobalRef(data->bmp); |
|
|
|
#elif defined __CELLOS_LV2__ |
|
|
|
free(data->pixels); |
|
|
|
#else |
|
|
|
free(data->pixels); |
|
|
|
#endif |
|
|
|