Browse Source

ps3: load textures using the system's PNGDEC module.

legacy
Sam Hocevar sam 13 years ago
parent
commit
a457134d9f
1 changed files with 148 additions and 5 deletions
  1. +148
    -5
      src/image.cpp

+ 148
- 5
src/image.cpp View File

@@ -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


Loading…
Cancel
Save