| @@ -22,6 +22,9 @@ | |||||
| #elif defined ANDROID_NDK | #elif defined ANDROID_NDK | ||||
| # include <jni.h> | # include <jni.h> | ||||
| # include <android/log.h> | # include <android/log.h> | ||||
| #elif defined __CELLOS_LV2__ | |||||
| # include <cell/sysmodule.h> | |||||
| # include <cell/codec/pngdec.h> | |||||
| #endif | #endif | ||||
| #include "core.h" | #include "core.h" | ||||
| @@ -56,6 +59,10 @@ private: | |||||
| jobject bmp; | jobject bmp; | ||||
| jintArray array; | jintArray array; | ||||
| jint *pixels; | 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 | #else | ||||
| uint8_t *pixels; | uint8_t *pixels; | ||||
| #endif | #endif | ||||
| @@ -69,11 +76,11 @@ Image::Image(char const *path) | |||||
| : data(new ImageData()) | : data(new ImageData()) | ||||
| { | { | ||||
| #if defined __APPLE__ && defined __MACH__ | #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"]; | NSString *mypath = [[NSBundle mainBundle] pathForResource:prefix ofType:@"png"]; | ||||
| NSData *pngdata = [[NSData alloc] initWithContentsOfFile:mypath]; | NSData *pngdata = [[NSData alloc] initWithContentsOfFile:mypath]; | ||||
| UIImage *image = [[UIImage alloc] initWithData:pngdata]; | UIImage *image = [[UIImage alloc] initWithData:pngdata]; | ||||
| @@ -149,6 +156,138 @@ Image::Image(char const *path) | |||||
| data->pixels[n] = u; | data->pixels[n] = u; | ||||
| } | } | ||||
| data->format = FORMAT_RGBA; | 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 | #else | ||||
| data->size = 256; | data->size = 256; | ||||
| data->format = FORMAT_RGBA; | data->format = FORMAT_RGBA; | ||||
| @@ -183,6 +322,8 @@ void * Image::GetData() const | |||||
| return data->img->pixels; | return data->img->pixels; | ||||
| #elif defined ANDROID_NDK | #elif defined ANDROID_NDK | ||||
| return data->pixels; | return data->pixels; | ||||
| #elif defined __CELLOS_LV2__ | |||||
| return data->pixels; | |||||
| #else | #else | ||||
| return data->pixels; | return data->pixels; | ||||
| #endif | #endif | ||||
| @@ -205,6 +346,8 @@ Image::~Image() | |||||
| mid = g_env->GetMethodID(cls, "closeImage", "(Landroid/graphics/Bitmap;)V"); | mid = g_env->GetMethodID(cls, "closeImage", "(Landroid/graphics/Bitmap;)V"); | ||||
| g_env->CallVoidMethod(g_ctx, mid, data->bmp); | g_env->CallVoidMethod(g_ctx, mid, data->bmp); | ||||
| g_env->DeleteGlobalRef(data->bmp); | g_env->DeleteGlobalRef(data->bmp); | ||||
| #elif defined __CELLOS_LV2__ | |||||
| free(data->pixels); | |||||
| #else | #else | ||||
| free(data->pixels); | free(data->pixels); | ||||
| #endif | #endif | ||||