Fixed the incorrectly placed views in the KQ6 intro, by reintroducing port bounds in the graphics resource manager and removing two relevant hacks

svn-id: r40803
This commit is contained in:
Filippos Karapetis 2009-05-23 10:07:01 +00:00
parent 248f415fac
commit 3811df7aca
5 changed files with 33 additions and 31 deletions

View File

@ -2377,6 +2377,9 @@ reg_t kSetPort(EngineState *s, int funct_nr, int argc, reg_t *argv) {
if (s->_gameName != "LSL6") {
s->gfx_state->pic_port_bounds = gfx_rect(UKPV(5), UKPV(4), UKPV(3), UKPV(2));
// Notify the graphics resource manager that the pic port bounds changed
s->gfx_state->gfxResMan->changePortBounds(UKPV(5), UKPV(4), UKPV(3), UKPV(2));
// FIXME: Should really only invalidate all loaded pic resources here;
// this is overkill
s->gfx_state->gfxResMan->freeAllResources();

View File

@ -54,6 +54,8 @@ GfxResManager::GfxResManager(int version, bool isVGA, gfx_options_t *options, gf
_lockCounter(0), _tagLockCounter(0), _staticPalette(0) {
gfxr_init_static_palette();
_portBounds = Common::Rect(0, 10, 320, 200); // default value, with a titlebar of 10px
if (_version < SCI_VERSION_01_VGA || !_isVGA) {
_staticPalette = gfx_sci0_pic_colors->getref();
} else if (_version == SCI_VERSION_1_1) {
@ -74,12 +76,6 @@ GfxResManager::~GfxResManager() {
_staticPalette = 0;
}
#define DRAW_PIC01(pic, picStyle, isSci1) \
gfxr_draw_pic01((pic), flags, default_palette, res->size, res->data, (picStyle), res->id, (isSci1), _staticPalette);
#define DRAW_PIC11(pic, picStyle) \
gfxr_draw_pic11((pic), flags, default_palette, res->size, res->data, (picStyle), res->id, _staticPalette);
int GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pic, int flags, int default_palette, int nr) {
Resource *res = _resManager->findResource(kResourceTypePic, nr, 0);
int need_unscaled = unscaled_pic != NULL;
@ -101,18 +97,18 @@ int GfxResManager::calculatePic(gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pic
if (need_unscaled) {
if (_version == SCI_VERSION_1_1)
DRAW_PIC11(unscaled_pic, &basic_style)
gfxr_draw_pic11(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id, _staticPalette, _portBounds);
else
DRAW_PIC01(unscaled_pic, &basic_style, _isVGA)
gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id, _isVGA, _staticPalette, _portBounds);
}
if (scaled_pic && scaled_pic->undithered_buffer)
memcpy(scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer, scaled_pic->undithered_buffer_size);
if (_version == SCI_VERSION_1_1)
DRAW_PIC11(scaled_pic, &style)
gfxr_draw_pic11(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id, _staticPalette, _portBounds);
else
DRAW_PIC01(scaled_pic, &style, _isVGA)
gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id, _isVGA, _staticPalette, _portBounds);
if (!_isVGA) {
if (need_unscaled)

View File

@ -34,6 +34,7 @@
#include "sci/resource.h"
#include "common/hashmap.h"
#include "common/rect.h"
namespace Sci {
@ -227,6 +228,13 @@ public:
// Set static palette and merge it into the global palette
void setStaticPalette(Palette *newPalette);
/*
** Sets the picture port bounds
*/
void changePortBounds(int x1, int y1, int x2, int y2) {
_portBounds = Common::Rect(x1, y1, x2, y2);
}
#if 0
void setPaletteIntensity(int16 from, int16 to, int16 intensity) {
Palette *pal = _staticPalette->getref();
@ -257,6 +265,7 @@ private:
** of the lock_counter, as will any resources referenced afterwards.
*/
int _tagLockCounter; /* lock counter value at tag time */
Common::Rect _portBounds;
IntResMap _resourceMaps[GFX_RESOURCE_TYPES_NR];
ResourceManager *_resManager;

View File

@ -31,6 +31,8 @@
#include "sci/gfx/gfx_system.h"
#include "sci/gfx/gfx_driver.h"
#include "common/rect.h"
namespace Common {
class File;
}
@ -172,7 +174,7 @@ void gfxr_clear_pic0(gfxr_pic_t *pic, int titlebar_size);
void gfxr_draw_pic01(gfxr_pic_t *pic, int fill_normally, int default_palette,
int size, byte *resource, gfxr_pic0_params_t *style, int resid, int sci1,
Palette *static_pal);
Palette *static_pal, Common::Rect portBounds);
/* Draws a pic resource (all formats prior to SCI1.1)
** Parameters: (gfxr_pic_t *) pic: The pic to draw to
** (int) fill_normally: If 1, the pic is drawn normally; if 0, all
@ -193,7 +195,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int fill_normally, int default_palette,
void gfxr_draw_pic11(gfxr_pic_t *pic, int fill_normally, int default_palette,
int size, byte *resource, gfxr_pic0_params_t *style, int resid,
Palette *static_pal);
Palette *static_pal, Common::Rect portBounds);
/* Draws a pic resource (SCI1.1)
** Parameters: (gfxr_pic_t *) pic: The pic to draw to
** (int) fill_normally: If 1, the pic is drawn normally; if 0, all

View File

@ -1129,7 +1129,7 @@ extern gfx_pixmap_t *gfxr_draw_cel0(int id, int loop, int cel, byte *resource, i
extern void _gfx_crossblit_simple(byte *dest, byte *src, int dest_line_width, int src_line_width, int xl, int yl, int bpp);
void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size, byte *resource,
gfxr_pic0_params_t *style, int resid, int sci1, Palette *static_pal) {
gfxr_pic0_params_t *style, int resid, int sci1, Palette *static_pal, Common::Rect portBounds) {
const int default_palette_table[GFXR_PIC0_PALETTE_SIZE] = {
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0x88,
@ -1160,10 +1160,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
int pal = 0, index = 0;
int temp;
int line_mode = style->line_mode;
// 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;
int titlebar_size = portBounds.top;
byte op, opx;
#ifdef FILL_RECURSIVE_DEBUG
@ -1540,10 +1537,9 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
} else
view->palette = embedded_view_pal->getref();
// Hack to prevent overflowing the visual map buffer.
// Yes, this does happen otherwise.
if (view->index_height + titlebar_size > 200)
titlebar_size = 0;
// Clip the view's height to fit within the screen buffer
// It can go off screen at some cases, e.g. in KQ6's intro
view->index_height = CLIP<int>(view->index_height, 0, portBounds.height());
// 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
@ -1634,16 +1630,13 @@ end_op_loop: {}
}
void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size, byte *resource,
gfxr_pic0_params_t *style, int resid, Palette *static_pal) {
gfxr_pic0_params_t *style, int resid, Palette *static_pal, Common::Rect portBounds) {
int has_bitmap = READ_LE_UINT16(resource + 4);
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);
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;
int titlebar_size = portBounds.top;
if (pic->visual_map->palette) pic->visual_map->palette->free();
pic->visual_map->palette = gfxr_read_pal11(-1, resource + palette_data_ptr, 1284);
@ -1664,10 +1657,9 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
if (flags & DRAWPIC01_FLAG_OVERLAID_PIC)
view_transparentize(view, pic->visual_map, 0, 0, view->index_width, view->index_height);
// Hack to prevent overflowing the visual map buffer.
// Yes, this does happen otherwise.
if (view->index_height + titlebar_size > 200)
titlebar_size = 0;
// Clip the view's height to fit within the screen buffer
// It can go off screen at some cases, e.g. in KQ6's intro
view->index_height = CLIP<int>(view->index_height, 0, portBounds.height());
_gfx_crossblit_simple(pic->visual_map->index_data + titlebar_size*view->index_width,
view->index_data,
@ -1679,7 +1671,7 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
GFXWARN("No view was contained in SCI1.1 pic resource");
}
gfxr_draw_pic01(pic, flags, default_palette, size - vector_data_ptr, resource + vector_data_ptr, style, resid, 1, static_pal);
gfxr_draw_pic01(pic, flags, default_palette, size - vector_data_ptr, resource + vector_data_ptr, style, resid, 1, static_pal, portBounds);
}
void gfxr_dither_pic0(gfxr_pic_t *pic, int dmode, int pattern) {