Added alpha support for skin sheet.

This commit is contained in:
David Capello 2010-04-23 21:56:59 -03:00
parent 0feed51cde
commit 917127ce37
6 changed files with 77 additions and 105 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -103,12 +103,9 @@
<part id="colorbar_1" x="16" y="192" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_1" x="16" y="192" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_2" x="0" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_2" x="0" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_3" x="16" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_3" x="16" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_0" x="32" y="192" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_1" x="48" y="192" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_2" x="32" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_3" x="48" y="208" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_fg" x="0" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_border_fg" x="0" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_bg" x="16" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_border_bg" x="16" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="colorbar_border_hotfg" x="32" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
</parts> </parts>
</skin> </skin>

View File

@ -513,38 +513,15 @@ void draw_color_button(BITMAP* bmp,
ji_screen = old_ji_screen; ji_screen = old_ji_screen;
} }
// Draw transparent border
set_trans_blender(0, 0, 0, 128);
{
SkinneableTheme* theme = (SkinneableTheme*)ji_get_theme();
int parts[8] = {
outer_nw ? PART_COLORBAR_BORDER_0_NW: PART_COLORBAR_BORDER_3_NW,
outer_n ? PART_COLORBAR_BORDER_0_N : PART_COLORBAR_BORDER_2_N,
outer_ne ? PART_COLORBAR_BORDER_1_NE: (outer_e ? PART_COLORBAR_BORDER_3_NE: PART_COLORBAR_BORDER_2_NE),
outer_e ? PART_COLORBAR_BORDER_1_E : PART_COLORBAR_BORDER_0_E,
outer_se ? PART_COLORBAR_BORDER_3_SE: (outer_s ? PART_COLORBAR_BORDER_2_SE: (outer_e ? PART_COLORBAR_BORDER_1_SE: PART_COLORBAR_BORDER_0_SE)),
outer_s ? PART_COLORBAR_BORDER_2_S : PART_COLORBAR_BORDER_0_S,
outer_sw ? PART_COLORBAR_BORDER_2_SW: (outer_s ? PART_COLORBAR_BORDER_3_SW: PART_COLORBAR_BORDER_1_SW),
outer_w ? PART_COLORBAR_BORDER_0_W : PART_COLORBAR_BORDER_1_W,
};
BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack
ji_screen = bmp;
theme->draw_trans_bounds0(rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1, parts);
ji_screen = old_ji_screen;
}
set_trans_blender(0, 0, 0, 0);
// Draw hot // Draw hot
if (hot) { if (hot) {
set_trans_blender(0, 0, 0, 128);
BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack BITMAP* old_ji_screen = ji_screen; // TODO fix this ugly hack
ji_screen = bmp; ji_screen = bmp;
theme->draw_trans_bounds(rc.x, rc.y, theme->draw_trans_bounds(rc.x, rc.y,
rc.x+rc.w-1, rc.x+rc.w-1,
rc.y+rc.h-1 - (outer_s ? 1*scale: 0), rc.y+rc.h-1 - (outer_s ? 1*scale: 0),
PART_COLORBAR_BORDER_FG_NW); PART_COLORBAR_BORDER_HOTFG_NW);
ji_screen = old_ji_screen; ji_screen = old_ji_screen;
set_trans_blender(0, 0, 0, 0);
} }
} }

View File

