in cores/genesis/gx/gui/gui.c [304:574]
void GUI_DrawMenuFX(gui_menu *menu, u8 speed, u8 out)
{
int i,temp,xoffset,yoffset;
int max_offset = 0;
u8 item_alpha = 255;
GXColor text_color = DARK_GREY;
gui_item *item;
gui_butn *button;
gui_image *image;
/* find maximal offset */
for (i=0; i<menu->max_images; i++)
{
image = &menu->bg_images[i];
if (image->state & IMAGE_SLIDE_LEFT)
{
temp = image->x + image->w;
if (max_offset < temp)
max_offset = temp;
}
else if (image->state & IMAGE_SLIDE_RIGHT)
{
temp = 640 - image->x;
if (max_offset < temp)
max_offset = temp;
}
if (image->state & IMAGE_SLIDE_TOP)
{
temp = image->y + image->h;
if (max_offset < temp)
max_offset = temp;
}
else if (image->state & IMAGE_SLIDE_BOTTOM)
{
temp = 480 - image->y;
if (max_offset < temp)
max_offset = temp;
}
}
temp = max_offset;
/* Alpha steps */
int alpha = 0;
int alpha_step = (255 * speed) / max_offset;
if (out)
{
alpha = 255;
alpha_step = -alpha_step;
}
/* Let's loop until final position has been reached */
while (temp > 0)
{
/* background color */
if (menu->screenshot)
{
gxClearScreen((GXColor)BLACK);
if (alpha >= menu->screenshot)
gxDrawScreenshot(menu->screenshot);
else
gxDrawScreenshot(255 - alpha);
}
else
{
gxClearScreen(bg_color);
}
/* background images */
for (i=0; i<menu->max_images; i++)
{
image = &menu->bg_images[i];
/* X offset */
if (image->state & IMAGE_SLIDE_LEFT)
xoffset = out ? (temp - max_offset) : (-temp);
else if (image->state & IMAGE_SLIDE_RIGHT)
xoffset = out ? (max_offset - temp) : (temp);
else
xoffset = 0;
/* Y offset */
if (image->state & IMAGE_SLIDE_TOP)
yoffset = out ? (temp - max_offset) : (-temp);
else if (image->state & IMAGE_SLIDE_BOTTOM)
yoffset = out ? (max_offset - temp) : (temp);
else
yoffset = 0;
/* draw image */
if ((image->state & IMAGE_FADE) && ((out && (image->alpha > alpha)) || (!out && (image->alpha < alpha))))
{
/* FADE In-Out */
if (image->state & IMAGE_VISIBLE)
{
if (image->state & IMAGE_REPEAT)
gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha);
else
gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,alpha);
}
}
else
{
if (image->state & IMAGE_VISIBLE)
{
if (image->state & IMAGE_REPEAT)
gxDrawTextureRepeat(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha);
else
gxDrawTexture(image->texture,image->x+xoffset,image->y+yoffset,image->w,image->h,image->alpha);
}
}
}
/* menu title */
if ((menu->bg_images[2].state & IMAGE_SLIDE_TOP) || (menu->bg_images[3].state & IMAGE_SLIDE_TOP))
FONT_write(menu->title, 22,10,out ? (56 + temp - max_offset) : (56 - temp),640,(GXColor)WHITE);
else
FONT_write(menu->title, 22,10,56,640,(GXColor)WHITE);
/* draw buttons + items */
for (i=0; i<menu->max_buttons; i++)
{
button = &menu->buttons[i];
if (button->state & BUTTON_VISIBLE)
{
/* X offset */
if (button->state & BUTTON_SLIDE_LEFT)
xoffset = out ? (temp - max_offset) : (-temp);
else if (button->state & BUTTON_SLIDE_RIGHT)
xoffset = out ? (max_offset - temp) : (temp);
else
xoffset = 0;
/* Y offset */
if (button->state & BUTTON_SLIDE_TOP)
yoffset = out ? (temp - max_offset) : (-temp);
else if (button->state & BUTTON_SLIDE_BOTTOM)
yoffset = out ? (max_offset - temp) : (temp);
else
yoffset = 0;
/* Alpha transparency */
if (button->state & BUTTON_FADE)
{
item_alpha = alpha;
text_color.a = alpha;
}
else
{
item_alpha = 255;
text_color.a = 255;
}
/* item select (text or image) */
item = (menu->items) ? (&menu->items[menu->offset + i]) : NULL;
/* draw button + items */
if ((i == menu->selected) || (button->state & BUTTON_SELECTED))
{
if (button->data)
gxDrawTexture(button->data->texture[1],button->x+xoffset-4,button->y+yoffset-4,button->w+8,button->h+8,item_alpha);
if (item)
{
if (item->texture)
{
gxDrawTexture(item->texture, item->x+xoffset-4,item->y+yoffset-4,item->w+8,item->h+8,item_alpha);
FONT_writeCenter(item->text,18,button->x+xoffset+4,item->x+xoffset-4,button->y+yoffset+(button->h - 36)/2+18,text_color);
}
else
{
FONT_writeCenter(item->text,18,item->x+xoffset+2,item->x+item->w+xoffset+2,button->y+yoffset+(button->h-18)/2+18,text_color);
}
}
}
else
{
if (button->data)
gxDrawTexture(button->data->texture[0],button->x+xoffset,button->y+yoffset,button->w, button->h,item_alpha);
if (item)
{
if (item->texture)
{
gxDrawTexture(item->texture,item->x+xoffset,item->y+yoffset,item->w,item->h,item_alpha);
FONT_writeCenter(item->text,16,button->x+xoffset+8,item->x+xoffset,button->y+yoffset+(button->h - 32)/2+16,text_color);
}
else
{
FONT_writeCenter(item->text,16,item->x+xoffset,item->x+item->w+xoffset,button->y+yoffset+(button->h - 16)/2+16,text_color);
}
}
}
}
}
/* draw arrow */
for (i=0; i<2; i++)
{
button = menu->arrows[i];
if (button)
{
if (button->state & BUTTON_VISIBLE)
{
if (menu->selected == (menu->max_buttons + i))
gxDrawTexture(button->data->texture[1],button->x-2,button->y-2,button->w+4,button->h+4,255);
else
gxDrawTexture(button->data->texture[0],button->x,button->y,button->w, button->h,255);
}
}
}
if (!(menu->bg_images[3].state & IMAGE_SLIDE_BOTTOM) && !(menu->bg_images[4].state & IMAGE_SLIDE_BOTTOM))
{
/* left comment */
item = menu->helpers[0];
if (item)
{
if (item->data && strlen(item->comment))
{
gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255);
FONT_write(item->comment,16,item->x+item->w+6,item->y+(item->h-16)/2 + 16,640,(GXColor)WHITE);
}
}
/* right comment */
item = menu->helpers[1];
if (item)
{
if (item->data && strlen(item->comment))
{
gxDrawTexture(item->texture,item->x,item->y,item->w,item->h,255);
FONT_alignRight(item->comment,16,item->x-6,item->y+(item->h-16)/2+16,(GXColor)WHITE);
}
}
}
if (menu->cb)
menu->cb();
/* update offset */
temp -= speed;
/* update alpha */
alpha += alpha_step;
if (alpha > 255)
alpha = 255;
else if (alpha < 0)
alpha = 0;
/* copy EFB to XFB */
gxSetScreen();
}
/* final position */
if (!out)
{
GUI_DrawMenu(menu);
gxSetScreen();
}
else if (menu->screenshot)
{
gxClearScreen((GXColor)BLACK);
gxDrawScreenshot(255);
gxSetScreen();
}
}