* For Themes - added alternate coordinates for widescreen-mode.

- Differ the coordinates between 16:9 and 4:3, 
    can add a setting with a "w" as prefix 
    (e.g. sdcard_coord = 163,395 for 4:3 
     and wsdcard_coord = 170,395 for 16:9).
    Isn't setted "w???._coord", the "normal"-coordinate
    is used for both modes.
* added a new constructor for GuiImageData
  currebtly the constructor is unused, i will use later
This commit is contained in:
ardi@ist-einmalig.de 2009-10-12 15:39:59 +00:00
parent 812c37bf4a
commit fc8f4c2c7a
3 changed files with 163 additions and 30 deletions

View File

@ -559,6 +559,7 @@ class GuiImageData
//!\param i Image data
GuiImageData(const u8 * i);
GuiImageData(const char * imgPath, const u8 * buffer);
GuiImageData(const char *path, const char *file, const u8 * buffer, bool force_widescreen=false, const u8 * wbuffer=NULL);
//!Destructor
~GuiImageData();
//!Gets a pointer to the image data

View File

@ -153,6 +153,116 @@ GuiImageData::GuiImageData(const char * imgPath, const u8 * buffer)
}
}
/**
* Constructor for the GuiImageData class.
*/
GuiImageData::GuiImageData(const char *path, const char *file, const u8 *buffer, bool force_widescreen/*=false*/, const u8 *wbuffer/*=NULL*/)
{
data = NULL;
width = 0;
height = 0;
char path_4_3[100];
char path_16_9[100];
char *imgPath;
snprintf(path_4_3, sizeof(path_4_3), "%s%s", path, file);
if(force_widescreen)
{
snprintf(path_16_9, sizeof(path_16_9), "%sw%s", path, file);
imgPath = path_16_9;
if(wbuffer)
buffer = wbuffer;
}
else
imgPath = path_4_3;
for(;;)
{
if(imgPath)
{
PNGUPROP imgProp;
IMGCTX ctx = PNGU_SelectImageFromDevice(imgPath);
//if (((4%imgProp.imgWidth)!=0)||((4%imgProp.imgHeight)!=0))idiotFlag=1;
if(ctx)
{
int res = PNGU_GetImageProperties(ctx, &imgProp);
if(res == PNGU_OK)
{
int len = imgProp.imgWidth * imgProp.imgHeight * 4;
if(len%32) len += (32-len%32);
data = (u8 *)memalign (32, len);
if(data)
{
res = PNGU_DecodeTo4x4RGBA8 (ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255);
if(res == PNGU_OK)
{
width = imgProp.imgWidth;
height = imgProp.imgHeight;
DCFlushRange(data, len);
}
else
{
free(data);
data = NULL;
idiotFlag=1;
snprintf(idiotChar, sizeof(idiotChar), "%s", imgPath);
}
}
}
PNGU_ReleaseImageContext (ctx);
}
}
if(data || imgPath == path_4_3)
break;
imgPath = path_4_3;
}
if (!data) //use buffer data instead
{
width = 0;
height = 0;
if(buffer)
{
PNGUPROP imgProp;
IMGCTX ctx = PNGU_SelectImageFromBuffer(buffer);
if(!ctx)
return;
int res = PNGU_GetImageProperties(ctx, &imgProp);
if(res == PNGU_OK)
{
int len = imgProp.imgWidth * imgProp.imgHeight * 4;
if(len%32) len += (32-len%32);
data = (u8 *)memalign (32, len);
if(data)
{
res = PNGU_DecodeTo4x4RGBA8 (ctx, imgProp.imgWidth, imgProp.imgHeight, data, 255);
if(res == PNGU_OK)
{
width = imgProp.imgWidth;
height = imgProp.imgHeight;
DCFlushRange(data, len);
}
else
{
free(data);
data = NULL;
}
}
}
PNGU_ReleaseImageContext (ctx);
}
}
}
/**
* Destructor for the GuiImageData class.
*/

View File

