aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx')
-rw-r--r--engines/sci/gfx/gfx_gui.cpp8
-rw-r--r--engines/sci/gfx/gfx_state_internal.h32
-rw-r--r--engines/sci/gfx/gfx_widgets.cpp363
3 files changed, 187 insertions, 216 deletions
diff --git a/engines/sci/gfx/gfx_gui.cpp b/engines/sci/gfx/gfx_gui.cpp
index 570d6eb426..a63e873422 100644
--- a/engines/sci/gfx/gfx_gui.cpp
+++ b/engines/sci/gfx/gfx_gui.cpp
@@ -39,10 +39,10 @@ namespace Sci {
#define SCI_SPECIAL_CHAR_ARROW_DOWN 0x19
static void clear_titlebar(GfxPort *titlebar) {
- if (titlebar->contents) {
- delete titlebar->contents;
- titlebar->contents = NULL;
- titlebar->nextpp = &(titlebar->contents);
+ if (titlebar->_contents) {
+ delete titlebar->_contents;
+ titlebar->_contents = NULL;
+ titlebar->_nextpp = &(titlebar->_contents);
}
}
diff --git a/engines/sci/gfx/gfx_state_internal.h b/engines/sci/gfx/gfx_state_internal.h
index f4cd610292..85c1eabe7a 100644
--- a/engines/sci/gfx/gfx_state_internal.h
+++ b/engines/sci/gfx/gfx_state_internal.h
@@ -82,10 +82,10 @@ struct GfxPort;
typedef int gfxw_point_op(GfxWidget *, Common::Point);
typedef int gfxw_op(GfxWidget *);
-typedef int gfxw_op_int(GfxWidget *, int);
typedef int gfxw_bin_op(GfxWidget *, GfxWidget *);
struct GfxWidget {
+public:
int _magic; /* Extra check after typecasting */
int _serial; /* Serial number */
int _flags; /* Widget flags */
@@ -134,7 +134,7 @@ public:
*
* @param indentation Number of double spaces to indent
*/
- gfxw_op_int *print;
+ virtual void print(int indentation) const;
/**
* Compares two comparable widgets by their screen position.
@@ -191,6 +191,10 @@ public:
* It also makes sure that dirty rectangles are passed to parent containers.
*/
virtual int setVisual(GfxVisual *);
+
+//protected:
+ void printIntern(int indentation) const;
+
};
@@ -199,7 +203,9 @@ struct GfxBox : public GfxWidget {
gfx_color_t _color1, _color2;
gfx_box_shade_t _shadeType;
+public:
GfxBox(gfx_state_t *state, rect_t area, gfx_color_t color1, gfx_color_t color2, gfx_box_shade_t shade_type);
+ virtual void print(int indentation) const;
};
@@ -209,6 +215,7 @@ struct GfxPrimitive : public GfxWidget {
gfx_line_mode_t _lineMode;
gfx_line_style_t _lineStyle;
+public:
GfxPrimitive(rect_t area, gfx_color_t color, gfx_line_mode_t mode,
gfx_line_style_t style, gfxw_widget_type_t type);
};
@@ -223,8 +230,10 @@ struct GfxView : public GfxWidget {
int _view, _loop, _cel;
int _palette;
+public:
GfxView(gfx_state_t *state, Common::Point pos, int view_nr, int loop, int cel, int palette, int priority, int control,
gfx_alignment_t halign, gfx_alignment_t valign, int flags);
+ virtual void print(int indentation) const;
};
#define GFXW_IS_DYN_VIEW(widget) ((widget)->_type == GFXW_DYN_VIEW || (widget)->_type == GFXW_PIC_VIEW)
@@ -237,8 +246,11 @@ struct GfxDynView : public GfxView {
int sequence; /* Sequence number: For sorting */
int force_precedence; /* Precedence enforcement variable for sorting- defaults to 0 */
+public:
GfxDynView(gfx_state_t *state, Common::Point pos, int z, int view, int loop, int cel, int palette, int priority, int control,
gfx_alignment_t halign, gfx_alignment_t valign, int sequence);
+
+ virtual void print(int indentation) const;
};
@@ -254,10 +266,13 @@ struct GfxText : public GfxWidget {
int width, height; /* Real text width and height */
gfx_text_handle_t *text_handle;
+public:
GfxText(gfx_state_t *state, rect_t area, int font, const char *text, gfx_alignment_t halign,
gfx_alignment_t valign, gfx_color_t color1, gfx_color_t color2, gfx_color_t bgcolor, int text_flags);
~GfxText();
+
+ virtual void print(int indentation) const;
};
@@ -270,9 +285,9 @@ typedef int gfxw_rect_op(GfxContainer *, rect_t, int);
struct GfxContainer : public GfxWidget {
rect_t zone; /* The writeable zone (absolute) for contained objects */
- gfx_dirty_rect_t *dirty; /* List of dirty rectangles */
- GfxWidget *contents;
- GfxWidget **nextpp; /* Pointer to the 'next' pointer in the last entry in contents */
+ gfx_dirty_rect_t *_dirty; /* List of dirty rectangles */
+ GfxWidget *_contents;
+ GfxWidget **_nextpp; /* Pointer to the 'next' pointer in the last entry in contents */
public:
// TODO: Replace the following with virtual methods
@@ -282,10 +297,12 @@ public:
gfxw_rect_op *add_dirty_rel; /* Add a relative dirty rectangle */
gfxw_container_op *add; /* Append widget to an appropriate position (for view and control lists) */
+public:
// FIXME: This should be a virtual base class, mark it so somehow?
GfxContainer(rect_t area, gfxw_widget_type_t type);
~GfxContainer();
+ virtual void print(int indentation) const;
virtual int setVisual(GfxVisual *);
};
@@ -297,7 +314,10 @@ public:
#define GFXW_IS_SORTED_LIST(widget) ((widget)->_type == GFXW_SORTED_LIST)
struct GfxList : public GfxContainer {
+public:
GfxList(rect_t area, bool sorted);
+
+ virtual void print(int indentation) const;
};
#define GFXW_IS_VISUAL(widget) ((widget)->_type == GFXW_VISUAL)
@@ -309,6 +329,7 @@ struct GfxVisual : public GfxContainer {
public:
GfxVisual(gfx_state_t *state, int font);
+ virtual void print(int indentation) const;
virtual int setVisual(GfxVisual *);
};
@@ -329,6 +350,7 @@ public:
GfxPort(GfxVisual *visual, rect_t area, gfx_color_t fgcolor, gfx_color_t bgcolor);
~GfxPort();
+ virtual void print(int indentation) const;
virtual int setVisual(GfxVisual *);
};
diff --git a/engines/sci/gfx/gfx_widgets.cpp b/engines/sci/gfx/gfx_widgets.cpp
index a47b7618d4..752130f5ec 100644
--- a/engines/sci/gfx/gfx_widgets.cpp
+++ b/engines/sci/gfx/gfx_widgets.cpp
@@ -88,45 +88,43 @@ static void indent(int indentation) {
sciprintf(" ");
}
-static void _gfxw_print_widget(GfxWidget *widget, int indentation) {
+void GfxWidget::printIntern(int indentation) const {
unsigned int i;
char flags_list[] = "VOCDTMI";
indent(indentation);
- if (widget->_magic == GFXW_MAGIC_VALID) {
- if (widget->_visual)
+ if (_magic == GFXW_MAGIC_VALID) {
+ if (_visual)
sciprintf("v ");
else
sciprintf("NoVis ");
- } else if (widget->_magic == GFXW_MAGIC_INVALID)
+ } else if (_magic == GFXW_MAGIC_INVALID)
sciprintf("INVALID ");
- sciprintf("S%08x", widget->_serial);
+ sciprintf("S%08x", _serial);
- if (widget->_ID != GFXW_NO_ID) {
- sciprintf("#%x", widget->_ID);
+ if (_ID != GFXW_NO_ID) {
+ sciprintf("#%x", _ID);
- if (widget->_subID != GFXW_NO_ID)
- sciprintf(":%x ", widget->_subID);
+ if (_subID != GFXW_NO_ID)
+ sciprintf(":%x ", _subID);
else
sciprintf(" ");
}
- sciprintf("[(%d,%d)(%dx%d)]", widget->_bounds.x, widget->_bounds.y, widget->_bounds.width, widget->_bounds.height);
+ sciprintf("[(%d,%d)(%dx%d)]", _bounds.x, _bounds.y, _bounds.width, _bounds.height);
for (i = 0; i < strlen(flags_list); i++)
- if (widget->_flags & (1 << i))
+ if (_flags & (1 << i))
sciprintf("%c", flags_list[i]);
sciprintf(" ");
}
-static int _gfxwop_print_empty(GfxWidget *widget, int indentation) {
- _gfxw_print_widget(widget, indentation);
- sciprintf("<untyped #%d>", widget->_type);
-
- return 0;
+void GfxWidget::print(int indentation) const {
+ printIntern(indentation);
+ sciprintf("<untyped #%d>", _type);
}
GfxWidget::GfxWidget(gfxw_widget_type_t type_) {
@@ -147,7 +145,6 @@ GfxWidget::GfxWidget(gfxw_widget_type_t type_) {
draw = NULL;
tag = NULL;
- print = _gfxwop_print_empty;
compare_to = NULL;
equals = NULL;
should_replace = NULL;
@@ -201,13 +198,10 @@ static int verify_widget(GfxWidget *widget) {
sciprintf("L%d: NULL widget", __LINE__); \
return 1; \
} \
- if (!(widget)->print) { \
- sciprintf("L%d: Widget of type %d does not have print function", __LINE__, (widget)->_type); \
- } \
if ((widget)->_type != (exp_type)) { \
sciprintf("L%d: Error in widget: Expected type " # exp_type "(%d) but got %d\n", __LINE__, exp_type, (widget)->_type); \
sciprintf("Erroneous widget: "); \
- widget->print(widget, 4); \
+ widget->print(4); \
sciprintf("\n"); \
return 1; \
} \
@@ -216,7 +210,7 @@ static int verify_widget(GfxWidget *widget) {
if (!(widget->_type == GFXW_VISUAL || widget->_visual)) { \
sciprintf("L%d: Error while drawing widget: Widget has no visual\n", __LINE__); \
sciprintf("Erroneous widget: "); \
- widget->print(widget, 1); \
+ widget->print(1); \
sciprintf("\n"); \
return 1; \
}
@@ -258,11 +252,10 @@ static int _gfxwop_basic_should_replace(GfxWidget *widget, GfxWidget *other) {
return 0;
}
-static void _gfxw_set_ops(GfxWidget *widget, gfxw_point_op *draw, gfxw_op *tag, gfxw_op_int *print,
+static void _gfxw_set_ops(GfxWidget *widget, gfxw_point_op *draw, gfxw_op *tag,
gfxw_bin_op *compare_to, gfxw_bin_op *equals, gfxw_bin_op *superarea_of) {
widget->draw = draw;
widget->tag = tag;
- widget->print = print;
widget->compare_to = compare_to;
widget->equals = equals;
widget->superarea_of = superarea_of;
@@ -278,7 +271,7 @@ void gfxw_remove_widget_from_container(GfxContainer *container, GfxWidget *widge
BREAKPOINT();
}
- seekerp = &(container->contents);
+ seekerp = &(container->_contents);
if (GFXW_IS_LIST(widget) && GFXW_IS_PORT(container)) {
GfxPort *port = (GfxPort *) container;
@@ -294,15 +287,15 @@ void gfxw_remove_widget_from_container(GfxContainer *container, GfxWidget *widge
if (!*seekerp) {
GFXERROR("Internal error: Attempt to remove widget from container it was not contained in!\n");
sciprintf("Widget:");
- widget->print(widget, 1);
+ widget->print(1);
sciprintf("Container:");
- widget->print(container, 1);
+ widget->print(1);
BREAKPOINT();
return;
}
- if (container->nextpp == &(widget->_next))
- container->nextpp = seekerp;
+ if (container->_nextpp == &(widget->_next))
+ container->_nextpp = seekerp;
*seekerp = widget->_next; // Remove it
widget->_parent = NULL;
@@ -368,10 +361,9 @@ static int _gfxwop_box_draw(GfxWidget *widget, Common::Point pos) {
return 0;
}
-static int _gfxwop_box_print(GfxWidget *widget, int indentation) {
- _gfxw_print_widget(widget, indentation);
+void GfxBox::print(int indentation) const {
+ printIntern(indentation);
sciprintf("BOX");
- return 0;
}
static int _gfxwop_box_superarea_of(GfxWidget *widget, GfxWidget *other) {
@@ -417,7 +409,7 @@ static int _gfxwop_box_equals(GfxWidget *widget, GfxWidget *other) {
}
void _gfxw_set_ops_BOX(GfxWidget *widget) {
- _gfxw_set_ops(widget, _gfxwop_box_draw, _gfxwop_basic_tag, _gfxwop_box_print,
+ _gfxw_set_ops(widget, _gfxwop_box_draw, _gfxwop_basic_tag,
_gfxwop_basic_compare_to, _gfxwop_box_equals, _gfxwop_box_superarea_of);
}
@@ -461,8 +453,9 @@ GfxPrimitive::GfxPrimitive(rect_t area, gfx_color_t color_, gfx_line_mode_t mode
//*** Rectangles ***
-struct gfxw_rect_t : public GfxPrimitive {
- gfxw_rect_t(rect_t rect, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style);
+struct GfxRect : public GfxPrimitive {
+ GfxRect(rect_t rect, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style);
+ virtual void print(int indentation) const;
};
static int _gfxwop_primitive_equals(GfxWidget *widget, GfxWidget *other) {
@@ -499,23 +492,21 @@ static int _gfxwop_rect_draw(GfxWidget *widget, Common::Point pos) {
return 0;
}
-static int _gfxwop_rect_print(GfxWidget *rect, int indentation) {
- _gfxw_print_widget(rect, indentation);
+void GfxRect::print(int indentation) const {
+ printIntern(indentation);
sciprintf("RECT");
-
- return 0;
}
void _gfxw_set_ops_RECT(GfxWidget *prim) {
- _gfxw_set_ops(prim, _gfxwop_rect_draw, _gfxwop_basic_tag, _gfxwop_rect_print,
+ _gfxw_set_ops(prim, _gfxwop_rect_draw, _gfxwop_basic_tag,
_gfxwop_basic_compare_to, _gfxwop_primitive_equals, _gfxwop_basic_superarea_of);
}
GfxPrimitive *gfxw_new_rect(rect_t rect, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style) {
- return new gfxw_rect_t(rect, color, line_mode, line_style);
+ return new GfxRect(rect, color, line_mode, line_style);
}
-gfxw_rect_t::gfxw_rect_t(rect_t rect, gfx_color_t color_, gfx_line_mode_t line_mode_, gfx_line_style_t line_style_)
+GfxRect::GfxRect(rect_t rect, gfx_color_t color_, gfx_line_mode_t line_mode_, gfx_line_style_t line_style_)
: GfxPrimitive(rect, color_, line_mode_, line_style_, GFXW_RECT) {
_bounds.width++;
@@ -526,8 +517,9 @@ gfxw_rect_t::gfxw_rect_t(rect_t rect, gfx_color_t color_, gfx_line_mode_t line_m
//*** Lines ***
-struct gfxw_line_t : public GfxPrimitive {
- gfxw_line_t(Common::Point start, Common::Point end, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style);
+struct GfxLine : public GfxPrimitive {
+ GfxLine(Common::Point start, Common::Point end, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style);
+ virtual void print(int indentation) const;
};
static int _gfxwop_line_draw(GfxWidget *widget, Common::Point pos) {
@@ -545,22 +537,21 @@ static int _gfxwop_line_draw(GfxWidget *widget, Common::Point pos) {
return 0;
}
-static int _gfxwop_line_print(GfxWidget *widget, int indentation) {
- _gfxw_print_widget(widget, indentation);
-
- return 0;
+void GfxLine::print(int indentation) const {
+ printIntern(indentation);
+// sciprintf("LINE");
}
void _gfxw_set_ops_LINE(GfxWidget *prim) {
- _gfxw_set_ops(prim, _gfxwop_line_draw, _gfxwop_basic_tag, _gfxwop_line_print,
+ _gfxw_set_ops(prim, _gfxwop_line_draw, _gfxwop_basic_tag,
_gfxwop_basic_compare_to, _gfxwop_primitive_equals, _gfxwop_basic_superarea_of);
}
GfxPrimitive *gfxw_new_line(Common::Point start, Common::Point end, gfx_color_t color, gfx_line_mode_t line_mode, gfx_line_style_t line_style) {
- return new gfxw_line_t(start, end, color, line_mode, line_style);
+ return new GfxLine(start, end, color, line_mode, line_style);
}
-gfxw_line_t::gfxw_line_t(Common::Point start, Common::Point end, gfx_color_t color_, gfx_line_mode_t line_mode_, gfx_line_style_t line_style_)
+GfxLine::GfxLine(Common::Point start, Common::Point end, gfx_color_t color_, gfx_line_mode_t line_mode_, gfx_line_style_t line_style_)
: GfxPrimitive(gfx_rect(start.x, start.y, end.x - start.x + 1, end.y - start.y + 1), color_, line_mode_, line_style_, GFXW_LINE) {
_gfxw_set_ops_LINE(this);
}
@@ -629,29 +620,24 @@ static int _gfxwop_static_view_draw(GfxWidget *widget, Common::Point pos) {
return 0;
}
-static int _w_gfxwop_view_print(GfxWidget *widget, const char *name, int indentation) {
- GfxView *view = (GfxView *)widget;
- _gfxw_print_widget(widget, indentation);
-
- sciprintf("%s", name);
- sciprintf("(%d/%d/%d)@(%d,%d)[p:%d,c:%d]", view->_view, view->_loop, view->_cel, view->_pos.x, view->_pos.y,
- (view->_color.mask & GFX_MASK_PRIORITY) ? view->_color.priority : -1,
- (view->_color.mask & GFX_MASK_CONTROL) ? view->_color.control : -1);
-
- return 0;
-}
+void GfxView::print(int indentation) const {
+ printIntern(indentation);
-static int _gfxwop_view_print(GfxWidget *widget, int indentation) {
- return _w_gfxwop_view_print(widget, "VIEW", indentation);
-}
+ if (_type == GFXW_STATIC_VIEW)
+ sciprintf("STATICVIEW");
+ else if (_type == GFXW_VIEW)
+ sciprintf("VIEW");
+ else
+ error("GfxView::print: Invalid type %d", _type);
-static int _gfxwop_static_view_print(GfxWidget *widget, int indentation) {
- return _w_gfxwop_view_print(widget, "PICVIEW", indentation);
+ sciprintf("(%d/%d/%d)@(%d,%d)[p:%d,c:%d]", _view, _loop, _cel, _pos.x, _pos.y,
+ (_color.mask & GFX_MASK_PRIORITY) ? _color.priority : -1,
+ (_color.mask & GFX_MASK_CONTROL) ? _color.control : -1);
}
void _gfxw_set_ops_VIEW(GfxWidget *view, char stat) {
_gfxw_set_ops(view, (stat) ? _gfxwop_static_view_draw : _gfxwop_view_draw,
- _gfxwop_basic_tag, (stat) ? _gfxwop_static_view_print : _gfxwop_view_print,
+ _gfxwop_basic_tag,
_gfxwop_basic_compare_to, _gfxwop_basic_equals, _gfxwop_basic_superarea_of);
}
@@ -719,26 +705,20 @@ static int _gfxwop_pic_view_draw(GfxWidget *widget, Common::Point pos) {
return 0;
}
-static int _gfxwop_some_view_print(GfxWidget *widget, int indentation, const char *type_string) {
- GfxDynView *view = (GfxDynView *)widget;
-
- _gfxw_print_widget(widget, indentation);
-
- sciprintf("%s", type_string);
- sciprintf(" SORT=%d z=%d seq=%d (%d/%d/%d)@(%d,%d)[p:%d,c:%d]; sig[%04x@%p]", view->force_precedence, view->_z,
- view->sequence, view->_view, view->_loop, view->_cel, view->_pos.x, view->_pos.y,
- (view->_color.mask & GFX_MASK_PRIORITY) ? view->_color.priority : -1,
- (view->_color.mask & GFX_MASK_CONTROL) ? view->_color.control : -1, view->signal, view->signalp);
-
- return 0;
-}
+ void GfxDynView::print(int indentation) const {
+ printIntern(indentation);
-static int _gfxwop_dyn_view_print(GfxWidget *widget, int indentation) {
- return _gfxwop_some_view_print(widget, indentation, "DYNVIEW");
-}
+ if (_type == GFXW_DYN_VIEW)
+ sciprintf("DYNVIEW");
+ else if (_type == GFXW_PIC_VIEW)
+ sciprintf("PICVIEW");
+ else
+ error("GfxDynView::print: Invalid type %d", _type);
-static int _gfxwop_pic_view_print(GfxWidget *widget, int indentation) {
- return _gfxwop_some_view_print(widget, indentation, "PICVIEW");
+ sciprintf(" SORT=%d z=%d seq=%d (%d/%d/%d)@(%d,%d)[p:%d,c:%d]; sig[%04x@%p]", force_precedence, _z,
+ sequence, _view, _loop, _cel, _pos.x, _pos.y,
+ (_color.mask & GFX_MASK_PRIORITY) ? _color.priority : -1,
+ (_color.mask & GFX_MASK_CONTROL) ? _color.control : -1, signal, signalp);
}
static int _gfxwop_dyn_view_equals(GfxWidget *widget, GfxWidget *other) {
@@ -788,13 +768,12 @@ static int _gfxwop_dyn_view_compare_to(GfxWidget *widget, GfxWidget *other) {
void _gfxw_set_ops_DYNVIEW(GfxWidget *widget) {
_gfxw_set_ops(widget, _gfxwop_dyn_view_draw, _gfxwop_basic_tag,
- _gfxwop_dyn_view_print, _gfxwop_dyn_view_compare_to, _gfxwop_dyn_view_equals, _gfxwop_basic_superarea_of);
+ _gfxwop_dyn_view_compare_to, _gfxwop_dyn_view_equals, _gfxwop_basic_superarea_of);
}
void _gfxw_set_ops_PICVIEW(GfxWidget *widget) {
_gfxw_set_ops_DYNVIEW(widget);
widget->draw = _gfxwop_pic_view_draw;
- widget->print = _gfxwop_pic_view_print;
}
GfxDynView *gfxw_new_dyn_view(gfx_state_t *state, Common::Point pos, int z, int view, int loop, int cel, int palette, int priority, int control,
@@ -903,11 +882,9 @@ static int _gfxwop_text_alloc_and_draw(GfxWidget *widget, Common::Point pos) {
return _gfxwop_text_draw(widget, pos);
}
-static int _gfxwop_text_print(GfxWidget *widget, int indentation) {
- _gfxw_print_widget(widget, indentation);
- sciprintf("TEXT:'%s'", ((GfxText *)widget)->text);
-
- return 0;
+void GfxText::print(int indentation) const {
+ printIntern(indentation);
+ sciprintf("TEXT:'%s'", text);
}
static int _gfxwop_text_equals(GfxWidget *widget, GfxWidget *other) {
@@ -953,7 +930,7 @@ static int _gfxwop_text_compare_to(GfxWidget *widget, GfxWidget *other) {
void _gfxw_set_ops_TEXT(GfxWidget *widget) {
_gfxw_set_ops(widget, _gfxwop_text_alloc_and_draw, _gfxwop_basic_tag,
- _gfxwop_text_print, _gfxwop_text_compare_to, _gfxwop_text_equals,
+ _gfxwop_text_compare_to, _gfxwop_text_equals,
_gfxwop_basic_superarea_of);
widget->should_replace = _gfxwop_text_should_replace;
}
@@ -1017,11 +994,11 @@ static int _gfxwop_container_add_dirty_rel(GfxContainer *cont, rect_t rect, int
}
static void _gfxw_set_container_ops(GfxContainer *container, gfxw_point_op *draw, gfxw_op *tag,
- gfxw_op_int *print, gfxw_bin_op *compare_to, gfxw_bin_op *equals,
+ gfxw_bin_op *compare_to, gfxw_bin_op *equals,
gfxw_bin_op *superarea_of,
gfxw_unary_container_op *free_tagged, gfxw_unary_container_op *free_contents,
gfxw_rect_op *add_dirty, gfxw_container_op *add) {
- _gfxw_set_ops(container, draw, tag, print, compare_to, equals, superarea_of);
+ _gfxw_set_ops(container, draw, tag, compare_to, equals, superarea_of);
container->free_tagged = free_tagged;
container->free_contents = free_contents;
@@ -1038,7 +1015,7 @@ static int _w_gfxwop_container_print_contents(const char *name, GfxWidget *widge
sciprintf("--%s:\n", name);
while (seeker) {
- seeker->print(seeker, indentation + 1);
+ seeker->print(indentation + 1);
sciprintf("\n");
seeker = seeker->_next;
}
@@ -1046,39 +1023,31 @@ static int _w_gfxwop_container_print_contents(const char *name, GfxWidget *widge
return 0;
}
-static int _w_gfxwop_container_print(GfxWidget *widget, int indentation) {
+void GfxContainer::print(int indentation) const {
gfx_dirty_rect_t *dirty;
- GfxContainer *container = (GfxContainer *)widget;
- if (!GFXW_IS_CONTAINER(widget)) {
- GFXERROR("_w_gfxwop_container_print() called on type %d widget\n", widget->_type);
- return 1;
- }
- sciprintf(" viszone=((%d,%d),(%dx%d))\n", container->zone.x, container->zone.y,
- container->zone.width, container->zone.height);
+ sciprintf(" viszone=((%d,%d),(%dx%d))\n", zone.x, zone.y, zone.width, zone.height);
indent(indentation);
sciprintf("--dirty:\n");
- dirty = container->dirty;
+ dirty = _dirty;
while (dirty) {
indent(indentation + 1);
sciprintf("dirty(%d,%d, (%dx%d))\n", dirty->rect.x, dirty->rect.y, dirty->rect.width, dirty->rect.height);
dirty = dirty->next;
}
- _w_gfxwop_container_print_contents("contents", container->contents, indentation);
-
- return 0;
+ _w_gfxwop_container_print_contents("contents", _contents, indentation);
}
GfxContainer::GfxContainer(rect_t area, gfxw_widget_type_t type_)
: GfxWidget(type_) {
_bounds = zone = area;
- contents = NULL;
- nextpp = &contents;
- dirty = NULL;
+ _contents = NULL;
+ _nextpp = &_contents;
+ _dirty = NULL;
free_tagged = NULL;
free_contents = NULL;
@@ -1105,7 +1074,7 @@ static int _gfxw_dirty_rect_overlaps_normal_rect(rect_t port_zone, rect_t bounds
static int _gfxwop_container_draw_contents(GfxWidget *widget, GfxWidget *contents) {
GfxContainer *container = (GfxContainer *)widget;
- gfx_dirty_rect_t *dirty = container->dirty;
+ gfx_dirty_rect_t *dirty = container->_dirty;
gfx_state_t *gfx_state = (widget->_visual) ? widget->_visual->_gfxState : ((GfxVisual *) widget)->_gfxState;
int draw_ports;
rect_t nullzone = {0, 0, 0, 0};
@@ -1137,7 +1106,7 @@ static int _gfxwop_container_draw_contents(GfxWidget *widget, GfxWidget *content
// The draw loop is executed twice: Once for normal data, and once for ports.
for (draw_ports = 0; draw_ports < 2; draw_ports++) {
- dirty = container->dirty;
+ dirty = container->_dirty;
while (dirty) {
GfxWidget *seeker = contents;
@@ -1174,7 +1143,7 @@ static int _gfxwop_container_draw_contents(GfxWidget *widget, GfxWidget *content
}
GfxContainer::~GfxContainer() {
- GfxWidget *seeker = contents;
+ GfxWidget *seeker = _contents;
while (seeker) {
GfxWidget *next = seeker->_next;
@@ -1182,13 +1151,13 @@ GfxContainer::~GfxContainer() {
seeker = next;
}
- recursively_free_dirty_rects(dirty);
- dirty = NULL;
+ recursively_free_dirty_rects(_dirty);
+ _dirty = NULL;
}
static int _gfxwop_container_tag(GfxWidget *widget) {
GfxContainer *container = (GfxContainer *) widget;
- GfxWidget *seeker = container->contents;
+ GfxWidget *seeker = container->_contents;
while (seeker) {
seeker->tag(seeker);
@@ -1198,28 +1167,25 @@ static int _gfxwop_container_tag(GfxWidget *widget) {
return 0;
}
-static int _w_gfxwop_container_set_visual_contents(GfxWidget *contents, GfxVisual *visual) {
- while (contents) {
- contents->setVisual(visual);
- contents = contents->_next;
- }
- return 0;
-}
-
int GfxContainer::setVisual(GfxVisual *visual) {
_visual = visual;
if (_parent) {
- if (!(GFXW_IS_LIST(this) && !GFXWC(this)->contents)) {
+ if (!(GFXW_IS_LIST(this) && !_contents)) {
DDIRTY(stderr, "set_visual::DOWNWARDS abs(%d,%d,%d,%d, 1)\n", GFX_PRINT_RECT(_bounds));
_parent->add_dirty_abs(_parent, _bounds, 1);
}
}
- return _w_gfxwop_container_set_visual_contents(contents, visual);
+ GfxWidget *seeker = _contents;
+ while (seeker) {
+ seeker->setVisual(visual);
+ seeker = seeker->_next;
+ }
+ return 0;
}
static int _gfxwop_container_free_tagged(GfxContainer *container) {
- GfxWidget *seekerp = container->contents;
+ GfxWidget *seekerp = container->_contents;
while (seekerp) {
GfxWidget *redshirt = seekerp;
@@ -1235,7 +1201,7 @@ static int _gfxwop_container_free_tagged(GfxContainer *container) {
}
static int _gfxwop_container_free_contents(GfxContainer *container) {
- GfxWidget *seeker = container->contents;
+ GfxWidget *seeker = container->_contents;
while (seeker) {
GfxWidget *next = seeker->_next;
@@ -1247,22 +1213,22 @@ static int _gfxwop_container_free_contents(GfxContainer *container) {
static void _gfxw_dirtify_container(GfxContainer *container, GfxWidget *widget) {
if (GFXW_IS_CONTAINER(widget))
- container->add_dirty_abs(GFXWC(container), widget->_bounds, 1);
+ container->add_dirty_abs(container, widget->_bounds, 1);
else
- container->add_dirty_rel(GFXWC(container), widget->_bounds, 1);
+ container->add_dirty_rel(container, widget->_bounds, 1);
}
static int _parentize_widget(GfxContainer *container, GfxWidget *widget) {
if (widget->_parent) {
GFXERROR("_gfxwop_container_add(): Attempt to give second parent node to widget!\nWidget:");
- widget->print(widget, 3);
+ widget->print(3);
sciprintf("\nContainer:");
- container->print(container, 3);
+ container->print(3);
return 1;
}
- widget->_parent = GFXWC(container);
+ widget->_parent = container;
if (GFXW_IS_VISUAL(container))
widget->setVisual((GfxVisual *)container);
@@ -1273,7 +1239,7 @@ static int _parentize_widget(GfxContainer *container, GfxWidget *widget) {
}
static int _gfxw_container_id_equals(GfxContainer *container, GfxWidget *widget) {
- GfxWidget **seekerp = &(container->contents);
+ GfxWidget **seekerp = &(container->_contents);
if (GFXW_IS_PORT(widget))
return 0;
@@ -1307,7 +1273,7 @@ static int _gfxwop_container_add_dirty(GfxContainer *container, rect_t dirty, in
#endif
DDIRTY(stderr, "Effectively adding dirty %d,%d,%d,%d %d to ID %d\n", GFX_PRINT_RECT(dirty), propagate, container->_ID);
- container->dirty = gfxdr_add_dirty(container->dirty, dirty, GFXW_DIRTY_STRATEGY);
+ container->_dirty = gfxdr_add_dirty(container->_dirty, dirty, GFXW_DIRTY_STRATEGY);
return 0;
}
@@ -1318,13 +1284,13 @@ static int _gfxwop_container_add(GfxContainer *container, GfxWidget *widget) {
if (_parentize_widget(container, widget))
return 1;
- if (!(GFXW_IS_LIST(widget) && (!GFXWC(widget)->contents))) { // Don't dirtify self on empty lists
+ if (!(GFXW_IS_LIST(widget) && (!GFXWC(widget)->_contents))) { // Don't dirtify self on empty lists
DDIRTY(stderr, "container_add: dirtify DOWNWARDS (%d,%d,%d,%d, 1)\n", GFX_PRINT_RECT(widget->_bounds));
_gfxw_dirtify_container(container, widget);
}
- *(container->nextpp) = widget;
- container->nextpp = &(widget->_next);
+ *(container->_nextpp) = widget;
+ container->_nextpp = &(widget->_next);
return 0;
}
@@ -1334,9 +1300,9 @@ static int _gfxwop_container_add(GfxContainer *container, GfxWidget *widget) {
static int _gfxwop_list_draw(GfxWidget *list, Common::Point pos) {
DRAW_ASSERT(list, GFXW_LIST);
- _gfxwop_container_draw_contents(list, ((GfxList *)list)->contents);
- recursively_free_dirty_rects(GFXWC(list)->dirty);
- GFXWC(list)->dirty = NULL;
+ _gfxwop_container_draw_contents(list, ((GfxList *)list)->_contents);
+ recursively_free_dirty_rects(GFXWC(list)->_dirty);
+ GFXWC(list)->_dirty = NULL;
list->_flags &= ~GFXW_FLAG_DIRTY;
return 0;
@@ -1345,26 +1311,24 @@ static int _gfxwop_list_draw(GfxWidget *list, Common::Point pos) {
static int _gfxwop_sorted_list_draw(GfxWidget *list, Common::Point pos) {
DRAW_ASSERT(list, GFXW_SORTED_LIST);
- _gfxwop_container_draw_contents(list, ((GfxList *)list)->contents);
- recursively_free_dirty_rects(GFXWC(list)->dirty);
- GFXWC(list)->dirty = NULL;
+ _gfxwop_container_draw_contents(list, ((GfxList *)list)->_contents);
+ recursively_free_dirty_rects(GFXWC(list)->_dirty);
+ GFXWC(list)->_dirty = NULL;
return 0;
}
-static int _w_gfxwop_list_print(GfxWidget *list, const char *name, int indentation) {
- _gfxw_print_widget(list, indentation);
- sciprintf("%s", name);
-
- return _w_gfxwop_container_print(list, indentation);
-}
+void GfxList::print(int indentation) const {
+ printIntern(indentation);
-static int _gfxwop_list_print(GfxWidget *list, int indentation) {
- return _w_gfxwop_list_print(list, "LIST", indentation);
-}
+ if (_type == GFXW_LIST)
+ sciprintf("LIST");
+ else if (_type == GFXW_SORTED_LIST)
+ sciprintf("SORTED_LIST");
+ else
+ error("GfxList::print: Invalid type %d", _type);
-static int _gfxwop_sorted_list_print(GfxWidget *list, int indentation) {
- return _w_gfxwop_list_print(list, "SORTED_LIST", indentation);
+ GfxContainer::print(indentation);
}
static int _gfxwop_list_equals(GfxWidget *widget, GfxWidget *other) {
@@ -1376,7 +1340,7 @@ static int _gfxwop_list_equals(GfxWidget *widget, GfxWidget *other) {
if (!GFXW_IS_LIST(widget)) {
GFXWARN("_gfxwop_list_equals(): Method called on non-list!\n");
- widget->print(widget, 0);
+ widget->print(0);
sciprintf("\n");
return 0;
}
@@ -1387,8 +1351,8 @@ static int _gfxwop_list_equals(GfxWidget *widget, GfxWidget *other) {
if (memcmp(&(wlist->_bounds), &(olist->_bounds), sizeof(rect_t)))
return 0;
- widget = wlist->contents;
- other = olist->contents;
+ widget = wlist->_contents;
+ other = olist->_contents;
while (widget && other) {
if (!(widget->equals(widget, other) && !widget->should_replace(widget, other)))
@@ -1418,13 +1382,13 @@ static int _gfxwop_list_add_dirty(GfxContainer *container, rect_t dirty, int pro
int _gfxwop_ordered_add(GfxContainer *container, GfxWidget *widget, int compare_all) {
// O(n)
- GfxWidget **seekerp = &(container->contents);
+ GfxWidget **seekerp = &(container->_contents);
if (widget->_next) {
GFXERROR("_gfxwop_sorted_list_add(): Attempt to add widget to two lists!\nWidget:");
- widget->print(widget, 3);
+ widget->print(3);
sciprintf("\nList:");
- container->print(container, 3);
+ container->print(3);
BREAKPOINT();
return 1;
@@ -1469,7 +1433,6 @@ static int _gfxwop_sorted_list_add(GfxContainer *container, GfxWidget *widget) {
void _gfxw_set_ops_LIST(GfxContainer *list, char sorted) {
_gfxw_set_container_ops((GfxContainer *)list, sorted ? _gfxwop_sorted_list_draw : _gfxwop_list_draw,
_gfxwop_container_tag,
- sorted ? _gfxwop_sorted_list_print : _gfxwop_list_print,
_gfxwop_basic_compare_to, sorted ? _gfxwop_basic_equals : _gfxwop_list_equals,
_gfxwop_basic_superarea_of,
_gfxwop_container_free_tagged, _gfxwop_container_free_contents,
@@ -1492,7 +1455,7 @@ GfxList::GfxList(rect_t area, bool sorted)
static int _gfxwop_visual_draw(GfxWidget *widget, Common::Point pos) {
GfxVisual *visual = (GfxVisual *) widget;
- gfx_dirty_rect_t *dirty = visual->dirty;
+ gfx_dirty_rect_t *dirty = visual->_dirty;
DRAW_ASSERT(widget, GFXW_VISUAL);
while (dirty) {
@@ -1508,40 +1471,28 @@ static int _gfxwop_visual_draw(GfxWidget *widget, Common::Point pos) {
dirty = dirty->next;
}
- _gfxwop_container_draw_contents(widget, visual->contents);
+ _gfxwop_container_draw_contents(widget, visual->_contents);
- recursively_free_dirty_rects(visual->dirty);
- visual->dirty = NULL;
+ recursively_free_dirty_rects(visual->_dirty);
+ visual->_dirty = NULL;
widget->_flags &= ~GFXW_FLAG_DIRTY;
return 0;
}
-static int _gfxwop_visual_print(GfxWidget *widget, int indentation) {
- int comma = 0;
- GfxVisual *visual = (GfxVisual *) widget;
-
- if (!GFXW_IS_VISUAL(visual)) {
- GFXERROR("_gfxwop_visual_print() called on non-visual!Widget was: ");
- widget->print(widget, 3);
- return 1;
- }
-
- _gfxw_print_widget(widget, indentation);
+void GfxVisual::print(int indentation) const {
+ printIntern(indentation);
sciprintf("VISUAL; ports={");
- for (uint i = 0; i < visual->_portRefs.size(); i++) {
- if (visual->_portRefs[i]) {
- if (comma)
+ for (uint i = 0; i < _portRefs.size(); i++) {
+ if (_portRefs[i]) {
+ if (i != 0)
sciprintf(",");
- else
- comma = 1;
-
sciprintf("%d", i);
}
}
sciprintf("}\n");
- return _w_gfxwop_container_print(widget, indentation);
+ GfxContainer::print(indentation);
}
int GfxVisual::setVisual(GfxVisual *visual) {
@@ -1556,7 +1507,7 @@ int GfxVisual::setVisual(GfxVisual *visual) {
void _gfxw_set_ops_VISUAL(GfxContainer *visual) {
_gfxw_set_container_ops((GfxContainer *)visual, _gfxwop_visual_draw,
- _gfxwop_container_tag, _gfxwop_visual_print, _gfxwop_basic_compare_to,
+ _gfxwop_container_tag, _gfxwop_basic_compare_to,
_gfxwop_basic_equals, _gfxwop_basic_superarea_of,
_gfxwop_container_free_tagged, _gfxwop_container_free_contents,
_gfxwop_container_add_dirty, _gfxwop_container_add);
@@ -1591,7 +1542,7 @@ static int _visual_find_free_ID(GfxVisual *visual) {
static int _gfxwop_add_dirty_rects(GfxContainer *dest, gfx_dirty_rect_t *src) {
DDIRTY(stderr, "Adding multiple dirty to #%d\n", dest->_ID);
if (src) {
- dest->dirty = gfxdr_add_dirty(dest->dirty, src->rect, GFXW_DIRTY_STRATEGY);
+ dest->_dirty = gfxdr_add_dirty(dest->_dirty, src->rect, GFXW_DIRTY_STRATEGY);
_gfxwop_add_dirty_rects(dest, src->next);
}
@@ -1606,18 +1557,18 @@ static int _gfxwop_port_draw(GfxWidget *widget, Common::Point pos) {
if (port->_decorations) {
DDIRTY(stderr, "Getting/applying deco dirty (multi)\n");
- _gfxwop_add_dirty_rects(GFXWC(port->_decorations), port->dirty);
+ _gfxwop_add_dirty_rects(GFXWC(port->_decorations), port->_dirty);
if (port->_decorations->draw(port->_decorations, gfxw_point_zero)) {
- port->_decorations->dirty = NULL;
+ port->_decorations->_dirty = NULL;
return 1;
}
- port->_decorations->dirty = NULL;
+ port->_decorations->_dirty = NULL;
}
- _gfxwop_container_draw_contents(widget, port->contents);
+ _gfxwop_container_draw_contents(widget, port->_contents);
- recursively_free_dirty_rects(port->dirty);
- port->dirty = NULL;
+ recursively_free_dirty_rects(port->_dirty);
+ port->_dirty = NULL;
widget->_flags &= ~GFXW_FLAG_DIRTY;
return 0;
@@ -1639,17 +1590,15 @@ GfxPort::~GfxPort() {
delete _decorations;
}
-static int _gfxwop_port_print(GfxWidget *widget, int indentation) {
- GfxPort *port = (GfxPort *)widget;
-
- _gfxw_print_widget(widget, indentation);
+void GfxPort::print(int indentation) const {
+ printIntern(indentation);
sciprintf("PORT");
- sciprintf(" font=%d drawpos=(%d,%d)", port->_font, port->draw_pos.x, port->draw_pos.y);
- if (port->gray_text)
+ sciprintf(" font=%d drawpos=(%d,%d)", _font, draw_pos.x, draw_pos.y);
+ if (gray_text)
sciprintf(" (gray)");
- _w_gfxwop_container_print(port, indentation);
- return _w_gfxwop_container_print_contents("decorations", port->_decorations, indentation);
+ GfxContainer::print(indentation);
+ _w_gfxwop_container_print_contents("decorations", _decorations, indentation);
}
static int _gfxwop_port_superarea_of(GfxWidget *self, GfxWidget *other) {
@@ -1667,7 +1616,7 @@ int GfxPort::setVisual(GfxVisual *visual) {
if (_decorations)
if (_decorations->setVisual(visual)) {
GFXWARN("Setting the visual for decorations failed for port ");
- this->print(this, 1);
+ this->print(1);
return 1;
}
@@ -1720,7 +1669,7 @@ static int _gfxwop_port_add(GfxContainer *container, GfxWidget *widget) {
void _gfxw_set_ops_PORT(GfxContainer *widget) {
_gfxw_set_container_ops((GfxContainer *)widget, _gfxwop_port_draw, _gfxwop_container_tag,
- _gfxwop_port_print, _gfxwop_basic_compare_to, _gfxwop_basic_equals, _gfxwop_port_superarea_of,
+ _gfxwop_basic_compare_to, _gfxwop_basic_equals, _gfxwop_port_superarea_of,
_gfxwop_container_free_tagged, _gfxwop_container_free_contents,
_gfxwop_port_add_dirty, _gfxwop_port_add);
}
@@ -1758,7 +1707,7 @@ GfxPort *gfxw_remove_port(GfxVisual *visual, GfxPort *port) {
VERIFY_WIDGET(visual);
VERIFY_WIDGET(port);
- if (!visual->contents) {
+ if (!visual->_contents) {
GFXWARN("Attempt to remove port from empty visual\n");
return NULL;
}
@@ -1819,7 +1768,7 @@ GfxDynView *gfxw_dyn_view_set_params(GfxDynView *widget, int under_bits, void *u
}
GfxWidget *gfxw_remove_id(GfxContainer *container, int ID, int subID) {
- GfxWidget **wp = &(container->contents);
+ GfxWidget **wp = &(container->_contents);
while (*wp) {
if ((*wp)->_ID == ID && (subID == GFXW_NO_ID || (*wp)->_subID == subID)) {
@@ -1897,7 +1846,7 @@ int gfxw_widget_matches_snapshot(gfxw_snapshot_t *snapshot, GfxWidget *widget) {
#define MAGIC_FREE_NUMBER -42
void _gfxw_free_contents_appropriately(GfxContainer *container, gfxw_snapshot_t *snapshot, int priority) {
- GfxWidget *widget = container->contents;
+ GfxWidget *widget = container->_contents;
while (widget) {
GfxWidget *next = widget->_next;