@ -126,12 +126,9 @@ SkinneableTheme::SkinneableTheme()
sheet_mapping["colorbar_1"] = PART_COLORBAR_1_NW; sheet_mapping["colorbar_1"] = PART_COLORBAR_1_NW;
sheet_mapping["colorbar_2"] = PART_COLORBAR_2_NW; sheet_mapping["colorbar_2"] = PART_COLORBAR_2_NW;
sheet_mapping["colorbar_3"] = PART_COLORBAR_3_NW; sheet_mapping["colorbar_3"] = PART_COLORBAR_3_NW;
sheet_mapping["colorbar_border_0"] = PART_COLORBAR_BORDER_0_NW;
sheet_mapping["colorbar_border_1"] = PART_COLORBAR_BORDER_1_NW;
sheet_mapping["colorbar_border_2"] = PART_COLORBAR_BORDER_2_NW;
sheet_mapping["colorbar_border_3"] = PART_COLORBAR_BORDER_3_NW;
sheet_mapping["colorbar_border_fg"] = PART_COLORBAR_BORDER_FG_NW; sheet_mapping["colorbar_border_fg"] = PART_COLORBAR_BORDER_FG_NW;
sheet_mapping["colorbar_border_bg"] = PART_COLORBAR_BORDER_BG_NW; sheet_mapping["colorbar_border_bg"] = PART_COLORBAR_BORDER_BG_NW;
sheet_mapping["colorbar_border_hotfg"] = PART_COLORBAR_BORDER_HOTFG_NW;
reload_skin(); reload_skin();
} }
@ -234,7 +231,7 @@ void SkinneableTheme::regen()
cursors_info[c].focusx = focusx; cursors_info[c].focusx = focusx;
cursors_info[c].focusy = focusy; cursors_info[c].focusy = focusy;
m_cursors[c] = cropPartFromSheet(m_cursors[c], x, y, w, h); m_cursors[c] = cropPartFromSheet(m_cursors[c], x, y, w, h, true);
break; break;
} }
@ -314,24 +311,31 @@ void SkinneableTheme::regen()
dirs_free(dirs); dirs_free(dirs);
} }
BITMAP* SkinneableTheme::cropPartFromSheet(BITMAP* bmp, int x, int y, int w, int h) BITMAP* SkinneableTheme::cropPartFromSheet(BITMAP* bmp, int x, int y, int w, int h, bool cursor)
{ {
int colordepth = (cursor ? bitmap_color_depth(screen): 32);
if (bmp && if (bmp &&
(bmp->w != w || (bmp->w != w ||
bmp->h != h || bmp->h != h ||
bitmap_color_depth(bmp) != bitmap_color_depth(screen))) { bitmap_color_depth(bmp) != colordepth)) {
destroy_bitmap(bmp); destroy_bitmap(bmp);
bmp = NULL; bmp = NULL;
} }
if (!bmp) if (!bmp)
bmp = create_bitmap(w, h); bmp = create_bitmap_ex(colordepth, w, h);
clear_to_color(bmp, bitmap_mask_color(bmp)); if (cursor) {
clear_to_color(bmp, bitmap_mask_color(bmp));
set_alpha_blender(); set_alpha_blender();
draw_trans_sprite(bmp, m_sheet_bmp, -x, -y); draw_trans_sprite(bmp, m_sheet_bmp, -x, -y);
set_trans_blender(0, 0, 0, 0); set_trans_blender(0, 0, 0, 0);
}
else {
blit(m_sheet_bmp, bmp, x, y, 0, 0, w, h);
}
return ji_apply_guiscale(bmp); return ji_apply_guiscale(bmp);
} }
@ -717,10 +721,11 @@ void SkinneableTheme::draw_check(JWidget widget, JRect clip)
draw_textstring(NULL, -1, bg, false, widget, &text, 0); draw_textstring(NULL, -1, bg, false, widget, &text, 0);
/* icon */ /* icon */
draw_sprite(ji_screen, set_alpha_blender();
jwidget_is_selected(widget) ? m_part[PART_CHECK_SELECTED]: draw_trans_sprite(ji_screen,
m_part[PART_CHECK_NORMAL], jwidget_is_selected(widget) ? m_part[PART_CHECK_SELECTED]:
icon.x1, icon.y1); m_part[PART_CHECK_NORMAL],
icon.x1, icon.y1);
// draw focus // draw focus
if (jwidget_has_focus(widget)) { if (jwidget_has_focus(widget)) {
@ -915,7 +920,8 @@ void SkinneableTheme::draw_menuitem(JWidget widget, JRect clip)
int x = widget->rc->x1+4-icon->w/2; int x = widget->rc->x1+4-icon->w/2;
int y = (widget->rc->y1+widget->rc->y2)/2-icon->h/2; int y = (widget->rc->y1+widget->rc->y2)/2-icon->h/2;
draw_sprite(ji_screen, icon, x, y); set_alpha_blender();
draw_trans_sprite(ji_screen, icon, x, y);
} }
/* text */ /* text */
@ -1007,10 +1013,11 @@ void SkinneableTheme::draw_radio(JWidget widget, JRect clip)
draw_textstring(NULL, -1, bg, false, widget, &text, 0); draw_textstring(NULL, -1, bg, false, widget, &text, 0);
/* icon */ /* icon */
draw_sprite(ji_screen, set_alpha_blender();
jwidget_is_selected(widget) ? m_part[PART_RADIO_SELECTED]: draw_trans_sprite(ji_screen,
m_part[PART_RADIO_NORMAL], jwidget_is_selected(widget) ? m_part[PART_RADIO_SELECTED]:
icon.x1, icon.y1); m_part[PART_RADIO_NORMAL],
icon.x1, icon.y1);
// draw focus // draw focus
if (jwidget_has_focus(widget)) { if (jwidget_has_focus(widget)) {
@ -1266,7 +1273,8 @@ void SkinneableTheme::draw_combobox_button(JWidget widget, JRect clip)
get_button_selected_offset(), get_button_selected_offset(),
get_button_selected_offset()); get_button_selected_offset());
draw_sprite(ji_screen, icon_bmp, icon.x1, icon.y1); set_alpha_blender();
draw_trans_sprite(ji_screen, icon_bmp, icon.x1, icon.y1);
} }
void SkinneableTheme::draw_textbox(JWidget widget, JRect clip) void SkinneableTheme::draw_textbox(JWidget widget, JRect clip)
@ -1398,7 +1406,8 @@ void SkinneableTheme::draw_frame_button(JWidget widget, JRect clip)
else else
part = PART_WINDOW_CLOSE_BUTTON_NORMAL; part = PART_WINDOW_CLOSE_BUTTON_NORMAL;
draw_sprite(ji_screen, m_part[part], widget->rc->x1, widget->rc->y1); set_alpha_blender();
draw_trans_sprite(ji_screen, m_part[part], widget->rc->x1, widget->rc->y1);
} }
int SkinneableTheme::get_bg_color(JWidget widget) int SkinneableTheme::get_bg_color(JWidget widget)
@ -1568,7 +1577,8 @@ void SkinneableTheme::draw_bounds0(int x1, int y1, int x2, int y2, int parts[8])
int sw = parts[6]; int sw = parts[6];
int w = parts[7]; int w = parts[7];
draw_bounds_template(nw, n, ne, e, se, s, sw, w, draw_sprite); set_alpha_blender();
draw_bounds_template(nw, n, ne, e, se, s, sw, w, draw_trans_sprite);
} }
void SkinneableTheme::draw_trans_bounds0(int x1, int y1, int x2, int y2, int parts[8]) void SkinneableTheme::draw_trans_bounds0(int x1, int y1, int x2, int y2, int parts[8])
@ -1587,10 +1597,11 @@ void SkinneableTheme::draw_trans_bounds0(int x1, int y1, int x2, int y2, int par
void SkinneableTheme::draw_bounds(int x1, int y1, int x2, int y2, int nw, int bg) void SkinneableTheme::draw_bounds(int x1, int y1, int x2, int y2, int nw, int bg)
{ {
set_alpha_blender();
draw_bounds_template(nw+0, nw+1, nw+2, nw+3, draw_bounds_template(nw+0, nw+1, nw+2, nw+3,
nw+4, nw+5, nw+6, nw+7, draw_sprite); nw+4, nw+5, nw+6, nw+7, draw_trans_sprite);
// Background // Center
if (bg >= 0) { if (bg >= 0) {
x1 += m_part[nw+7]->w; x1 += m_part[nw+7]->w;
y1 += m_part[nw+1]->h; y1 += m_part[nw+1]->h;
@ -1627,14 +1638,23 @@ void SkinneableTheme::draw_hline(int x1, int y1, int x2, int y2, int part)
{ {
int x; int x;
set_alpha_blender();
for (x = x1; for (x = x1;
x <= x2-m_part[part]->w; x <= x2-m_part[part]->w;
x += m_part[part]->w) { x += m_part[part]->w) {
draw_sprite(ji_screen, m_part[part], x, y1); draw_trans_sprite(ji_screen, m_part[part], x, y1);
} }
if (x <= x2) if (x <= x2) {
blit(m_part[part], ji_screen, 0, 0, x, y1, x2-x+1, m_part[part]->h); int cx1, cy1, cx2, cy2;
get_clip_rect(ji_screen, &cx1, &cy1, &cx2, &cy2);
if (my_add_clip_rect(ji_screen, x, y1, x2, y1+m_part[part]->h-1))
draw_trans_sprite(ji_screen, m_part[part], x, y1);
set_clip_rect(ji_screen, cx1, cy1, cx2, cy2);
}
} }
void SkinneableTheme::draw_bevel_box(int x1, int y1, int x2, int y2, int c1, int c2, int *bevel) void SkinneableTheme::draw_bevel_box(int x1, int y1, int x2, int y2, int c1, int c2, int *bevel)

View File

@ -354,42 +354,6 @@ enum {
PART_COLORBAR_3_SW, PART_COLORBAR_3_SW,
PART_COLORBAR_3_W, PART_COLORBAR_3_W,
PART_COLORBAR_BORDER_0_NW,
PART_COLORBAR_BORDER_0_N,
PART_COLORBAR_BORDER_0_NE,
PART_COLORBAR_BORDER_0_E,
PART_COLORBAR_BORDER_0_SE,
PART_COLORBAR_BORDER_0_S,
PART_COLORBAR_BORDER_0_SW,
PART_COLORBAR_BORDER_0_W,
PART_COLORBAR_BORDER_1_NW,
PART_COLORBAR_BORDER_1_N,
PART_COLORBAR_BORDER_1_NE,
PART_COLORBAR_BORDER_1_E,
PART_COLORBAR_BORDER_1_SE,
PART_COLORBAR_BORDER_1_S,
PART_COLORBAR_BORDER_1_SW,
PART_COLORBAR_BORDER_1_W,
PART_COLORBAR_BORDER_2_NW,
PART_COLORBAR_BORDER_2_N,
PART_COLORBAR_BORDER_2_NE,
PART_COLORBAR_BORDER_2_E,
PART_COLORBAR_BORDER_2_SE,
PART_COLORBAR_BORDER_2_S,
PART_COLORBAR_BORDER_2_SW,
PART_COLORBAR_BORDER_2_W,
PART_COLORBAR_BORDER_3_NW,
PART_COLORBAR_BORDER_3_N,
PART_COLORBAR_BORDER_3_NE,
PART_COLORBAR_BORDER_3_E,
PART_COLORBAR_BORDER_3_SE,
PART_COLORBAR_BORDER_3_S,
PART_COLORBAR_BORDER_3_SW,
PART_COLORBAR_BORDER_3_W,
PART_COLORBAR_BORDER_FG_NW, PART_COLORBAR_BORDER_FG_NW,
PART_COLORBAR_BORDER_FG_N, PART_COLORBAR_BORDER_FG_N,
PART_COLORBAR_BORDER_FG_NE, PART_COLORBAR_BORDER_FG_NE,
@ -408,6 +372,15 @@ enum {
PART_COLORBAR_BORDER_BG_SW, PART_COLORBAR_BORDER_BG_SW,
PART_COLORBAR_BORDER_BG_W, PART_COLORBAR_BORDER_BG_W,
PART_COLORBAR_BORDER_HOTFG_NW,
PART_COLORBAR_BORDER_HOTFG_N,
PART_COLORBAR_BORDER_HOTFG_NE,
PART_COLORBAR_BORDER_HOTFG_E,
PART_COLORBAR_BORDER_HOTFG_SE,
PART_COLORBAR_BORDER_HOTFG_S,
PART_COLORBAR_BORDER_HOTFG_SW,
PART_COLORBAR_BORDER_HOTFG_W,
PARTS PARTS
}; };
@ -527,7 +500,7 @@ public:
private: private:
BITMAP* cropPartFromSheet(BITMAP* bmp, int x, int y, int w, int h); BITMAP* cropPartFromSheet(BITMAP* bmp, int x, int y, int w, int h, bool cursor = false);
int get_bg_color(JWidget widget); int get_bg_color(JWidget widget);
void draw_textstring(const char *t, int fg_color, int bg_color, void draw_textstring(const char *t, int fg_color, int bg_color,
bool fill_bg, JWidget widget, const JRect rect, bool fill_bg, JWidget widget, const JRect rect,

View File

@ -217,10 +217,12 @@ bool ToolBar::msg_proc(JMessage msg)
// Draw the tool icon // Draw the tool icon
BITMAP* icon = theme->get_toolicon(tool->getId().c_str()); BITMAP* icon = theme->get_toolicon(tool->getId().c_str());
if (icon) if (icon) {
draw_sprite(doublebuffer, icon, set_alpha_blender();
toolrc.x+toolrc.w/2-icon->w/2, draw_trans_sprite(doublebuffer, icon,
toolrc.y+toolrc.h/2-icon->h/2); toolrc.x+toolrc.w/2-icon->w/2,
toolrc.y+toolrc.h/2-icon->h/2);
}
} }
toolrc = getToolGroupBounds(-1); toolrc = getToolGroupBounds(-1);
@ -234,9 +236,10 @@ bool ToolBar::msg_proc(JMessage msg)
// Draw the tool icon // Draw the tool icon
BITMAP* icon = theme->get_toolicon("configuration"); BITMAP* icon = theme->get_toolicon("configuration");
if (icon) { if (icon) {
draw_sprite(doublebuffer, icon, set_alpha_blender();
toolrc.x+toolrc.w/2-icon->w/2, draw_trans_sprite(doublebuffer, icon,
toolrc.y+toolrc.h/2-icon->h/2); toolrc.x+toolrc.w/2-icon->w/2,
toolrc.y+toolrc.h/2-icon->h/2);
} }
ji_screen = old_ji_screen; ji_screen = old_ji_screen;
@ -573,10 +576,12 @@ bool ToolStrip::msg_proc(JMessage msg)
// Draw the tool icon // Draw the tool icon
BITMAP* icon = theme->get_toolicon(tool->getId().c_str()); BITMAP* icon = theme->get_toolicon(tool->getId().c_str());
if (icon) if (icon) {
draw_sprite(doublebuffer, icon, set_alpha_blender();
toolrc.x+toolrc.w/2-icon->w/2, draw_trans_sprite(doublebuffer, icon,
toolrc.y+toolrc.h/2-icon->h/2); toolrc.x+toolrc.w/2-icon->w/2,
toolrc.y+toolrc.h/2-icon->h/2);
}
} }
} }