aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx')
-rw-r--r--engines/sci/gfx/gfx_options.h1
-rw-r--r--engines/sci/gfx/gfx_resmgr.cpp4
-rw-r--r--engines/sci/gfx/gfx_resource.h4
-rw-r--r--engines/sci/gfx/operations.cpp1
-rw-r--r--engines/sci/gfx/operations.h1
-rw-r--r--engines/sci/gfx/res_pic.cpp104
6 files changed, 57 insertions, 58 deletions
diff --git a/engines/sci/gfx/gfx_options.h b/engines/sci/gfx/gfx_options.h
index 5850b21c66..393627a1a2 100644
--- a/engines/sci/gfx/gfx_options.h
+++ b/engines/sci/gfx/gfx_options.h
@@ -76,7 +76,6 @@ struct gfx_options_t {
int dirty_frames;
int workarounds; // Workaround flags - see below
- rect_t pic_port_bounds;
#endif
};
diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp
index c4cea09365..aa7832c493 100644
--- a/engines/sci/gfx/gfx_resmgr.cpp
+++ b/engines/sci/gfx/gfx_resmgr.cpp
@@ -148,7 +148,9 @@ int GfxResManager::getOptionsHash(gfx_resource_type_t type) {
case GFX_RESOURCE_TYPE_PIC:
#ifdef CUSTOM_GRAPHICS_OPTIONS
if (_version >= SCI_VERSION_01_VGA)
- return _options->pic_port_bounds.y;
+ // NOTE: here, it is assumed that the upper port bound is always 10, but this doesn't seem to matter for the
+ // generated options hash anyway
+ return 10;
else
return (_options->pic0_unscaled) ? 0x10000 : (_options->pic0_dither_mode << 12)
| (_options->pic0_dither_pattern << 8) | (_options->pic0_brush_mode << 4)
diff --git a/engines/sci/gfx/gfx_resource.h b/engines/sci/gfx/gfx_resource.h
index 3d49b927a9..44ae01828e 100644
--- a/engines/sci/gfx/gfx_resource.h
+++ b/engines/sci/gfx/gfx_resource.h
@@ -159,10 +159,10 @@ void gfxr_free_view(gfxr_view_t *view);
/*********************/
-void gfxr_clear_pic0(gfxr_pic_t *pic, int sci_titlebar_size);
+void gfxr_clear_pic0(gfxr_pic_t *pic, int titlebar_size);
/* Clears all pic buffers of one pic
** Parameters: (gfxr_pic_t) pic: The picture to clear
-** (int) sci_titlebar_size: How much space to reserve for the title bar
+** (int) titlebar_size: How much space to reserve for the title bar
** Returns : (void)
** This function should be called before gfxr_draw_pic0, unless cumulative
** drawing is intended
diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp
index 923e310d8c..186d2acb3d 100644
--- a/engines/sci/gfx/operations.cpp
+++ b/engines/sci/gfx/operations.cpp
@@ -434,6 +434,7 @@ int gfxop_init(int version, gfx_state_t *state, gfx_options_t *options, Resource
state->pic = state->pic_unscaled = NULL;
state->pic_nr = -1; // Set background pic number to an invalid value
state->tag_mode = 0;
+ state->pic_port_bounds = gfx_rect(0, 10, 320, 190);
state->dirty_rects = NULL;
do {
diff --git a/engines/sci/gfx/operations.h b/engines/sci/gfx/operations.h
index d680229549..2354a1d641 100644
--- a/engines/sci/gfx/operations.h
+++ b/engines/sci/gfx/operations.h
@@ -127,6 +127,7 @@ struct gfx_state_t {
** which is generally slow */
gfxr_pic_t *pic, *pic_unscaled; /* The background picture and its unscaled equivalent */
+ rect_t pic_port_bounds; /* Picture port bounds */
gfx_dirty_rect_t *dirty_rects; /* Dirty rectangles */
};
diff --git a/engines/sci/gfx/res_pic.cpp b/engines/sci/gfx/res_pic.cpp
index 39906e7fbf..f80ac15d03 100644
--- a/engines/sci/gfx/res_pic.cpp
+++ b/engines/sci/gfx/res_pic.cpp
@@ -190,13 +190,13 @@ gfxr_pic_t *gfxr_init_pic(gfx_mode_t *mode, int ID, int sci1) {
// Pic rendering operations
-void gfxr_clear_pic0(gfxr_pic_t *pic, int sci_titlebar_size) {
- memset(pic->visual_map->index_data, 0x00, (320 * pic->mode->xfact * sci_titlebar_size * pic->mode->yfact));
- memset(pic->visual_map->index_data + (320 * pic->mode->xfact * sci_titlebar_size * pic->mode->yfact),
- 0xff, pic->mode->xfact * 320 * pic->mode->yfact * (200 - sci_titlebar_size)); // white
- memset(pic->priority_map->index_data + (320 * pic->mode->xfact * sci_titlebar_size * pic->mode->yfact),
- 0x0, pic->mode->xfact * 320 * pic->mode->yfact * (200 - sci_titlebar_size));
- memset(pic->priority_map->index_data, 0x0a, sci_titlebar_size * (pic->mode->yfact * 320 * pic->mode->xfact));
+void gfxr_clear_pic0(gfxr_pic_t *pic, int titlebar_size) {
+ memset(pic->visual_map->index_data, 0x00, (320 * pic->mode->xfact * titlebar_size * pic->mode->yfact));
+ memset(pic->visual_map->index_data + (320 * pic->mode->xfact * titlebar_size * pic->mode->yfact),
+ 0xff, pic->mode->xfact * 320 * pic->mode->yfact * (200 - titlebar_size)); // white
+ memset(pic->priority_map->index_data + (320 * pic->mode->xfact * titlebar_size * pic->mode->yfact),
+ 0x0, pic->mode->xfact * 320 * pic->mode->yfact * (200 - titlebar_size));
+ memset(pic->priority_map->index_data, 0x0a, titlebar_size * (pic->mode->yfact * 320 * pic->mode->xfact));
memset(pic->control_map->index_data, 0, GFXR_AUX_MAP_SIZE);
memset(pic->aux_map, 0, GFXR_AUX_MAP_SIZE);
}
@@ -226,10 +226,10 @@ void gfxr_clear_pic0(gfxr_pic_t *pic, int sci_titlebar_size) {
}; \
buffer[linewidth * y + x] operation color;
-static void _gfxr_auxbuf_line_draw(gfxr_pic_t *pic, rect_t line, int color, int color2, int sci_titlebar_size) {
+static void _gfxr_auxbuf_line_draw(gfxr_pic_t *pic, rect_t line, int color, int color2, int titlebar_size) {
int dx, dy, incrE, incrNE, d, finalx, finaly;
int x = line.x;
- int y = line.y + sci_titlebar_size;
+ int y = line.y + titlebar_size;
unsigned char *buffer = pic->aux_map;
int linewidth = 320;
@@ -272,10 +272,10 @@ static void _gfxr_auxbuf_line_draw(gfxr_pic_t *pic, rect_t line, int color, int
}
}
-static void _gfxr_auxbuf_line_clear(gfxr_pic_t *pic, rect_t line, int color, int sci_titlebar_size) {
+static void _gfxr_auxbuf_line_clear(gfxr_pic_t *pic, rect_t line, int color, int titlebar_size) {
int dx, dy, incrE, incrNE, d, finalx, finaly;
int x = line.x;
- int y = line.y + sci_titlebar_size;
+ int y = line.y + titlebar_size;
unsigned char *buffer = pic->aux_map;
int linewidth = 320;
@@ -819,7 +819,7 @@ static void _gfxr_plot_aux_pattern(gfxr_pic_t *pic, int x, int y, int size, int
}
static void _gfxr_draw_pattern(gfxr_pic_t *pic, int x, int y, int color, int priority, int control, int drawenable,
- int pattern_code, int pattern_size, int pattern_nr, gfx_brush_mode_t brush_mode, int sci_titlebar_size) {
+ int pattern_code, int pattern_size, int pattern_nr, gfx_brush_mode_t brush_mode, int titlebar_size) {
int xsize = (pattern_size + 1) * pic->mode->xfact - 1;
int ysize = (pattern_size + 1) * pic->mode->yfact - 1;
int scaled_x, scaled_y;
@@ -828,13 +828,13 @@ static void _gfxr_draw_pattern(gfxr_pic_t *pic, int x, int y, int color, int pri
p0printf(stderr, "Pattern at (%d,%d) size %d, rand=%d, code=%02x\n", x, y, pattern_size, pattern_nr, pattern_code);
- y += sci_titlebar_size;
+ y += titlebar_size;
if (x - pattern_size < 0)
x = pattern_size;
- if (y - pattern_size < sci_titlebar_size)
- y = sci_titlebar_size + pattern_size;
+ if (y - pattern_size < titlebar_size)
+ y = titlebar_size + pattern_size;
if (x + pattern_size > max_x)
x = max_x - pattern_size;
@@ -848,8 +848,8 @@ static void _gfxr_draw_pattern(gfxr_pic_t *pic, int x, int y, int color, int pri
if (scaled_x < xsize)
scaled_x = xsize;
- if (scaled_y < ysize + sci_titlebar_size * pic->mode->yfact)
- scaled_y = ysize + sci_titlebar_size * pic->mode->yfact;
+ if (scaled_y < ysize + titlebar_size * pic->mode->yfact)
+ scaled_y = ysize + titlebar_size * pic->mode->yfact;
if (scaled_x > (320 * pic->mode->xfact) - 1 - xsize)
scaled_x = (320 * pic->mode->xfact) - 1 - xsize;
@@ -934,7 +934,7 @@ static void _gfxr_draw_subline(gfxr_pic_t *pic, int x, int y, int ex, int ey, in
}
static void _gfxr_draw_line(gfxr_pic_t *pic, int x, int y, int ex, int ey, int color,
- int priority, int control, int drawenable, int line_mode, int cmd, int sci_titlebar_size) {
+ int priority, int control, int drawenable, int line_mode, int cmd, int titlebar_size) {
int scale_x = pic->mode->xfact;
int scale_y = pic->mode->yfact;
int xc, yc;
@@ -952,8 +952,8 @@ static void _gfxr_draw_line(gfxr_pic_t *pic, int x, int y, int ex, int ey, int c
return;
}
- y += sci_titlebar_size;
- ey += sci_titlebar_size;
+ y += titlebar_size;
+ ey += titlebar_size;
if (drawenable & GFX_MASK_CONTROL) {
p0printf(" ctl:%x", control);
@@ -967,14 +967,14 @@ static void _gfxr_draw_line(gfxr_pic_t *pic, int x, int y, int ex, int ey, int c
int mask2 = mask;
if (partially_white)
mask2 = mask &= ~GFX_MASK_VISUAL;
- _gfxr_auxbuf_line_draw(pic, line, mask, mask2, sci_titlebar_size);
+ _gfxr_auxbuf_line_draw(pic, line, mask, mask2, titlebar_size);
}
// Calculate everything that is changed to TRANSPARENT
mask = drawenable & (((color == 0xff) ? 1 : 0) | ((!priority) ? 2 : 0) | ((!control) ? 4 : 0));
if (mask)
- _gfxr_auxbuf_line_clear(pic, line, ~mask, sci_titlebar_size);
+ _gfxr_auxbuf_line_clear(pic, line, ~mask, titlebar_size);
x *= scale_x;
y *= scale_y;
@@ -1314,12 +1314,10 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
int pal, index;
int temp;
int line_mode = style->line_mode;
- int sci_titlebar_size;
-#ifdef CUSTOM_GRAPHICS_OPTIONS
- sci_titlebar_size = _options->pic_port_bounds.y;
-#else
- sci_titlebar_size = 10;
-#endif
+ // NOTE: here, it is assumed that the titlebar size is always 10. This may differ depending on
+ // the port bounds y starting point, but we haven't come across a case where this actually occurs.
+ // Also, there is a check further down which sets the titlebar size to 0 if the picture port goes off screen.
+ int titlebar_size = 10;
byte op, opx;
#ifdef FILL_RECURSIVE_DEBUG
@@ -1396,7 +1394,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
GET_ABS_COORDS(x, y);
_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
- pattern_size, pattern_nr, style->brush_mode, sci_titlebar_size);
+ pattern_size, pattern_nr, style->brush_mode, titlebar_size);
while (*(resource + pos) < PIC_OP_FIRST) {
if (pattern_code & PATTERN_FLAG_USE_PATTERN) {
@@ -1407,7 +1405,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
GET_REL_COORDS(x, y);
_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
- pattern_size, pattern_nr, style->brush_mode, sci_titlebar_size);
+ pattern_size, pattern_nr, style->brush_mode, titlebar_size);
}
goto end_op_loop;
@@ -1424,7 +1422,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
fprintf(stderr, " to %d,%d\n", x, y);
#endif
_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
- PIC_OP_MEDIUM_LINES, sci_titlebar_size);
+ PIC_OP_MEDIUM_LINES, titlebar_size);
oldx = x;
oldy = y;
}
@@ -1436,7 +1434,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
while (*(resource + pos) < PIC_OP_FIRST) {
GET_ABS_COORDS(x, y);
_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
- PIC_OP_LONG_LINES, sci_titlebar_size);
+ PIC_OP_LONG_LINES, titlebar_size);
oldx = x;
oldy = y;
}
@@ -1450,7 +1448,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
while (*(resource + pos) < PIC_OP_FIRST) {
GET_REL_COORDS(x, y);
_gfxr_draw_line(pic, oldx, oldy, x, y, color, priority, control, drawenable, line_mode,
- PIC_OP_SHORT_LINES, sci_titlebar_size);
+ PIC_OP_SHORT_LINES, titlebar_size);
oldx = x;
oldy = y;
}
@@ -1462,16 +1460,16 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
//fprintf(stderr,"####################\n");
GET_ABS_COORDS(x, y);
p0printf("Abs coords %d,%d\n", x, y);
- //fprintf(stderr,"C=(%d,%d)\n", x, y + sci_titlebar_size);
+ //fprintf(stderr,"C=(%d,%d)\n", x, y + titlebar_size);
#ifdef WITH_PIC_SCALING
if (pic->mode->xfact > 1 || pic->mode->yfact > 1)
- _gfxr_fill_any(pic, x, y + sci_titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ?
- color : 0, priority, control, drawenable, sci_titlebar_size);
+ _gfxr_fill_any(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ?
+ color : 0, priority, control, drawenable, titlebar_size);
else
#endif
- _gfxr_fill_1(pic, x, y + sci_titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ?
- color : 0, priority, control, drawenable, sci_titlebar_size);
+ _gfxr_fill_1(pic, x, y + titlebar_size, (flags & DRAWPIC01_FLAG_FILL_NORMALLY) ?
+ color : 0, priority, control, drawenable, titlebar_size);
#ifdef FILL_RECURSIVE_DEBUG
if (!fillmagc) {
@@ -1530,7 +1528,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
GET_ABS_COORDS(x, y);
_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
- pattern_size, pattern_nr, style->brush_mode, sci_titlebar_size);
+ pattern_size, pattern_nr, style->brush_mode, titlebar_size);
}
goto end_op_loop;
@@ -1557,7 +1555,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
GET_ABS_COORDS(oldx, oldy);
_gfxr_draw_pattern(pic, oldx, oldy, color, priority, control, drawenable, pattern_code,
- pattern_size, pattern_nr, style->brush_mode, sci_titlebar_size);
+ pattern_size, pattern_nr, style->brush_mode, titlebar_size);
x = oldx;
y = oldy;
@@ -1570,7 +1568,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
GET_MEDREL_COORDS(x, y);
_gfxr_draw_pattern(pic, x, y, color, priority, control, drawenable, pattern_code,
- pattern_size, pattern_nr, style->brush_mode, sci_titlebar_size);
+ pattern_size, pattern_nr, style->brush_mode, titlebar_size);
}
goto end_op_loop;
@@ -1693,8 +1691,8 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
// Hack to prevent overflowing the visual map buffer.
// Yes, this does happen otherwise.
- if (view->index_height + sci_titlebar_size > 200)
- sci_titlebar_size = 0;
+ if (view->index_height + titlebar_size > 200)
+ titlebar_size = 0;
// Set up mode structure for resizing the view
Graphics::PixelFormat format = { 1, 0, 0, 0, 0, 0, 0, 0, 0 }; // 1byte/p, which handles masks and the rest for us
@@ -1708,10 +1706,10 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
view->palette = NULL;
if (flags & DRAWPIC01_FLAG_OVERLAID_PIC)
- view_transparentize(view, pic->visual_map, posx, sci_titlebar_size + posy,
+ view_transparentize(view, pic->visual_map, posx, titlebar_size + posy,
view->index_width, view->index_height);
- _gfx_crossblit_simple(pic->visual_map->index_data + (sci_titlebar_size * 320) + posy * 320 + posx,
+ _gfx_crossblit_simple(pic->visual_map->index_data + (titlebar_size * 320) + posy * 320 + posx,
view->index_data, pic->visual_map->index_width, view->index_width,
view->index_width, view->index_height, 1);
@@ -1789,13 +1787,11 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
int vector_data_ptr = READ_LE_UINT16(resource + 16);
int palette_data_ptr = READ_LE_UINT16(resource + 28);
int bitmap_data_ptr = READ_LE_UINT16(resource + 32);
- int sci_titlebar_size;
-#ifdef CUSTOM_GRAPHICS_OPTIONS
- sci_titlebar_size = _options->pic_port_bounds.y;
-#else
- sci_titlebar_size = 10;
-#endif
gfx_pixmap_t *view = NULL;
+ // NOTE: here, it is assumed that the titlebar size is always 10. This may differ depending on
+ // the port bounds y starting point, but we haven't come across a case where this actually occurs.
+ // Also, there is a check further down which sets the titlebar size to 0 if the picture port goes off screen.
+ int titlebar_size = 10;
if (pic->visual_map->palette) pic->visual_map->palette->free();
pic->visual_map->palette = gfxr_read_pal11(-1, resource + palette_data_ptr, 1284);
@@ -1818,10 +1814,10 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
// Hack to prevent overflowing the visual map buffer.
// Yes, this does happen otherwise.
- if (view->index_height + sci_titlebar_size > 200)
- sci_titlebar_size = 0;
+ if (view->index_height + titlebar_size > 200)
+ titlebar_size = 0;
- _gfx_crossblit_simple(pic->visual_map->index_data + sci_titlebar_size*view->index_width,
+ _gfx_crossblit_simple(pic->visual_map->index_data + titlebar_size*view->index_width,
view->index_data,
pic->visual_map->index_width, view->index_width,
view->index_width,