@ -527,23 +527,51 @@ void path_set(char *name, char *val) {
}
#define CFG_COORDS2(name) \
if (strcmp(cfg_name, #name "_coords") == 0) { \
short x,y; \
if (sscanf(val, "%hd,%hd", &x, &y) == 2) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
} \
static u32 wCOORDS_FLAGS[2] = {0, 0}; // space for 64 coords - this is enough, also for the future
#define GET_wCOORD_FLAG(i) (wCOORDS_FLAGS[i/32] & (1UL << (i%32)))
#define SET_wCOORD_FLAG(i) (wCOORDS_FLAGS[i/32] |= (1UL << (i%32)))
#define CLEAR_wCOORD_FLAGS (wCOORDS_FLAGS[0] = wCOORDS_FLAGS[1] = 0)
#define CFG_COORDS2(name) \
if ((wcoords_idx++, 1) && !GET_wCOORD_FLAG(wcoords_idx) && \
strcmp(cfg_name, #name "_coords") == 0) { \
short x,y; \
if (sscanf(val, "%hd,%hd", &x, &y) == 2) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
} \
} \
else if (CFG.widescreen && \
strcmp(cfg_name, "w" #name "_coords") == 0) { \
short x,y; \
if (sscanf(val, "%hd,%hd", &x, &y) == 2) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
SET_wCOORD_FLAG(wcoords_idx); \
} \
}
#define CFG_COORDS4(name) \
if (strcmp(cfg_name, #name "_coords") == 0) { \
short x,y,w,h; \
if (sscanf(val, "%hd,%hd,%hd,%hd", &x, &y, &w, &h) == 4) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
THEME.name##_w = w; \
THEME.name##_h = h; \
} \
if ((wcoords_idx++, 1) && !GET_wCOORD_FLAG(wcoords_idx) && \
strcmp(cfg_name, #name "_coords") == 0) { \
short x,y,w,h; \
if (sscanf(val, "%hd,%hd,%hd,%hd", &x, &y, &w, &h) == 4) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
THEME.name##_w = w; \
THEME.name##_h = h; \
} \
} \
else if (CFG.widescreen && \
strcmp(cfg_name, "w" #name "_coords") == 0) { \
short x,y,w,h; \
if (sscanf(val, "%hd,%hd,%hd,%hd", &x, &y, &w, &h) == 4) { \
THEME.name##_x = x; \
THEME.name##_y = y; \
THEME.name##_w = w; \
THEME.name##_h = h; \
SET_wCOORD_FLAG(wcoords_idx); \
} \
}
#define CFG_COLOR(name) \
if (strcmp(cfg_name, #name "_color") == 0) { \
@ -577,14 +605,14 @@ void path_set(char *name, char *val) {
#define OLD_LIST_ICON 8
#define OLD_GRID_ICON 16
#define OLD_CAROUSEL_ICON 32
#define OLD_DVD_ICON 64
short WorkAroundIconSet=0;
short WorkAroundBarOffset=100;
static short WorkAroundIconSet=0;
static short WorkAroundBarOffset=100;
void theme_set(char *name, char *val) {
cfg_name = name;
cfg_val = val;
int wcoords_idx = -1;
CFG_COORDS4(gamelist)
else CFG_COORDS4(gamegrid)
else CFG_COORDS4(gamecarousel)
@ -756,17 +784,13 @@ void theme_set(char *name, char *val) {
THEME.gamegrid_carousel_x = THEME.gamecarousel_carousel_x = x-WorkAroundBarOffset;
THEME.gamelist_carousel_y = THEME.gamegrid_carousel_y = THEME.gamecarousel_carousel_y = y;
WorkAroundIconSet |= OLD_CAROUSEL_ICON;
}
}
else if (strcmp(cfg_name, "dvd_coords") == 0) {
short x,y;
if (sscanf(val, "%hd,%hd", &x, &y) == 2) {
if(!CFG.widescreen) x+=24;
// old themes have no dvd_coords
// place the dvdIcon to the right side of the carouselIcon
if(!CFG.widescreen) x+= CFG.widescreen ? 32 : 40;
THEME.gamelist_dvd_x = x;
THEME.gamegrid_dvd_x = THEME.gamecarousel_dvd_x = x-WorkAroundBarOffset;
THEME.gamelist_dvd_y = THEME.gamegrid_dvd_y = THEME.gamecarousel_dvd_y = y;
WorkAroundIconSet |= OLD_DVD_ICON;
}
}
@ -804,9 +828,6 @@ void theme_set(char *name, char *val) {
{
THEME.gamegrid_carousel_x += WorkAroundBarOffset - o;
THEME.gamecarousel_carousel_x += WorkAroundBarOffset - o;
}
if(WorkAroundIconSet & OLD_DVD_ICON)
{
THEME.gamegrid_dvd_x += WorkAroundBarOffset - o;
THEME.gamecarousel_dvd_x += WorkAroundBarOffset - o;
}
@ -1652,7 +1673,8 @@ void CFG_Load(void) {
cfg_parsefile(pathname, &path_set); //then set config and layout options
WorkAroundIconSet=0; WorkAroundBarOffset=100; // set Workaroundstuff to defaults
snprintf(pathname, sizeof(pathname), "%sGXtheme.cfg", CFG.theme_path);
CLEAR_wCOORD_FLAGS;
snprintf(pathname, sizeof(pathname), "%sGXtheme.cfg", CFG.theme_path);
cfg_parsefile(pathname, &theme_set); //finally set theme information
// set GUI language, use Wii's language setting if language is set to default