diff --git a/src/app/ui/color_button.cpp b/src/app/ui/color_button.cpp index 4e7cad668..b3c89b45e 100644 --- a/src/app/ui/color_button.cpp +++ b/src/app/ui/color_button.cpp @@ -166,7 +166,7 @@ bool ColorButton::onProcessMessage(Message* msg) void ColorButton::onPreferredSize(PreferredSizeEvent& ev) { gfx::Rect box; - jwidget_get_texticon_info(this, &box, NULL, NULL, 0, 0, 0); + getTextIconInfo(&box); box.w = 64; ev.setPreferredSize(box.w + border_width.l + border_width.r, @@ -177,10 +177,7 @@ void ColorButton::onPaint(PaintEvent& ev) { Graphics* g = ev.getGraphics(); SkinTheme* theme = static_cast(getTheme()); - gfx::Rect rc = getClientBounds(); - gfx::Rect text; - jwidget_get_texticon_info(this, NULL, &text, NULL, 0, 0, 0); ui::Color bg = getBgColor(); if (is_transparent(bg)) @@ -211,14 +208,14 @@ void ColorButton::onPaint(PaintEvent& ev) app::Color::ShortHumanReadableString); setTextQuiet(str.c_str()); - jwidget_get_texticon_info(this, NULL, &text, NULL, 0, 0, 0); ui::Color textcolor = ui::rgba(255, 255, 255); if (color.isValid()) textcolor = color_utils::blackandwhite_neg(ui::rgba(color.getRed(), color.getGreen(), color.getBlue())); - g->drawString(getText(), textcolor, ColorNone, false, - text.getOrigin() - getBounds().getOrigin()); + gfx::Rect text; + getTextIconInfo(NULL, &text); + g->drawString(getText(), textcolor, ColorNone, false, text.getOrigin()); } void ColorButton::onClick(Event& ev) diff --git a/src/app/ui/skin/skin_theme.cpp b/src/app/ui/skin/skin_theme.cpp index 342a34cbb..0b03deb14 100644 --- a/src/app/ui/skin/skin_theme.cpp +++ b/src/app/ui/skin/skin_theme.cpp @@ -1,5 +1,5 @@ /* Aseprite - * Copyright (C) 2001-2013 David Capello + * Copyright (C) 2001-2014 David Capello * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,9 +20,6 @@ #include "config.h" #endif -#include -#include - #include "app/modules/gui.h" #include "app/resource_finder.h" #include "app/ui/skin/button_icon_impl.h" @@ -41,14 +38,14 @@ #include "gfx/point.h" #include "gfx/rect.h" #include "gfx/size.h" -#include "loadpng.h" #include "she/system.h" #include "ui/intern.h" #include "ui/ui.h" #include "tinyxml.h" -#define CHARACTER_LENGTH(f, c) ((f)->vtable->char_length((f), (c))) +#include +#include #define BGCOLOR (getWidgetBgColor(widget)) @@ -386,7 +383,7 @@ void SkinTheme::reload_skin() set_color_conversion(COLORCONV_NONE); PALETTE pal; - m_sheet_bmp = load_png(rf.filename().c_str(), pal); + m_sheet_bmp = load_bitmap(rf.filename().c_str(), pal); if (!m_sheet_bmp) throw base::Exception("Error loading %s file", sheet_filename.c_str()); @@ -928,10 +925,10 @@ void SkinTheme::paintButton(PaintEvent& ev) ui::Color fg, bg; int part_nw; - jwidget_get_texticon_info(widget, &box, &text, &icon, - iconInterface ? iconInterface->getIconAlign(): 0, - iconInterface ? iconInterface->getWidth() : 0, - iconInterface ? iconInterface->getHeight() : 0); + widget->getTextIconInfo(&box, &text, &icon, + iconInterface ? iconInterface->getIconAlign(): 0, + iconInterface ? iconInterface->getWidth() : 0, + iconInterface ? iconInterface->getHeight() : 0); // Tool buttons are smaller LookType look = NormalLook; @@ -990,23 +987,23 @@ void SkinTheme::paintButton(PaintEvent& ev) icon.offset(get_button_selected_offset(), get_button_selected_offset()); - paintIcon(widget, ev.getGraphics(), iconInterface, - icon.x-widget->getBounds().x, - icon.y-widget->getBounds().y); + paintIcon(widget, ev.getGraphics(), iconInterface, icon.x, icon.y); } } void SkinTheme::paintCheckBox(PaintEvent& ev) { + Graphics* g = ev.getGraphics(); ButtonBase* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); IButtonIcon* iconInterface = widget->getIconInterface(); gfx::Rect box, text, icon; ui::Color bg; - jwidget_get_texticon_info(widget, &box, &text, &icon, - iconInterface ? iconInterface->getIconAlign(): 0, - iconInterface ? iconInterface->getWidth() : 0, - iconInterface ? iconInterface->getHeight() : 0); + widget->getTextIconInfo(&box, &text, &icon, + iconInterface ? iconInterface->getIconAlign(): 0, + iconInterface ? iconInterface->getWidth() : 0, + iconInterface ? iconInterface->getHeight() : 0); // Check box look LookType look = NormalLook; @@ -1015,31 +1012,26 @@ void SkinTheme::paintCheckBox(PaintEvent& ev) look = skinPropery->getLook(); // Background - jdraw_rectfill(widget->getBounds(), bg = BGCOLOR); + g->fillRect(bg = BGCOLOR, bounds); // Mouse if (widget->isEnabled()) { if (widget->hasMouseOver()) - jdraw_rectfill(widget->getBounds(), bg = getColor(ThemeColor::CheckHotFace)); + g->fillRect(bg = getColor(ThemeColor::CheckHotFace), bounds); else if (widget->hasFocus()) - jdraw_rectfill(widget->getBounds(), bg = getColor(ThemeColor::CheckFocusFace)); + g->fillRect(bg = getColor(ThemeColor::CheckFocusFace), bounds); } // Text - drawTextStringDeprecated(NULL, ColorNone, bg, false, widget, text, 0); + drawTextString(g, NULL, ColorNone, bg, false, widget, text, 0); // Paint the icon if (iconInterface) - paintIcon(widget, ev.getGraphics(), iconInterface, icon.x-widget->getBounds().x, icon.y-widget->getBounds().y); + paintIcon(widget, g, iconInterface, icon.x, icon.y); // draw focus - if (look != WithoutBordersLook && widget->hasFocus()) { - draw_bounds_nw(ji_screen, - widget->getBounds().x, - widget->getBounds().y, - widget->getBounds().x2()-1, - widget->getBounds().y2()-1, PART_CHECK_FOCUS_NW, ui::ColorNone); - } + if (look != WithoutBordersLook && widget->hasFocus()) + draw_bounds_nw(g, bounds, PART_CHECK_FOCUS_NW, ui::ColorNone); } void SkinTheme::paintGrid(PaintEvent& ev) @@ -1052,26 +1044,21 @@ void SkinTheme::paintGrid(PaintEvent& ev) void SkinTheme::paintEntry(PaintEvent& ev) { + Graphics* g = ev.getGraphics(); Entry* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); bool password = widget->isPassword(); int scroll, caret, state, selbeg, selend; std::string textString = widget->getText() + widget->getSuffix(); int suffixIndex = widget->getTextLength(); const char* text = textString.c_str(); int c, ch, x, y, w; - int x1, y1, x2, y2; int caret_x; widget->getEntryThemeInfo(&scroll, &caret, &state, &selbeg, &selend); // Outside borders - jdraw_rectfill(widget->getBounds(), BGCOLOR); - - // Main pos - x1 = widget->getBounds().x; - y1 = widget->getBounds().y; - x2 = widget->getBounds().x2()-1; - y2 = widget->getBounds().y2()-1; + g->fillRect(BGCOLOR, bounds); bool isMiniLook = false; SkinPropertyPtr skinPropery = widget->getProperty(SkinProperty::Name); @@ -1079,16 +1066,15 @@ void SkinTheme::paintEntry(PaintEvent& ev) isMiniLook = (skinPropery->getLook() == MiniLook); ui::Color bg = getColor(ThemeColor::Background); - draw_bounds_nw(ji_screen, - x1, y1, x2, y2, - (widget->hasFocus() ? - (isMiniLook ? PART_SUNKEN_MINI_FOCUSED_NW: PART_SUNKEN_FOCUSED_NW): - (isMiniLook ? PART_SUNKEN_MINI_NORMAL_NW : PART_SUNKEN_NORMAL_NW)), - bg); + draw_bounds_nw(g, bounds, + (widget->hasFocus() ? + (isMiniLook ? PART_SUNKEN_MINI_FOCUSED_NW: PART_SUNKEN_FOCUSED_NW): + (isMiniLook ? PART_SUNKEN_MINI_NORMAL_NW : PART_SUNKEN_NORMAL_NW)), + bg); // Draw the text - x = widget->getBounds().x + widget->border_width.l; - y = widget->getBounds().y + widget->getBounds().h/2 - widget->getTextHeight()/2; + x = bounds.x + widget->border_width.l; + y = bounds.y + bounds.h/2 - widget->getTextHeight()/2; for (c=scroll; ugetat(text, c); c++) { ch = password ? '*': ugetat(text, c); @@ -1121,29 +1107,24 @@ void SkinTheme::paintEntry(PaintEvent& ev) fg = getColor(ThemeColor::EntrySuffix); } - w = CHARACTER_LENGTH(widget->getFont(), ch); - if (x+w > widget->getBounds().x2()-3) + w = g->measureChar(ch).w; + if (x+w > bounds.x2()-3) return; caret_x = x; - ji_font_set_aa_mode(widget->getFont(), - to_system(is_transparent(bg) ? getColor(ThemeColor::Background): - bg)); - widget->getFont()->vtable->render_char(widget->getFont(), ch, - to_system(fg), - to_system(bg), ji_screen, x, y); + g->drawChar(ch, fg, bg, x, y); x += w; // Caret if ((c == caret) && (state) && (widget->hasFocus())) - draw_entry_caret(widget, caret_x, y); + drawEntryCaret(g, widget, caret_x, y); } // Draw the caret if it is next of the last character if ((c == caret) && (state) && (widget->hasFocus()) && (widget->isEnabled())) { - draw_entry_caret(widget, x, y); + drawEntryCaret(g, widget, x, y); } } @@ -1158,30 +1139,26 @@ void SkinTheme::paintLabel(PaintEvent& ev) g->fillRect(bg, rc); rc.shrink(widget->getBorder()); - jwidget_get_texticon_info(widget, NULL, &text, NULL, 0, 0, 0); - - g->drawString(widget->getText(), fg, bg, false, - // TODO "text" coordinates are absolute and we are drawing on client area - Point(text.x, text.y) - widget->getOrigin()); + widget->getTextIconInfo(NULL, &text); + g->drawString(widget->getText(), fg, bg, false, text.getOrigin()); } void SkinTheme::paintLinkLabel(PaintEvent& ev) { + Graphics* g = ev.getGraphics(); Widget* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); + ui::Color fg = getColor(ThemeColor::LinkText); ui::Color bg = BGCOLOR; - jdraw_rectfill(widget->getBounds(), bg); - drawTextStringDeprecated(NULL, getColor(ThemeColor::LinkText), bg, false, widget, - widget->getBounds(), 0); + g->fillRect(bg, bounds); + drawTextString(g, NULL, fg, bg, false, widget, bounds, 0); + // Underline style if (widget->hasMouseOver()) { int w = widget->getTextWidth(); - - hline(ji_screen, - widget->getBounds().x, - widget->getBounds().y2()-1, - widget->getBounds().x+w-1, - to_system(getColor(ThemeColor::LinkText))); + for (int v=0; vdrawHLine(fg, bounds.x, bounds.y2()-1-v, w); } } @@ -1196,9 +1173,9 @@ void SkinTheme::paintListBox(PaintEvent& ev) void SkinTheme::paintListItem(ui::PaintEvent& ev) { Widget* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); Graphics* g = ev.getGraphics(); ui::Color fg, bg; - int x, y; if (!widget->isEnabled()) { bg = getColor(ThemeColor::Face); @@ -1213,26 +1190,11 @@ void SkinTheme::paintListItem(ui::PaintEvent& ev) bg = getColor(ThemeColor::ListItemNormalFace); } - x = widget->getBounds().x+widget->border_width.l; - y = widget->getBounds().y+widget->border_width.t; + g->fillRect(bg, bounds); if (widget->hasText()) { - // Text - jdraw_text(ji_screen, widget->getFont(), widget->getText().c_str(), x, y, - fg, bg, true, jguiscale()); - - // Background - jrectexclude - (ji_screen, - widget->getBounds().x, widget->getBounds().y, - widget->getBounds().x2()-1, widget->getBounds().y2()-1, - x, y, - x+widget->getTextWidth()-1, - y+widget->getTextHeight()-1, bg); - } - // Background - else { - jdraw_rectfill(widget->getBounds(), bg); + bounds.shrink(widget->getBorder()); + drawTextString(g, NULL, fg, bg, true, widget, bounds, 0); } } @@ -1246,10 +1208,10 @@ void SkinTheme::paintMenu(PaintEvent& ev) void SkinTheme::paintMenuItem(ui::PaintEvent& ev) { - MenuItem* widget = static_cast(ev.getSource()); Graphics* g = ev.getGraphics(); + MenuItem* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); ui::Color fg, bg; - int x1, y1, x2, y2; int c, bar; // TODO ASSERT? @@ -1278,34 +1240,26 @@ void SkinTheme::paintMenuItem(ui::PaintEvent& ev) } } - /* widget position */ - x1 = widget->getBounds().x; - y1 = widget->getBounds().y; - x2 = widget->getBounds().x2()-1; - y2 = widget->getBounds().y2()-1; + // Background + g->fillRect(bg, bounds); - /* background */ - rectfill(ji_screen, x1, y1, x2, y2, to_system(bg)); - - /* draw an indicator for selected items */ + // Draw an indicator for selected items if (widget->isSelected()) { BITMAP* icon = m_part[widget->isEnabled() ? PART_CHECK_SELECTED: PART_CHECK_DISABLED]; - int x = widget->getBounds().x+4-icon->w/2; - int y = widget->getBounds().y+widget->getBounds().h/2-icon->h/2; - - set_alpha_blender(); - draw_trans_sprite(ji_screen, icon, x, y); + int x = bounds.x+4-icon->w/2; + int y = bounds.y+bounds.h/2-icon->h/2; + g->drawAlphaBitmap(icon, x, y); } - /* text */ + // Text if (bar) widget->setAlign(JI_CENTER | JI_MIDDLE); else widget->setAlign(JI_LEFT | JI_MIDDLE); - Rect pos = widget->getClientBounds(); + Rect pos = bounds; if (!bar) pos.offset(widget->child_spacing/2, 0); drawTextString(g, NULL, fg, bg, false, widget, pos, 0); @@ -1319,32 +1273,28 @@ void SkinTheme::paintMenuItem(ui::PaintEvent& ev) // Enabled if (widget->isEnabled()) { for (c=0; c<3*scale; c++) - vline(ji_screen, - widget->getBounds().x2()-3*scale-c, - widget->getBounds().y+widget->getBounds().h/2-c, - widget->getBounds().y+widget->getBounds().h/2+c, to_system(fg)); + g->drawVLine(fg, + bounds.x2()-3*scale-c, + bounds.y+bounds.h/2-c, 2*c+1); } // Disabled else { for (c=0; c<3*scale; c++) - vline(ji_screen, - widget->getBounds().x2()-3*scale-c+1, - widget->getBounds().y+widget->getBounds().h/2-c+1, - widget->getBounds().y+widget->getBounds().h/2+c+1, - to_system(getColor(ThemeColor::Background))); + g->drawVLine(getColor(ThemeColor::Background), + bounds.x2()-3*scale-c+1, + bounds.y+bounds.h/2-c+1, 2*c+1); + for (c=0; c<3*scale; c++) - vline(ji_screen, - widget->getBounds().x2()-3*scale-c, - widget->getBounds().y+widget->getBounds().h/2-c, - widget->getBounds().y+widget->getBounds().h/2+c, - to_system(getColor(ThemeColor::Disabled))); + g->drawVLine(getColor(ThemeColor::Disabled), + bounds.x2()-3*scale-c, + bounds.y+bounds.h/2-c, 2*c+1); } } // Draw the keyboard shortcut else if (widget->getAccel()) { int old_align = widget->getAlign(); - pos = widget->getClientBounds(); + pos = bounds; pos.w -= widget->child_spacing/4; std::string buf = widget->getAccel()->toString(); @@ -1366,16 +1316,17 @@ void SkinTheme::paintSplitter(PaintEvent& ev) void SkinTheme::paintRadioButton(PaintEvent& ev) { - ButtonBase* widget = static_cast(ev.getSource()); Graphics* g = ev.getGraphics(); + ButtonBase* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); IButtonIcon* iconInterface = widget->getIconInterface(); ui::Color bg = BGCOLOR; gfx::Rect box, text, icon; - jwidget_get_texticon_info(widget, &box, &text, &icon, - iconInterface ? iconInterface->getIconAlign(): 0, - iconInterface ? iconInterface->getWidth() : 0, - iconInterface ? iconInterface->getHeight() : 0); + widget->getTextIconInfo(&box, &text, &icon, + iconInterface ? iconInterface->getIconAlign(): 0, + iconInterface ? iconInterface->getWidth() : 0, + iconInterface ? iconInterface->getHeight() : 0); // Background g->fillRect(bg, g->getClipBounds()); @@ -1383,63 +1334,52 @@ void SkinTheme::paintRadioButton(PaintEvent& ev) // Mouse if (widget->isEnabled()) { if (widget->hasMouseOver()) - jdraw_rectfill(widget->getBounds(), bg = getColor(ThemeColor::RadioHotFace)); + g->fillRect(bg = getColor(ThemeColor::RadioHotFace), bounds); else if (widget->hasFocus()) - jdraw_rectfill(widget->getBounds(), bg = getColor(ThemeColor::RadioFocusFace)); + g->fillRect(bg = getColor(ThemeColor::RadioFocusFace), bounds); } // Text - drawTextStringDeprecated(NULL, ColorNone, bg, false, widget, text, 0); + drawTextString(g, NULL, ColorNone, bg, false, widget, text, 0); - // Paint the icon + // Icon if (iconInterface) - paintIcon(widget, g, iconInterface, icon.x-widget->getBounds().x, icon.y-widget->getBounds().y); + paintIcon(widget, g, iconInterface, icon.x, icon.y); - // draw focus - if (widget->hasFocus()) { - draw_bounds_nw(ji_screen, - widget->getBounds(), PART_RADIO_FOCUS_NW, ui::ColorNone); - } + // Focus + if (widget->hasFocus()) + draw_bounds_nw(g, bounds, PART_RADIO_FOCUS_NW, ui::ColorNone); } void SkinTheme::paintSeparator(ui::PaintEvent& ev) { - Widget* widget = static_cast(ev.getSource()); Graphics* g = ev.getGraphics(); - int x1, y1, x2, y2; - - // position - x1 = widget->getBounds().x + widget->border_width.l/2; - y1 = widget->getBounds().y + widget->border_width.t/2; - x2 = widget->getBounds().x2() - 1 - widget->border_width.r/2; - y2 = widget->getBounds().y2() - 1 - widget->border_width.b/2; + Widget* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); // background - jdraw_rectfill(widget->getBounds(), BGCOLOR); + g->fillRect(BGCOLOR, bounds); - if (widget->getAlign() & JI_HORIZONTAL) { - draw_part_as_hline(ji_screen, - widget->getBounds().x, - widget->getBounds().y, - widget->getBounds().x2()-1, - widget->getBounds().y2()-1, PART_SEPARATOR_HORZ); - } + if (widget->getAlign() & JI_HORIZONTAL) + draw_part_as_hline(g, bounds, PART_SEPARATOR_HORZ); - if (widget->getAlign() & JI_VERTICAL) { - draw_part_as_vline(ji_screen, - widget->getBounds().x, - widget->getBounds().y, - widget->getBounds().x2()-1, - widget->getBounds().y2()-1, PART_SEPARATOR_VERT); - } + if (widget->getAlign() & JI_VERTICAL) + draw_part_as_vline(g, bounds, PART_SEPARATOR_VERT); // text if (widget->hasText()) { int h = widget->getTextHeight(); - Rect r(Point(x1+h/2, y1-h/2), - Point(x2+1-h, y2+1+h)); + Rect r( + Point( + bounds.x + widget->border_width.l/2 + h/2, + bounds.y + widget->border_width.t/2 - h/2), + Point( + bounds.x2() - widget->border_width.r/2 - h, + bounds.y2() - widget->border_width.b/2 + h)); - drawTextString(g, NULL, getColor(ThemeColor::Selected), BGCOLOR, false, widget, r, 0); + drawTextString(g, NULL, + getColor(ThemeColor::Selected), BGCOLOR, false, + widget, r, 0); } } @@ -1460,19 +1400,20 @@ static bool my_add_clip_rect(BITMAP *bitmap, int x1, int y1, int x2, int y2) void SkinTheme::paintSlider(PaintEvent& ev) { - Slider* widget = static_cast(ev.getSource()); Graphics* g = ev.getGraphics(); + Slider* widget = static_cast(ev.getSource()); + Rect bounds = widget->getClientBounds(); int min, max, value; char buf[256]; // Outside borders ui::Color bgcolor = widget->getBgColor(); if (!is_transparent(bgcolor)) - jdraw_rectfill(widget->getBounds(), bgcolor); + g->fillRect(bgcolor, bounds); widget->getSliderThemeInfo(&min, &max, &value); - Rect rc(widget->getClientBounds().shrink(widget->getBorder())); + Rect rc(Rect(bounds).shrink(widget->getBorder())); int x; if (min != max) x = rc.x + rc.w * (value-min) / (max-min); @@ -1574,35 +1515,30 @@ void SkinTheme::paintSlider(PaintEvent& ev) void SkinTheme::paintComboBoxEntry(ui::PaintEvent& ev) { + Graphics* g = ev.getGraphics(); Entry* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); bool password = widget->isPassword(); int scroll, caret, state, selbeg, selend; const char *text = widget->getText().c_str(); int c, ch, x, y, w; - int x1, y1, x2, y2; int caret_x; widget->getEntryThemeInfo(&scroll, &caret, &state, &selbeg, &selend); // Outside borders - jdraw_rectfill(widget->getBounds(), BGCOLOR); - - // Main pos - x1 = widget->getBounds().x; - y1 = widget->getBounds().y; - x2 = widget->getBounds().x2()-1; - y2 = widget->getBounds().y2()-1; + g->fillRect(BGCOLOR, bounds); ui::Color fg, bg = getColor(ThemeColor::Background); - draw_bounds_nw(ji_screen, - x1, y1, x2, y2, - widget->hasFocus() ? PART_SUNKEN2_FOCUSED_NW: - PART_SUNKEN2_NORMAL_NW, bg); + draw_bounds_nw(g, bounds, + widget->hasFocus() ? + PART_SUNKEN2_FOCUSED_NW: + PART_SUNKEN2_NORMAL_NW, bg); // Draw the text - x = widget->getBounds().x + widget->border_width.l; - y = widget->getBounds().y + widget->getBounds().h/2 - widget->getTextHeight()/2; + x = bounds.x + widget->border_width.l; + y = bounds.y + bounds.h/2 - widget->getTextHeight()/2; for (c=scroll; ugetat(text, c); c++) { ch = password ? '*': ugetat(text, c); @@ -1626,29 +1562,24 @@ void SkinTheme::paintComboBoxEntry(ui::PaintEvent& ev) fg = getColor(ThemeColor::Disabled); } - w = CHARACTER_LENGTH(widget->getFont(), ch); - if (x+w > widget->getBounds().x2()-3) + w = g->measureChar(ch).w; + if (x+w > bounds.x2()-3) return; caret_x = x; - ji_font_set_aa_mode(widget->getFont(), - to_system(is_transparent(bg) ? getColor(ThemeColor::Background): - bg)); - widget->getFont()->vtable->render_char(widget->getFont(), ch, - to_system(fg), - to_system(bg), ji_screen, x, y); + g->drawChar(ch, fg, bg, x, y); x += w; // Caret if ((c == caret) && (state) && (widget->hasFocus())) - draw_entry_caret(widget, caret_x, y); + drawEntryCaret(g, widget, caret_x, y); } // Draw the caret if it is next of the last character if ((c == caret) && (state) && (widget->hasFocus()) && (widget->isEnabled())) { - draw_entry_caret(widget, x, y); + drawEntryCaret(g, widget, x, y); } } @@ -1695,23 +1626,27 @@ void SkinTheme::paintComboBoxButton(PaintEvent& ev) void SkinTheme::paintTextBox(ui::PaintEvent& ev) { + Graphics* g = ev.getGraphics(); Widget* widget = static_cast(ev.getSource()); - drawTextBox(ji_screen, widget, NULL, NULL, - getColor(ThemeColor::TextBoxFace), - getColor(ThemeColor::TextBoxText)); + + drawTextBox(g, widget, NULL, NULL, + getColor(ThemeColor::TextBoxFace), + getColor(ThemeColor::TextBoxText)); } void SkinTheme::paintView(PaintEvent& ev) { Graphics* g = ev.getGraphics(); View* widget = static_cast(ev.getSource()); + gfx::Rect bounds = widget->getClientBounds(); - g->fillRect(BGCOLOR, widget->getClientBounds()); + g->fillRect(BGCOLOR, bounds); - draw_bounds_nw(g, widget->getClientBounds(), - widget->hasFocus() ? PART_SUNKEN_FOCUSED_NW: - PART_SUNKEN_NORMAL_NW, - getColor(ThemeColor::Background)); + draw_bounds_nw(g, bounds, + (widget->hasFocus() ? + PART_SUNKEN_FOCUSED_NW: + PART_SUNKEN_NORMAL_NW), + getColor(ThemeColor::Background)); } void SkinTheme::paintViewScrollbar(PaintEvent& ev) @@ -1886,74 +1821,6 @@ ui::Color SkinTheme::getWidgetBgColor(Widget* widget) getColor(ThemeColor::Face))); } -void SkinTheme::drawTextStringDeprecated(const char* t, ui::Color fg_color, ui::Color bg_color, - bool fill_bg, Widget* widget, const Rect& rect, - int selected_offset) -{ - if (t || widget->hasText()) { - int x, y, w, h; - - if (!t) { - t = widget->getText().c_str(); - w = widget->getTextWidth(); - } - else { - w = ji_font_text_len(widget->getFont(), t); - } - h = widget->getTextHeight(); - - /* horizontally text alignment */ - - if (widget->getAlign() & JI_RIGHT) - x = rect.x2() - w; - else if (widget->getAlign() & JI_CENTER) - x = rect.x + rect.w/2 - w/2; - else - x = rect.x; - - /* vertically text alignment */ - - if (widget->getAlign() & JI_BOTTOM) - y = rect.y2() - h; - else if (widget->getAlign() & JI_MIDDLE) - y = rect.y + rect.h/2 - h/2; - else - y = rect.y; - - if (widget->isSelected()) { - x += selected_offset; - y += selected_offset; - } - - /* background */ - if (ui::geta(bg_color) > 0) { - if (!widget->isEnabled()) - rectfill(ji_screen, x, y, x+w-1+jguiscale(), y+h-1+jguiscale(), to_system(bg_color)); - else - rectfill(ji_screen, x, y, x+w-1, y+h-1, to_system(bg_color)); - } - - /* text */ - if (!widget->isEnabled()) { - // TODO avoid this - if (fill_bg) // Only to draw the background - jdraw_text(ji_screen, widget->getFont(), t, x, y, ColorNone, bg_color, fill_bg, jguiscale()); - - // Draw white part - jdraw_text(ji_screen, widget->getFont(), t, x+jguiscale(), y+jguiscale(), - getColor(ThemeColor::Background), bg_color, fill_bg, jguiscale()); - - if (fill_bg) - fill_bg = false; - } - - jdraw_text(ji_screen, widget->getFont(), t, x, y, - (!widget->isEnabled() ? getColor(ThemeColor::Disabled): - (is_transparent(fg_color) ? getColor(ThemeColor::Text): fg_color)), - bg_color, fill_bg, jguiscale()); - } -} - void SkinTheme::drawTextString(Graphics* g, const char *t, ui::Color fg_color, ui::Color bg_color, bool fill_bg, Widget* widget, const Rect& rc, int selected_offset) @@ -2001,7 +1868,9 @@ void SkinTheme::drawTextString(Graphics* g, const char *t, ui::Color fg_color, u // Text Rect textWrap = textrc.createIntersect( - Rect(widget->getClientBounds()).shrink(widget->getBorder())); + // TODO add ui::Widget::getPadding() property + // Rect(widget->getClientBounds()).shrink(widget->getBorder())); + widget->getClientBounds()); if (IntersectClip clip = IntersectClip(g, textWrap)) { if (!widget->isEnabled()) { @@ -2027,12 +1896,13 @@ void SkinTheme::drawTextString(Graphics* g, const char *t, ui::Color fg_color, u } } -void SkinTheme::draw_entry_caret(Entry* widget, int x, int y) +void SkinTheme::drawEntryCaret(ui::Graphics* g, Entry* widget, int x, int y) { + ui::Color color = getColor(ThemeColor::Text); int h = widget->getTextHeight(); - vline(ji_screen, x, y-1, y+h, to_system(getColor(ThemeColor::Text))); - vline(ji_screen, x+1, y-1, y+h, to_system(getColor(ThemeColor::Text))); + for (int u=x; udrawVLine(color, u, y-1, h+2); } BITMAP* SkinTheme::get_toolicon(const char* tool_id) const @@ -2044,67 +1914,6 @@ BITMAP* SkinTheme::get_toolicon(const char* tool_id) const return NULL; } -void SkinTheme::draw_bounds_template(BITMAP* bmp, int x1, int y1, int x2, int y2, - int nw, int n, int ne, int e, int se, int s, int sw, int w) -{ - int x, y; - int cx1, cy1, cx2, cy2; - get_clip_rect(bmp, &cx1, &cy1, &cx2, &cy2); - - /* top */ - - draw_trans_sprite(bmp, m_part[nw], x1, y1); - - if (my_add_clip_rect(bmp, - x1+m_part[nw]->w, y1, - x2-m_part[ne]->w, y2)) { - for (x = x1+m_part[nw]->w; - x <= x2-m_part[ne]->w; - x += m_part[n]->w) { - draw_trans_sprite(bmp, m_part[n], x, y1); - } - } - set_clip_rect(bmp, cx1, cy1, cx2, cy2); - - draw_trans_sprite(bmp, m_part[ne], x2-m_part[ne]->w+1, y1); - - /* bottom */ - - draw_trans_sprite(bmp, m_part[sw], x1, y2-m_part[sw]->h+1); - - if (my_add_clip_rect(bmp, - x1+m_part[sw]->w, y1, - x2-m_part[se]->w, y2)) { - for (x = x1+m_part[sw]->w; - x <= x2-m_part[se]->w; - x += m_part[s]->w) { - draw_trans_sprite(bmp, m_part[s], x, y2-m_part[s]->h+1); - } - } - set_clip_rect(bmp, cx1, cy1, cx2, cy2); - - draw_trans_sprite(bmp, m_part[se], x2-m_part[se]->w+1, y2-m_part[se]->h+1); - - if (my_add_clip_rect(bmp, - x1, y1+m_part[nw]->h, - x2, y2-m_part[sw]->h)) { - /* left */ - for (y = y1+m_part[nw]->h; - y <= y2-m_part[sw]->h; - y += m_part[w]->h) { - draw_trans_sprite(bmp, m_part[w], x1, y); - } - - /* right */ - for (y = y1+m_part[ne]->h; - y <= y2-m_part[se]->h; - y += m_part[e]->h) { - draw_trans_sprite(bmp, m_part[e], x2-m_part[e]->w+1, y); - } - } - set_clip_rect(bmp, cx1, cy1, cx2, cy2); -} - void SkinTheme::draw_bounds_template(Graphics* g, const Rect& rc, int nw, int n, int ne, int e, int se, int s, int sw, int w) { @@ -2204,24 +2013,6 @@ void SkinTheme::draw_bounds_array(ui::Graphics* g, const gfx::Rect& rc, int part se, s, sw, w); } -void SkinTheme::draw_bounds_nw(BITMAP* bmp, int x1, int y1, int x2, int y2, int nw, ui::Color bg) -{ - set_alpha_blender(); - draw_bounds_template(bmp, x1, y1, x2, y2, - nw+0, nw+1, nw+2, nw+3, - nw+4, nw+5, nw+6, nw+7); - - // Center - if (!is_transparent(bg)) { - x1 += m_part[nw+7]->w; - y1 += m_part[nw+1]->h; - x2 -= m_part[nw+3]->w; - y2 -= m_part[nw+5]->h; - - rectfill(bmp, x1, y1, x2, y2, to_system(bg)); - } -} - void SkinTheme::draw_bounds_nw(Graphics* g, const Rect& rc, int nw, ui::Color bg) { draw_bounds_template(g, rc, @@ -2269,58 +2060,10 @@ void SkinTheme::draw_bounds_nw2(Graphics* g, const Rect& rc, int x_mid, int nw1, draw_bounds_nw(g, rc, nw2, bg2); } -void SkinTheme::draw_part_as_hline(BITMAP* bmp, int x1, int y1, int x2, int y2, int part) -{ - int x; - - set_alpha_blender(); - - for (x = x1; - x <= x2-m_part[part]->w; - x += m_part[part]->w) { - draw_trans_sprite(bmp, m_part[part], x, y1); - } - - if (x <= x2) { - int cx1, cy1, cx2, cy2; - get_clip_rect(bmp, &cx1, &cy1, &cx2, &cy2); - - if (my_add_clip_rect(bmp, x, y1, x2, y1+m_part[part]->h-1)) - draw_trans_sprite(bmp, m_part[part], x, y1); - - set_clip_rect(bmp, cx1, cy1, cx2, cy2); - } -} - -void SkinTheme::draw_part_as_vline(BITMAP* bmp, int x1, int y1, int x2, int y2, int part) -{ - int y; - - set_alpha_blender(); - - for (y = y1; - y <= y2-m_part[part]->h; - y += m_part[part]->h) { - draw_trans_sprite(bmp, m_part[part], x1, y); - } - - if (y <= y2) { - int cx1, cy1, cx2, cy2; - get_clip_rect(bmp, &cx1, &cy1, &cx2, &cy2); - - if (my_add_clip_rect(bmp, x1, y, x1+m_part[part]->w-1, y2)) - draw_trans_sprite(bmp, m_part[part], x1, y); - - set_clip_rect(bmp, cx1, cy1, cx2, cy2); - } -} - void SkinTheme::draw_part_as_hline(ui::Graphics* g, const gfx::Rect& rc, int part) { int x; - set_alpha_blender(); - for (x = rc.x; x < rc.x2()-m_part[part]->w; x += m_part[part]->w) { @@ -2351,23 +2094,6 @@ void SkinTheme::draw_part_as_vline(ui::Graphics* g, const gfx::Rect& rc, int par } } -void SkinTheme::drawProgressBar(BITMAP* bmp, int x1, int y1, int x2, int y2, float progress) -{ - int w = x2 - x1 + 1; - int u = (int)((float)(w-2)*progress); - u = MID(0, u, w-2); - - rect(bmp, x1, y1, x2, y2, ui::to_system(getColor(ThemeColor::Text))); - - if (u > 0) - rectfill(bmp, x1+1, y1+1, x1+u, y2-1, - ui::to_system(getColor(ThemeColor::Selected))); - - if (1+u < w-2) - rectfill(bmp, x1+u+1, y1+1, x2-1, y2-1, - ui::to_system(getColor(ThemeColor::Background))); -} - void SkinTheme::paintProgressBar(ui::Graphics* g, const gfx::Rect& rc0, float progress) { g->drawRect(getColor(ThemeColor::Text), rc0); diff --git a/src/app/ui/skin/skin_theme.h b/src/app/ui/skin/skin_theme.h index 7c762b560..0a3bb7891 100644 --- a/src/app/ui/skin/skin_theme.h +++ b/src/app/ui/skin/skin_theme.h @@ -163,23 +163,13 @@ namespace app { BITMAP* get_toolicon(const char* tool_id) const; gfx::Size get_part_size(int part_i) const; - // helper functions to draw bounds/hlines with sheet parts + // Helper functions to draw bounds/hlines with sheet parts void draw_bounds_array(ui::Graphics* g, const gfx::Rect& rc, int parts[8]); - void draw_bounds_nw(BITMAP* bmp, int x1, int y1, int x2, int y2, int nw, ui::Color bg = ui::ColorNone); void draw_bounds_nw(ui::Graphics* g, const gfx::Rect& rc, int nw, ui::Color bg = ui::ColorNone); void draw_bounds_nw(ui::Graphics* g, const gfx::Rect& rc, const SkinPartPtr skinPart, ui::Color bg = ui::ColorNone); void draw_bounds_nw2(ui::Graphics* g, const gfx::Rect& rc, int x_mid, int nw1, int nw2, ui::Color bg1, ui::Color bg2); - void draw_part_as_hline(BITMAP* bmp, int x1, int y1, int x2, int y2, int part); - void draw_part_as_vline(BITMAP* bmp, int x1, int y1, int x2, int y2, int part); void draw_part_as_hline(ui::Graphics* g, const gfx::Rect& rc, int part); void draw_part_as_vline(ui::Graphics* g, const gfx::Rect& rc, int part); - - // Wrapper to use the new "Rect" class (x, y, w, h) - void draw_bounds_nw(BITMAP* bmp, const gfx::Rect& rc, int nw, ui::Color bg) { - draw_bounds_nw(bmp, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1, nw, bg); - } - - void drawProgressBar(BITMAP* bmp, int x1, int y1, int x2, int y2, float progress); void paintProgressBar(ui::Graphics* g, const gfx::Rect& rc, float progress); Style* getStyle(const std::string& id) { @@ -198,8 +188,6 @@ namespace app { void onRegenerate() OVERRIDE; private: - void draw_bounds_template(BITMAP* bmp, int x1, int y1, int x2, int y2, - int nw, int n, int ne, int e, int se, int s, int sw, int w); void draw_bounds_template(ui::Graphics* g, const gfx::Rect& rc, int nw, int n, int ne, int e, int se, int s, int sw, int w); void draw_bounds_template(ui::Graphics* g, const gfx::Rect& rc, const SkinPartPtr& skinPart); @@ -210,13 +198,10 @@ namespace app { BITMAP* cropPartFromSheet(BITMAP* bmp, int x, int y, int w, int h); ui::Color getWidgetBgColor(ui::Widget* widget); - void drawTextStringDeprecated(const char* t, ui::Color fg_color, ui::Color bg_color, - bool fill_bg, ui::Widget* widget, const gfx::Rect& rect, - int selected_offset); void drawTextString(ui::Graphics* g, const char *t, ui::Color fg_color, ui::Color bg_color, bool fill_bg, ui::Widget* widget, const gfx::Rect& rc, int selected_offset); - void draw_entry_caret(ui::Entry* widget, int x, int y); + void drawEntryCaret(ui::Graphics* g, ui::Entry* widget, int x, int y); void paintIcon(ui::Widget* widget, ui::Graphics* g, ui::IButtonIcon* iconInterface, int x, int y); diff --git a/src/ui/button.cpp b/src/ui/button.cpp index af38244ae..e12ec5bfd 100644 --- a/src/ui/button.cpp +++ b/src/ui/button.cpp @@ -275,10 +275,10 @@ bool ButtonBase::onProcessMessage(Message* msg) void ButtonBase::onPreferredSize(PreferredSizeEvent& ev) { gfx::Rect box; - jwidget_get_texticon_info(this, &box, NULL, NULL, - m_iconInterface ? m_iconInterface->getIconAlign(): 0, - m_iconInterface ? m_iconInterface->getWidth(): 0, - m_iconInterface ? m_iconInterface->getHeight(): 0); + getTextIconInfo(&box, NULL, NULL, + m_iconInterface ? m_iconInterface->getIconAlign(): 0, + m_iconInterface ? m_iconInterface->getWidth(): 0, + m_iconInterface ? m_iconInterface->getHeight(): 0); ev.setPreferredSize(border_width.l + box.w + border_width.r, border_width.t + box.h + border_width.b); diff --git a/src/ui/draw.cpp b/src/ui/draw.cpp index c6c195f9a..23991faaf 100644 --- a/src/ui/draw.cpp +++ b/src/ui/draw.cpp @@ -27,79 +27,8 @@ namespace ui { using namespace gfx; -void jrectedge(BITMAP *bmp, int x1, int y1, int x2, int y2, - ui::Color c1, ui::Color c2) -{ - hline(bmp, x1, y1, x2-1, to_system(c1)); - hline(bmp, x1+1, y2, x2, to_system(c2)); - vline(bmp, x1, y1+1, y2, to_system(c1)); - vline(bmp, x2, y1, y2-1, to_system(c2)); -} - -void jrectexclude(BITMAP *bmp, int x1, int y1, int x2, int y2, - int ex1, int ey1, int ex2, int ey2, ui::Color color) -{ - if ((ex1 > x2) || (ex2 < x1) || - (ey1 > y2) || (ey2 < y1)) - rectfill(bmp, x1, y1, x2, y2, to_system(color)); - else { - int my1, my2; - - my1 = MAX(y1, ey1); - my2 = MIN(y2, ey2); - - // top - if (y1 < ey1) - rectfill(bmp, x1, y1, x2, ey1-1, to_system(color)); - - // left - if (x1 < ex1) - rectfill(bmp, x1, my1, ex1-1, my2, to_system(color)); - - // right - if (x2 > ex2) - rectfill(bmp, ex2+1, my1, x2, my2, to_system(color)); - - // bottom - if (y2 > ey2) - rectfill(bmp, x1, ey2+1, x2, y2, to_system(color)); - } -} - -void jdraw_rect(const Rect& rc, ui::Color color) -{ - rect(ji_screen, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1, to_system(color)); -} - -void jdraw_rectfill(const Rect& rc, ui::Color color) -{ - rectfill(ji_screen, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1, to_system(color)); -} - -void jdraw_rectedge(const Rect& rc, ui::Color c1, ui::Color c2) -{ - jrectedge(ji_screen, rc.x, rc.y, rc.x+rc.w-1, rc.y+rc.h-1, c1, c2); -} - -void jdraw_rectexclude(const Rect& rc, const Rect& exclude, ui::Color color) -{ - jrectexclude(ji_screen, - rc.x, rc.y, - rc.x+rc.w-1, rc.y+rc.h-1, - exclude.x, exclude.y, - exclude.x+exclude.w-1, exclude.y+exclude.h-1, color); -} - -void jdraw_char(FONT* f, int chr, int x, int y, ui::Color fg, ui::Color bg, bool fill_bg) -{ - SETUP_ANTIALISING(f, bg, fill_bg); - - f->vtable->render_char(f, chr, to_system(fg), - fill_bg ? to_system(bg): -1, ji_screen, x, y); -} - -void jdraw_text(BITMAP* bmp, FONT* font, const char *s, int x, int y, - ui::Color fg_color, ui::Color bg_color, bool fill_bg, int underline_height) +void _draw_text(BITMAP* bmp, FONT* font, const char *s, int x, int y, + ui::Color fg_color, ui::Color bg_color, bool fill_bg, int underline_height) { // original code from allegro/src/guiproc.c char tmp[1024]; @@ -149,7 +78,7 @@ void jdraw_text(BITMAP* bmp, FONT* font, const char *s, int x, int y, } } -void ji_move_region(const Region& region, int dx, int dy) +void _move_region(const Region& region, int dx, int dy) { size_t nrects = region.size(); diff --git a/src/ui/draw.h b/src/ui/draw.h index eee998961..6ee363cfe 100644 --- a/src/ui/draw.h +++ b/src/ui/draw.h @@ -20,22 +20,8 @@ struct BITMAP; namespace ui { - void jrectedge(struct BITMAP *bmp, int x1, int y1, int x2, int y2, - ui::Color c1, ui::Color c2); - void jrectexclude(struct BITMAP *bmp, int x1, int y1, int x2, int y2, - int ex1, int ey1, int ex2, int ey2, ui::Color color); - - void jdraw_rect(const gfx::Rect& rect, ui::Color color); - void jdraw_rectfill(const gfx::Rect& rect, ui::Color color); - void jdraw_rectedge(const gfx::Rect& rect, ui::Color c1, ui::Color c2); - void jdraw_rectexclude(const gfx::Rect& rect, const gfx::Rect& exclude, ui::Color color); - - void jdraw_char(FONT* f, int chr, int x, int y, ui::Color fg, ui::Color bg, bool fill_bg); - void jdraw_text(BITMAP* bmp, FONT* f, const char* text, int x, int y, ui::Color fg, ui::Color bg, bool fill_bg, int underline_height = 1); - - void jdraw_inverted_sprite(struct BITMAP *bmp, struct BITMAP *sprite, int x, int y); - - void ji_move_region(const gfx::Region& region, int dx, int dy); + void _draw_text(BITMAP* bmp, FONT* f, const char* text, int x, int y, ui::Color fg, ui::Color bg, bool fill_bg, int underline_height = 1); + void _move_region(const gfx::Region& region, int dx, int dy); } // namespace ui diff --git a/src/ui/font.cpp b/src/ui/font.cpp index 68ec77a3c..2b0c12435 100644 --- a/src/ui/font.cpp +++ b/src/ui/font.cpp @@ -576,7 +576,6 @@ int ji_font_char_len(FONT* f, int chr) return f->vtable->char_length(f, chr); } -// see jdraw_text int ji_font_text_len(struct FONT* f, const char *s) { int in_pos = 0; @@ -980,7 +979,6 @@ int ji_font_char_len(FONT* f, int chr) return f->vtable->char_length(f, chr); } -// see jdraw_text int ji_font_text_len(struct FONT* f, const char* s) { int in_pos = 0; diff --git a/src/ui/graphics.cpp b/src/ui/graphics.cpp index 354bfcf23..8a8ce6b5b 100644 --- a/src/ui/graphics.cpp +++ b/src/ui/graphics.cpp @@ -18,6 +18,7 @@ #include "ui/theme.h" #include +#include namespace ui { @@ -110,6 +111,18 @@ void Graphics::fillRegion(ui::Color color, const gfx::Region& rgn) fillRect(color, *it); } +void Graphics::fillAreaBetweenRects(ui::Color color, + const gfx::Rect& outer, const gfx::Rect& inner) +{ + if (!outer.intersects(inner)) + fillRect(color, inner); + else { + gfx::Region rgn(outer); + rgn.createSubtraction(rgn, gfx::Region(inner)); + fillRegion(color, rgn); + } +} + void Graphics::drawBitmap(BITMAP* sprite, int x, int y) { draw_sprite(m_bmp, sprite, m_dx+x, m_dy+y); @@ -131,15 +144,20 @@ void Graphics::setFont(FONT* font) m_currentFont = font; } -FONT* Graphics::getFont() +void Graphics::drawChar(int chr, Color fg, Color bg, int x, int y) { - return m_currentFont; + // to_system(is_transparent(bg) ? getColor(ThemeColor::Background): bg)); + ji_font_set_aa_mode(getFont(), bg); + getFont()->vtable->render_char(getFont(), chr, + to_system(fg), + to_system(bg), + m_bmp, m_dx+x, m_dy+y); } void Graphics::drawString(const std::string& str, Color fg, Color bg, bool fillbg, const gfx::Point& pt) { - jdraw_text(m_bmp, m_currentFont, str.c_str(), m_dx+pt.x, m_dy+pt.y, - fg, bg, fillbg, 1 * jguiscale()); + _draw_text(m_bmp, m_currentFont, str.c_str(), m_dx+pt.x, m_dy+pt.y, + fg, bg, fillbg, 1 * jguiscale()); } void Graphics::drawString(const std::string& str, Color fg, Color bg, const gfx::Rect& rc, int align) @@ -147,10 +165,18 @@ void Graphics::drawString(const std::string& str, Color fg, Color bg, const gfx: drawStringAlgorithm(str, fg, bg, rc, align, true); } +gfx::Size Graphics::measureChar(int chr) +{ + return gfx::Size( + getFont()->vtable->char_length(getFont(), chr), + text_height(getFont())); +} + gfx::Size Graphics::measureString(const std::string& str) { - return gfx::Size(ji_font_text_len(m_currentFont, str.c_str()), - text_height(m_currentFont)); + return gfx::Size( + ji_font_text_len(getFont(), str.c_str()), + text_height(getFont())); } gfx::Size Graphics::fitString(const std::string& str, int maxWidth, int align) @@ -233,9 +259,9 @@ gfx::Size Graphics::drawStringAlgorithm(const std::string& str, Color fg, Color textout_ex(m_bmp, m_currentFont, line.c_str(), m_dx+xout, m_dy+pt.y, to_system(fg), to_system(bg)); if (!is_transparent(bg)) - jrectexclude(m_bmp, - m_dx+rc.x, m_dy+pt.y, m_dx+rc.x+rc.w-1, m_dy+pt.y+lineSize.h-1, - m_dx+xout, m_dy+pt.y, m_dx+xout+lineSize.w-1, m_dy+pt.y+lineSize.h-1, bg); + fillAreaBetweenRects(bg, + gfx::Rect(rc.x, pt.y, rc.w, lineSize.h), + gfx::Rect(xout, pt.y, lineSize.w, lineSize.h)); } pt.y += lineSize.h; diff --git a/src/ui/graphics.h b/src/ui/graphics.h index 2157d8224..433c8d052 100644 --- a/src/ui/graphics.h +++ b/src/ui/graphics.h @@ -43,6 +43,8 @@ namespace ui { void drawRect(ui::Color color, const gfx::Rect& rc); void fillRect(ui::Color color, const gfx::Rect& rc); void fillRegion(ui::Color color, const gfx::Region& rgn); + void fillAreaBetweenRects(ui::Color color, + const gfx::Rect& outer, const gfx::Rect& inner); void drawBitmap(BITMAP* sprite, int x, int y); void drawAlphaBitmap(BITMAP* sprite, int x, int y); @@ -54,11 +56,15 @@ namespace ui { // ====================================================================== void setFont(FONT* font); - FONT* getFont(); + FONT* getFont() { + return m_currentFont; + } + void drawChar(int chr, Color fg, Color bg, int x, int y); void drawString(const std::string& str, Color fg, Color bg, bool fillbg, const gfx::Point& pt); void drawString(const std::string& str, Color fg, Color bg, const gfx::Rect& rc, int align); + gfx::Size measureChar(int chr); gfx::Size measureString(const std::string& str); gfx::Size fitString(const std::string& str, int maxWidth, int align); diff --git a/src/ui/image_view.cpp b/src/ui/image_view.cpp index eff06a88b..feb438cbe 100644 --- a/src/ui/image_view.cpp +++ b/src/ui/image_view.cpp @@ -31,8 +31,8 @@ ImageView::ImageView(BITMAP* bmp, int align) void ImageView::onPreferredSize(PreferredSizeEvent& ev) { gfx::Rect box; - jwidget_get_texticon_info(this, &box, NULL, NULL, - getAlign(), m_bmp->w, m_bmp->h); + getTextIconInfo(&box, NULL, NULL, + getAlign(), m_bmp->w, m_bmp->h); ev.setPreferredSize(gfx::Size(border_width.l + box.w + border_width.r, border_width.t + box.h + border_width.b)); @@ -43,14 +43,9 @@ void ImageView::onPaint(PaintEvent& ev) Graphics* g = ev.getGraphics(); gfx::Rect bounds = getClientBounds(); gfx::Rect icon; - jwidget_get_texticon_info(this, NULL, NULL, &icon, - getAlign(), m_bmp->w, m_bmp->h); + getTextIconInfo(NULL, NULL, &icon, getAlign(), m_bmp->w, m_bmp->h); g->fillRect(getBgColor(), bounds); - - icon.x -= getBounds().x; - icon.y -= getBounds().y; - g->blit(m_bmp, 0, 0, icon.x, icon.y, icon.w, icon.h); } diff --git a/src/ui/intern.h b/src/ui/intern.h index 62395c265..731991101 100644 --- a/src/ui/intern.h +++ b/src/ui/intern.h @@ -16,6 +16,7 @@ struct BITMAP; namespace ui { + class Graphics; class Widget; class Window; @@ -29,7 +30,7 @@ namespace ui { // theme.cpp - void drawTextBox(BITMAP* bmp, Widget* textbox, + void drawTextBox(Graphics* g, Widget* textbox, int* w, int* h, ui::Color bg, ui::Color fg); // fontbmp.c diff --git a/src/ui/listitem.cpp b/src/ui/listitem.cpp index dc9a86cf4..6115cea36 100644 --- a/src/ui/listitem.cpp +++ b/src/ui/listitem.cpp @@ -23,6 +23,7 @@ using namespace gfx; ListItem::ListItem(const base::string& text) : Widget(kListItemWidget) { + setDoubleBuffered(true); setAlign(JI_LEFT | JI_MIDDLE); setText(text); initTheme(); diff --git a/src/ui/separator.cpp b/src/ui/separator.cpp index 947263966..aaf652bec 100644 --- a/src/ui/separator.cpp +++ b/src/ui/separator.cpp @@ -23,7 +23,9 @@ Separator::Separator(const base::string& text, int align) : Widget(kSeparatorWidget) { setAlign(align); - setText(text); + if (!text.empty()) + setText(text); + initTheme(); } diff --git a/src/ui/theme.cpp b/src/ui/theme.cpp index ce4b8cc2e..5aa90d88b 100644 --- a/src/ui/theme.cpp +++ b/src/ui/theme.cpp @@ -26,9 +26,6 @@ namespace ui { static Theme* current_theme = NULL; -static void draw_text(BITMAP *bmp, FONT *f, const char* text, int x, int y, - Color fg_color, Color bg_color, bool fill_bg); - Theme::Theme() { this->name = "Theme"; @@ -95,8 +92,8 @@ BITMAP* ji_apply_guiscale(BITMAP* original) return original; } -void drawTextBox(BITMAP* bmp, Widget* widget, - int* w, int* h, Color bg, Color fg) +void drawTextBox(Graphics* g, Widget* widget, + int* w, int* h, Color bg, Color fg) { View* view = View::getView(widget); char* text = const_cast(widget->getText().c_str()); @@ -111,7 +108,9 @@ void drawTextBox(BITMAP* bmp, Widget* widget, int width; if (view) { - gfx::Rect vp = view->getViewportBounds(); + gfx::Rect vp = view->getViewportBounds() + .offset(-view->getViewport()->getBounds().getOrigin()); + x1 = vp.x; y1 = vp.y; viewport_w = vp.w; @@ -119,22 +118,22 @@ void drawTextBox(BITMAP* bmp, Widget* widget, scroll = view->getViewScroll(); } else { - x1 = widget->getBounds().x + widget->border_width.l; - y1 = widget->getBounds().y + widget->border_width.t; - viewport_w = widget->getBounds().w - widget->border_width.l - widget->border_width.r; - viewport_h = widget->getBounds().h - widget->border_width.t - widget->border_width.b; + x1 = widget->getClientBounds().x + widget->border_width.l; + y1 = widget->getClientBounds().y + widget->border_width.t; + viewport_w = widget->getClientBounds().w - widget->border_width.l - widget->border_width.r; + viewport_h = widget->getClientBounds().h - widget->border_width.t - widget->border_width.b; scroll.x = scroll.y = 0; } - x2 = x1+viewport_w-1; - y2 = y1+viewport_h-1; + x2 = x1 + viewport_w; + y2 = y1 + viewport_h; chr = 0; - /* without word-wrap */ + // Without word-wrap if (!(widget->getAlign() & JI_WORDWRAP)) { - width = widget->getBounds().w; + width = widget->getClientBounds().w; } - /* with word-wrap */ + // With word-wrap else { if (w) { width = *w; @@ -158,7 +157,7 @@ void drawTextBox(BITMAP* bmp, Widget* widget, } } - /* draw line-by-line */ + // Draw line-by-line y = y1 - scroll.y; for (beg=end=text; end; ) { x = x1 - scroll.x; @@ -210,25 +209,23 @@ void drawTextBox(BITMAP* bmp, Widget* widget, len = text_length(font, beg); - /* render the text in the "bmp" */ - if (bmp) { + // Render the text + if (g) { int xout; if (widget->getAlign() & JI_CENTER) xout = x + width/2 - len/2; else if (widget->getAlign() & JI_RIGHT) xout = x + width - len; - else /* left */ + else // Left align xout = x; - draw_text(bmp, font, beg, xout, y, fg, bg, true); - - jrectexclude(bmp, - x1, y, x2, y+textheight-1, - xout, y, xout+len-1, y+textheight-1, bg); + g->drawString(beg, fg, bg, true, gfx::Point(xout, y)); + g->fillAreaBetweenRects(bg, + gfx::Rect(x1, y, x2 - x1, textheight), + gfx::Rect(xout, y, len, textheight)); } - /* width */ if (w) *w = MAX(*w, len); @@ -240,26 +237,15 @@ void drawTextBox(BITMAP* bmp, Widget* widget, } } - /* height */ if (h) - *h = (y-y1+scroll.y); + *h = (y - y1 + scroll.y); if (w) *w += widget->border_width.l + widget->border_width.r; if (h) *h += widget->border_width.t + widget->border_width.b; // Fill bottom area - if (bmp) { - if (y <= y2) - rectfill(bmp, x1, y, x2, y2, to_system(bg)); - } -} - -static void draw_text(BITMAP *bmp, FONT *f, const char *text, int x, int y, - Color fg_color, Color bg_color, bool fill_bg) -{ - // TODO Optional anti-aliased textout - ji_font_set_aa_mode(f, to_system(bg_color)); - textout_ex(bmp, f, text, x, y, to_system(fg_color), (fill_bg ? to_system(bg_color): -1)); + if (g && y < y2) + g->fillRect(bg, gfx::Rect(x1, y, x2 - x1, y2 - y)); } } // namespace ui diff --git a/src/ui/widget.cpp b/src/ui/widget.cpp index acb84156c..264568fbb 100644 --- a/src/ui/widget.cpp +++ b/src/ui/widget.cpp @@ -742,11 +742,11 @@ int Widget::getTextHeight() const return text_height(getFont()); } -void jwidget_get_texticon_info(Widget* widget, - gfx::Rect* box, - gfx::Rect* text, - gfx::Rect* icon, - int icon_align, int icon_w, int icon_h) +void Widget::getTextIconInfo( + gfx::Rect* box, + gfx::Rect* text, + gfx::Rect* icon, + int icon_align, int icon_w, int icon_h) { #define SETRECT(r) \ if (r) { \ @@ -756,17 +756,16 @@ void jwidget_get_texticon_info(Widget* widget, r->h = r##_h; \ } + gfx::Rect bounds = getClientBounds(); int box_x, box_y, box_w, box_h, icon_x, icon_y; int text_x, text_y, text_w, text_h; - ASSERT_VALID_WIDGET(widget); - text_x = text_y = 0; // Size of the text - if (widget->hasText()) { - text_w = widget->getTextWidth(); - text_h = widget->getTextHeight(); + if (hasText()) { + text_w = getTextWidth(); + text_h = getTextHeight(); } else { text_w = text_h = 0; @@ -781,32 +780,32 @@ void jwidget_get_texticon_info(Widget* widget, /* with the icon in the top or bottom */ else { box_w = MAX(icon_w, text_w); - box_h = icon_h + (widget->hasText() ? widget->child_spacing: 0) + text_h; + box_h = icon_h + (hasText() ? child_spacing: 0) + text_h; } } /* with the icon in left or right that doesn't care by now */ else { - box_w = icon_w + (widget->hasText() ? widget->child_spacing: 0) + text_w; + box_w = icon_w + (hasText() ? child_spacing: 0) + text_w; box_h = MAX(icon_h, text_h); } /* box position */ - if (widget->getAlign() & JI_RIGHT) - box_x = widget->getBounds().x2() - box_w - widget->border_width.r; - else if (widget->getAlign() & JI_CENTER) - box_x = (widget->getBounds().x+widget->getBounds().x2())/2 - box_w/2; + if (getAlign() & JI_RIGHT) + box_x = bounds.x2() - box_w - border_width.r; + else if (getAlign() & JI_CENTER) + box_x = (bounds.x+bounds.x2())/2 - box_w/2; else - box_x = widget->getBounds().x + widget->border_width.l; + box_x = bounds.x + border_width.l; - if (widget->getAlign() & JI_BOTTOM) - box_y = widget->getBounds().y2() - box_h - widget->border_width.b; - else if (widget->getAlign() & JI_MIDDLE) - box_y = (widget->getBounds().y+widget->getBounds().y2())/2 - box_h/2; + if (getAlign() & JI_BOTTOM) + box_y = bounds.y2() - box_h - border_width.b; + else if (getAlign() & JI_MIDDLE) + box_y = (bounds.y+bounds.y2())/2 - box_h/2; else - box_y = widget->getBounds().y + widget->border_width.t; + box_y = bounds.y + border_width.t; // With text - if (widget->hasText()) { + if (hasText()) { // Text/icon X position if (icon_align & JI_RIGHT) { text_x = box_x; @@ -962,7 +961,7 @@ void Widget::scrollRegion(const Region& region, int dx, int dy) // Move screen pixels jmouse_hide(); - ji_move_region(reg2, dx, dy); + ui::_move_region(reg2, dx, dy); jmouse_show(); reg2.offset(dx, dy); @@ -1004,7 +1003,6 @@ GraphicsPtr Widget::getGraphics(const gfx::Rect& clip) graphics.reset(new Graphics(bmp, -clip.x, -clip.y), DeleteGraphicsAndBitmap(clip, bmp)); - } // Paint directly on ji_screen (in this case "ji_screen" can be // the screen or a memory bitmap). diff --git a/src/ui/widget.h b/src/ui/widget.h index bf639d3eb..7ef6a118c 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -45,12 +45,6 @@ namespace ui { // Position and geometry - void jwidget_get_texticon_info(Widget* widget, - gfx::Rect* box, - gfx::Rect* text, - gfx::Rect* icon, - int icon_align, int icon_w, int icon_h); - void jwidget_set_min_size(Widget* widget, int w, int h); void jwidget_set_max_size(Widget* widget, int w, int h); @@ -292,6 +286,12 @@ namespace ui { return gfx::Rect(rc).offset(-m_bounds.x, -m_bounds.y); } + void getTextIconInfo( + gfx::Rect* box, + gfx::Rect* text = NULL, + gfx::Rect* icon = NULL, + int icon_align = 0, int icon_w = 0, int icon_h = 0); + // =============================================================== // REFRESH ISSUES // =============================================================== diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 0d6ea8f04..21d6df415 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -595,9 +595,9 @@ void Window::moveWindow(const gfx::Rect& rect, bool use_blit) set_clip_rect(ji_screen, man_pos.x, man_pos.y, man_pos.x2()-1, man_pos.y2()-1); - ji_move_region(moveable_region, - getBounds().x - old_pos.x, - getBounds().y - old_pos.y); + ui::_move_region(moveable_region, + getBounds().x - old_pos.x, + getBounds().y - old_pos.y); set_clip_rect(ji_screen, 0, 0, JI_SCREEN_W-1, JI_SCREEN_H-1); jmouse_show(); }