aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/console.cpp4
-rw-r--r--engines/sci/engine/kgraphics.cpp4
-rw-r--r--engines/sci/gfx/gfx_options.h4
-rw-r--r--engines/sci/gfx/gfx_pixmap_scale.cpp476
-rw-r--r--engines/sci/gfx/gfx_resmgr.cpp26
-rw-r--r--engines/sci/gfx/gfx_support.cpp4
-rw-r--r--engines/sci/gfx/gfx_system.h3
-rw-r--r--engines/sci/gfx/gfx_tools.cpp20
-rw-r--r--engines/sci/gfx/gfx_tools.h9
-rw-r--r--engines/sci/gfx/operations.cpp10
-rw-r--r--engines/sci/gfx/res_pic.cpp4
-rw-r--r--engines/sci/sci.cpp8
12 files changed, 31 insertions, 541 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp
index 74beb8a76b..e568540683 100644
--- a/engines/sci/console.cpp
+++ b/engines/sci/console.cpp
@@ -1564,12 +1564,12 @@ bool Console::cmdShowMap(int argc, const char **argv) {
break;
case 1:
- gfx_xlate_pixmap(_vm->_gamestate->gfx_state->pic->priority_map, _vm->_gamestate->gfx_state->driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(_vm->_gamestate->gfx_state->pic->priority_map, _vm->_gamestate->gfx_state->driver->getMode());
gfxop_draw_pixmap(_vm->_gamestate->gfx_state, _vm->_gamestate->gfx_state->pic->priority_map, gfx_rect(0, 0, 320, 200), Common::Point(0, 0));
break;
case 2:
- gfx_xlate_pixmap(_vm->_gamestate->gfx_state->control_map, _vm->_gamestate->gfx_state->driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(_vm->_gamestate->gfx_state->control_map, _vm->_gamestate->gfx_state->driver->getMode());
gfxop_draw_pixmap(_vm->_gamestate->gfx_state, _vm->_gamestate->gfx_state->control_map, gfx_rect(0, 0, 320, 200), Common::Point(0, 0));
break;
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index d3ff1bd7fe..7cc80bee3f 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -3387,7 +3387,7 @@ static reg_t kShowMovie_Windows(EngineState *s, int argc, reg_t *argv) {
pixmap->palette = palette;
// Copy the frame to the screen
- gfx_xlate_pixmap(pixmap, s->gfx_state->driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(pixmap, s->gfx_state->driver->getMode());
gfxop_draw_pixmap(s->gfx_state, pixmap, gfx_rect(0, 0, 320, 200), Common::Point(pixmap->xoffset, pixmap->yoffset));
gfxop_update_box(s->gfx_state, gfx_rect(0, 0, 320, 200));
gfx_free_pixmap(pixmap);
@@ -3436,7 +3436,7 @@ static reg_t kShowMovie_DOS(EngineState *s, int argc, reg_t *argv) {
if (frameNr++ == 0)
pixmap->palette->forceInto(s->gfx_state->driver->getMode()->palette);
- gfx_xlate_pixmap(pixmap, s->gfx_state->driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(pixmap, s->gfx_state->driver->getMode());
gfxop_draw_pixmap(s->gfx_state, pixmap, gfx_rect(0, 0, 320, 200), Common::Point(pixmap->xoffset, pixmap->yoffset));
gfxop_update_box(s->gfx_state, gfx_rect(0, 0, 320, 200));
gfx_free_pixmap(pixmap);
diff --git a/engines/sci/gfx/gfx_options.h b/engines/sci/gfx/gfx_options.h
index 03b00ca616..9665df3b9d 100644
--- a/engines/sci/gfx/gfx_options.h
+++ b/engines/sci/gfx/gfx_options.h
@@ -54,10 +54,6 @@ struct gfx_options_t {
gfx_brush_mode_t pic0_brush_mode;
gfx_line_mode_t pic0_line_mode;
- gfx_xlate_filter_t cursor_xlate_filter;
- gfx_xlate_filter_t view_xlate_filter;
- gfx_xlate_filter_t pic_xlate_filter; /* Only relevant if (pic0_unscaled) */
- gfx_xlate_filter_t text_xlate_filter;
gfx_res_fullconf_t res_conf; /* Resource customisation: Per-resource palettes etc. */
int workarounds; // Workaround flags - see below
diff --git a/engines/sci/gfx/gfx_pixmap_scale.cpp b/engines/sci/gfx/gfx_pixmap_scale.cpp
index 41e6102cbd..392f3bbf6b 100644
--- a/engines/sci/gfx/gfx_pixmap_scale.cpp
+++ b/engines/sci/gfx/gfx_pixmap_scale.cpp
@@ -35,12 +35,16 @@
namespace Sci {
+
+// TODO: Replace this code with our common scalers (/graphics/scaler.h)
+
+
#define EXTEND_COLOR(x) (unsigned) ((((unsigned) x) << 24) | (((unsigned) x) << 16) | (((unsigned) x) << 8) | ((unsigned) x))
template<int COPY_BYTES, typename SIZETYPE, int EXTRA_BYTE_OFFSET>
void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
SIZETYPE result_colors[GFX_PIC_COLORS];
- SIZETYPE alpha_color = 0xffffffff & mode->alpha_mask;
+ SIZETYPE alpha_color = 0xffffffff & 0;
SIZETYPE alpha_ormask = 0;
int xfact = (scale) ? mode->xfact : 1;
int yfact = (scale) ? mode->yfact : 1;
@@ -55,7 +59,7 @@ void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale
byte *dest = pxm->data;
byte *alpha_dest = pxm->alpha_map;
int using_alpha = pxm->color_key != GFX_PIXMAP_COLOR_KEY_NONE;
- int separate_alpha_map = (!mode->alpha_mask) && using_alpha;
+ int separate_alpha_map = using_alpha;
if (mode->flags & GFX_MODE_FLAG_REVERSE_ALPHA) {
alpha_ormask = alpha_color;
@@ -120,376 +124,6 @@ void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale
}
}
-
-// linear filter: Macros (in reverse order)
-
-#define X_CALC_INTENSITY_NORMAL (ctexel[i] << 16) + ((linecolor[i]) * (256-column_valuator)) + ((othercolumn[i] * column_valuator)) * (256-line_valuator)
-#define X_CALC_INTENSITY_CENTER (ctexel[i] << 16) + ((linecolor[i]) * (256-column_valuator))
-
-#define WRITE_XPART(X_CALC_INTENSITY, DO_X_STEP) \
- for (subx = 0; subx < ((DO_X_STEP) ? (xfact >> 1) : 1); subx++) { \
- unsigned int intensity; \
- wrcolor = 0; \
- for (i = 0; i < 3; i++) { \
- intensity = X_CALC_INTENSITY; \
- wrcolor |= (intensity >> shifts[i]) & masks[i]; \
- } \
- i = 3; \
- intensity = X_CALC_INTENSITY; \
- if (inverse_alpha) \
- intensity = ~intensity; \
- wrcolor |= (intensity >> shifts[i]) & masks[i]; \
- if (separate_alpha_map) \
- *alpha_wrpos++ = intensity >> 24; \
- wrcolor <<= (EXTRA_BYTE_OFFSET * 8); \
- memcpy(wrpos, &wrcolor, COPY_BYTES); \
- wrpos += COPY_BYTES; \
- if (DO_X_STEP) \
- column_valuator -= column_step; \
- } \
- if (DO_X_STEP) \
- column_step = -column_step
-// End of macro definition
-
-
-#define Y_CALC_INTENSITY_CENTER 0
-#define Y_CALC_INTENSITY_NORMAL otherline[i] * line_valuator
-
-#define WRITE_YPART(DO_Y_STEP, LINE_COLOR) \
- for (suby = 0; suby < ((DO_Y_STEP)? yfact >> 1 : 1); suby++) { \
- int column_valuator = column_step? 128 - (column_step >> 1) : 256; \
- int linecolor[4]; \
- int othercolumn[4]; \
- int i; \
- SIZETYPE wrcolor; \
- wrpos = sublinepos; \
- alpha_wrpos = alpha_sublinepos; \
- for (i = 0; i < 4; i++) \
- linecolor[i] = LINE_COLOR; \
- /*-- left half --*/ \
- MAKE_PIXEL((x == 0), othercolumn, ctexel, src[-1]); \
- WRITE_XPART(X_CALC_INTENSITY_NORMAL, 1); \
- column_valuator -= column_step; \
- /*-- center --*/ \
- if (xfact & 1) { \
- WRITE_XPART(X_CALC_INTENSITY_CENTER, 0); \
- } \
- /*-- right half --*/ \
- MAKE_PIXEL((x + 1 == pxm->index_width), othercolumn, ctexel, src[+1]); \
- WRITE_XPART(X_CALC_INTENSITY_NORMAL, 1); \
- if (DO_Y_STEP) \
- line_valuator -= line_step; \
- sublinepos += pxm->width * bytespp; \
- alpha_sublinepos += pxm->width; \
- } \
- if (DO_Y_STEP) \
- line_step = -line_step
-// End of macro definition
-
-
-template<int COPY_BYTES, typename SIZETYPE, int EXTRA_BYTE_OFFSET>
-void _gfx_xlate_pixmap_linear(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
- int xfact = mode->xfact;
- int yfact = mode->yfact;
- int line_step = (yfact < 2) ? 0 : 256 / (yfact & ~1);
- int column_step = (xfact < 2) ? 0 : 256 / (xfact & ~1);
- int bytespp = mode->bytespp;
- byte *src = pxm->index_data;
- byte *dest = pxm->data;
- byte *alpha_dest = pxm->alpha_map;
- int using_alpha = pxm->color_key != GFX_PIXMAP_COLOR_KEY_NONE;
- int separate_alpha_map = (!mode->alpha_mask) && using_alpha;
- unsigned int masks[4], shifts[4], zero[3];
- int x, y;
- byte inverse_alpha = mode->flags & GFX_MODE_FLAG_REVERSE_ALPHA;
-
- zero[0] = 255;
- zero[1] = zero[2] = 0;
-
- if (separate_alpha_map) {
- masks[3] = 0;
- shifts[3] = 24;
- }
-
- assert(bytespp == COPY_BYTES);
- assert(!mode->palette);
-
- masks[0] = mode->red_mask;
- masks[1] = mode->green_mask;
- masks[2] = mode->blue_mask;
- masks[3] = mode->alpha_mask;
- shifts[0] = mode->red_shift;
- shifts[1] = mode->green_shift;
- shifts[2] = mode->blue_shift;
- shifts[3] = mode->alpha_shift;
-
- if (separate_alpha_map && !alpha_dest)
- alpha_dest = pxm->alpha_map = (byte *)malloc(pxm->index_width * xfact * pxm->index_height * yfact);
-
- for (y = 0; y < pxm->index_height; y++) {
- byte *linepos = dest;
- byte *alpha_linepos = alpha_dest;
-
- for (x = 0; x < pxm->index_width; x++) {
- int otherline[4]; // the above line or the line below
- int ctexel[4]; // Current texel
- int subx, suby;
- int line_valuator = line_step ? 128 - (line_step >> 1) : 256;
- byte *wrpos, *alpha_wrpos;
- byte *sublinepos = linepos;
- byte *alpha_sublinepos = alpha_linepos;
-
- ctexel[0] = ctexel[1] = ctexel[2] = ctexel[3] = 0;
-
-#define MAKE_PIXEL(cond, rec, other, nr) \
- if ((cond) || (using_alpha && nr == pxm->color_key)) { \
- rec[0] = other[0] - ctexel[0]; \
- rec[1] = other[1] - ctexel[1]; \
- rec[2] = other[2] - ctexel[2]; \
- rec[3] = 0xffff - ctexel[3]; \
- } else { \
- const PaletteEntry& e = (*pxm->palette)[nr]; \
- rec[0] = (EXTEND_COLOR(e.r) >> 16) - ctexel[0]; \
- rec[1] = (EXTEND_COLOR(e.g) >> 16) - ctexel[1]; \
- rec[2] = (EXTEND_COLOR(e.b) >> 16) - ctexel[2]; \
- rec[3] = 0 - ctexel[3]; \
- }
-
- MAKE_PIXEL(0, ctexel, zero, *src);
-
- //-- Upper half --
- MAKE_PIXEL((y == 0), otherline, ctexel, src[-pxm->index_width]);
- WRITE_YPART(1, Y_CALC_INTENSITY_NORMAL);
-
- if (yfact & 1) {
- WRITE_YPART(0, Y_CALC_INTENSITY_CENTER);
- }
-
- //-- Lower half --
- line_valuator -= line_step;
- MAKE_PIXEL((y + 1 == pxm->index_height), otherline, ctexel, src[pxm->index_width]);
- WRITE_YPART(1, Y_CALC_INTENSITY_NORMAL);
-
- src++;
- linepos += xfact * bytespp;
- alpha_linepos += xfact;
- }
-
- dest += pxm->width * yfact * bytespp;
- alpha_dest += pxm->width * yfact;
- }
-}
-
-
-//----------------------
-//** Trilinear filter **
-//----------------------
-
-
-#ifndef GFX_GET_PIXEL_DELTA
-#define GFX_GET_PIXEL_DELTA
-static void gfx_get_pixel_delta(unsigned int *color, int *delta, unsigned int *pixel0, unsigned int *pixel1) {
- int j;
- int transp0 = pixel0[3] == 0xffffff;
- int transp1 = pixel1[3] == 0xffffff;
-
- if (transp0 && !transp1) { // Transparent -> Opaque
- memset(delta, 0, sizeof(int) * 3);
- delta[3] = ((pixel1[3] >> 8) - (pixel0[3] >> 8));
- memcpy(color, pixel1, sizeof(int) * 3);
- color[3] = 0xffffff;
- } else if (!transp0 && transp1) { // Opaque -> Transparent
- memset(delta, 0, sizeof(int) * 3);
- delta[3] = ((pixel1[3] >> 8) - (pixel0[3] >> 8));
- memcpy(color, pixel0, sizeof(int) * 4);
- } else if (transp0 && transp1) { // Transparent
- delta[3] = 0;
- color[3] = 0xffffff;
- } else { // Opaque
- memcpy(color, pixel0, sizeof(int) * 4);
- for (j = 0; j < 4; j++)
- delta[j] = ((pixel1[j] >> 8) - (pixel0[j] >> 8));
- }
-}
-
-
-static void gfx_apply_delta(unsigned int *color, int *delta, int factor) {
- int i;
-
- for (i = 0; i < 4; i++)
- color[i] += delta[i] * factor;
-}
-#endif
-
-#define MAKE_PIXEL_TRILINEAR(cond, rec, nr) \
- if (!(cond) || (using_alpha && nr == pxm->color_key)) { \
- rec[0] = 0; \
- rec[1] = 0; \
- rec[2] = 0; \
- rec[3] = 0xffffff; \
- } else { \
- const PaletteEntry& e = (*pxm->palette)[nr]; \
- rec[0] = (EXTEND_COLOR(e.r) >> 8); \
- rec[1] = (EXTEND_COLOR(e.g) >> 8); \
- rec[2] = (EXTEND_COLOR(e.b) >> 8); \
- rec[3] = 0; \
- }
-
-#define REVERSE_ALPHA(foo) ((inverse_alpha) ? ~(foo) : (foo))
-
-template<int COPY_BYTES, typename SIZETYPE, int EXTRA_BYTE_OFFSET>
-void _gfx_xlate_pixmap_trilinear(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
- int xfact = mode->xfact;
- int yfact = mode->yfact;
- int line_step = (yfact < 2) ? 0 : 256 / yfact;
- int column_step = (xfact < 2) ? 0 : 256 / xfact;
- int bytespp = mode->bytespp;
- byte *src = pxm->index_data;
- byte *dest = pxm->data;
- byte *alpha_dest = pxm->alpha_map;
- int using_alpha = pxm->color_key != GFX_PIXMAP_COLOR_KEY_NONE;
- int separate_alpha_map = (!mode->alpha_mask) && using_alpha;
- unsigned int masks[4], shifts[4];
- unsigned int pixels[4][4];
- // 0 1
- // 2 3
- int x, y;
- byte inverse_alpha = mode->flags & GFX_MODE_FLAG_REVERSE_ALPHA;
-
- if (separate_alpha_map) {
- masks[3] = 0;
- shifts[3] = 24;
- }
-
- assert(bytespp == COPY_BYTES);
- assert(!mode->palette);
-
- masks[0] = mode->red_mask;
- masks[1] = mode->green_mask;
- masks[2] = mode->blue_mask;
- masks[3] = mode->alpha_mask;
- shifts[0] = mode->red_shift;
- shifts[1] = mode->green_shift;
- shifts[2] = mode->blue_shift;
- shifts[3] = mode->alpha_shift;
-
- if (!(pxm->index_width && pxm->index_height))
- return;
-
- if (separate_alpha_map && !alpha_dest)
- alpha_dest = pxm->alpha_map = (byte *)malloc(pxm->index_width * xfact * pxm->index_height * yfact);
-
- src -= pxm->index_width + 1;
-
- for (y = 0; y <= pxm->index_height; y++) {
- byte *y_dest_backup = dest;
- byte *y_alpha_dest_backup = alpha_dest;
- int y_valuator = (y > 0) ? 0 : 128;
- int yc_count;
-
-
- if (y == 0)
- yc_count = yfact >> 1;
- else if (y == pxm->index_height)
- yc_count = (yfact + 1) >> 1;
- else
- yc_count = yfact;
-
- if (yfact & 1)
- y_valuator += line_step >> 1;
-
- for (x = 0; x <= pxm->index_width; x++) {
- byte *x_dest_backup = dest;
- byte *x_alpha_dest_backup = alpha_dest;
- int x_valuator = (x > 0) ? 0 : 128;
- int xc_count;
- unsigned int leftcolor[4], rightcolor[4];
- int leftdelta[4], rightdelta[4];
- int xc, yc;
-
- if (x == 0)
- xc_count = xfact >> 1;
- else if (x == pxm->index_width)
- xc_count = (xfact + 1) >> 1;
- else
- xc_count = xfact;
-
- if (xfact & 1)
- x_valuator += column_step >> 1;
-
- MAKE_PIXEL_TRILINEAR((y && x), pixels[0], *src);
- MAKE_PIXEL_TRILINEAR((y && (x < pxm->index_width)), pixels[1], src[1]);
- MAKE_PIXEL_TRILINEAR(((y < pxm->index_width) && x), pixels[2], src[pxm->index_width]);
- MAKE_PIXEL_TRILINEAR(((y < pxm->index_width) && (x < pxm->index_width)), pixels[3], src[pxm->index_width + 1]);
-
- // Optimize Me
-
- gfx_get_pixel_delta(leftcolor, leftdelta, pixels[0], pixels[2]);
- gfx_get_pixel_delta(rightcolor, rightdelta, pixels[1], pixels[3]);
- gfx_apply_delta(leftcolor, leftdelta, y_valuator);
- gfx_apply_delta(rightcolor, rightdelta, y_valuator);
-
- for (yc = 0; yc < yc_count; yc++) {
- unsigned int color[4];
- int delta[4];
- byte *yc_dest_backup = dest;
- byte *yc_alpha_dest_backup = alpha_dest;
-
- gfx_get_pixel_delta(color, delta, leftcolor, rightcolor);
-
- gfx_apply_delta(color, delta, x_valuator);
-
- for (xc = 0; xc < xc_count; xc++) {
- SIZETYPE wrcolor;
- int i;
- wrcolor = 0;
-
- for (i = 0; i < 3; i++)
- wrcolor |= ((color[i] << 8) >> shifts[i]) & masks[i];
-
- if (separate_alpha_map) {
- *alpha_dest++ = REVERSE_ALPHA(color[3] >> 16);
- } else
- wrcolor |= REVERSE_ALPHA((color[3] << 8) >> shifts[3]) & masks[3];
-
- wrcolor <<= (EXTRA_BYTE_OFFSET * 8);
-
- memcpy(dest, &wrcolor, COPY_BYTES);
- dest += COPY_BYTES;
- gfx_apply_delta(color, delta, column_step);
- }
- gfx_apply_delta(leftcolor, leftdelta, line_step);
- gfx_apply_delta(rightcolor, rightdelta, line_step);
-
- dest = yc_dest_backup + pxm->index_width * xfact * COPY_BYTES;
- alpha_dest = yc_alpha_dest_backup + pxm->index_width * xfact;
- }
-
- dest = x_dest_backup + xc_count * COPY_BYTES;
- alpha_dest = x_alpha_dest_backup + xc_count;
-
- if (x < pxm->index_width)
- src++;
- }
- dest = y_dest_backup + pxm->index_width * xfact * yc_count * COPY_BYTES;
- alpha_dest = y_alpha_dest_backup + pxm->index_width * xfact * yc_count;
- }
-}
-
-#undef REVERSE_ALPHA
-#undef WRITE_YPART
-#undef Y_CALC_INTENSITY_CENTER
-#undef Y_CALC_INTENSITY_NORMAL
-#undef WRITE_XPART
-#undef X_CALC_INTENSITY_CENTER
-#undef X_CALC_INTENSITY_NORMAL
-#undef MAKE_PIXEL_TRILINEAR
-#undef MAKE_PIXEL
-#undef SIZETYPE
-#undef EXTEND_COLOR
-
-
-
static void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
switch (mode->bytespp) {
@@ -526,80 +160,8 @@ static void _gfx_xlate_pixmap_unfiltered(gfx_mode_t *mode, gfx_pixmap_t *pxm, in
}
}
-static void _gfx_xlate_pixmap_linear(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
- if (mode->palette || !scale) { // fall back to unfiltered
- _gfx_xlate_pixmap_unfiltered(mode, pxm, scale);
- return;
- }
-
- pxm->width = pxm->index_width * mode->xfact;
- pxm->height = pxm->index_height * mode->yfact;
-
- switch (mode->bytespp) {
-
- case 1:
- _gfx_xlate_pixmap_linear<1, uint8, 0>(mode, pxm, scale);
- break;
-
- case 2:
- _gfx_xlate_pixmap_linear<2, uint16, 0>(mode, pxm, scale);
- break;
-
- case 3:
-#ifdef SCUMM_BIG_ENDIAN
- _gfx_xlate_pixmap_linear<3, uint32, 1>(mode, pxm, scale);
-#else
- _gfx_xlate_pixmap_linear<3, uint32, 0>(mode, pxm, scale);
-#endif
- break;
-
- case 4:
- _gfx_xlate_pixmap_linear<4, uint32, 0>(mode, pxm, scale);
- break;
-
- default:
- error("Invalid mode->bytespp=%d", mode->bytespp);
- }
-
-}
-
-static void _gfx_xlate_pixmap_trilinear(gfx_mode_t *mode, gfx_pixmap_t *pxm, int scale) {
- if (mode->palette || !scale) { // fall back to unfiltered
- _gfx_xlate_pixmap_unfiltered(mode, pxm, scale);
- return;
- }
-
- pxm->width = pxm->index_width * mode->xfact;
- pxm->height = pxm->index_height * mode->yfact;
-
- switch (mode->bytespp) {
- case 1:
- _gfx_xlate_pixmap_trilinear<1, uint8, 0>(mode, pxm, scale);
- break;
-
- case 2:
- _gfx_xlate_pixmap_trilinear<2, uint16, 0>(mode, pxm, scale);
- break;
-
- case 3:
-#ifdef SCUMM_BIG_ENDIAN
- _gfx_xlate_pixmap_trilinear<3, uint32, 1>(mode, pxm, scale);
-#else
- _gfx_xlate_pixmap_trilinear<3, uint32, 0>(mode, pxm, scale);
-#endif
- break;
-
- case 4:
- _gfx_xlate_pixmap_trilinear<4, uint32, 0>(mode, pxm, scale);
- break;
-
- default:
- error("Invalid mode->bytespp=%d", mode->bytespp);
- }
-}
-
-void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode, gfx_xlate_filter_t filter) {
+void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode) {
int was_allocated = 0;
if (mode->palette) {
@@ -614,33 +176,13 @@ void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode, gfx_xlate_filter_t fi
// Assume that memory, if allocated already, will be sufficient
// Allocate alpha map
- if (!mode->alpha_mask && pxm->colors_nr() < GFX_PIC_COLORS)
+ if (pxm->colors_nr() < GFX_PIC_COLORS)
pxm->alpha_map = (byte*)malloc(mode->xfact * mode->yfact * pxm->index_width * pxm->index_height + 1);
} else
was_allocated = 1;
- switch (filter) {
- case GFX_XLATE_FILTER_NONE:
- _gfx_xlate_pixmap_unfiltered(mode, pxm, !(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX));
- break;
+ _gfx_xlate_pixmap_unfiltered(mode, pxm, !(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX));
- case GFX_XLATE_FILTER_LINEAR:
- _gfx_xlate_pixmap_linear(mode, pxm, !(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX));
- break;
-
- case GFX_XLATE_FILTER_TRILINEAR:
- _gfx_xlate_pixmap_trilinear(mode, pxm, !(pxm->flags & GFX_PIXMAP_FLAG_SCALED_INDEX));
- break;
-
- default:
- error("Attempt to filter pixmap %04x in invalid mode #%d", pxm->ID, filter);
-
- if (!was_allocated) {
- if (!mode->alpha_mask && pxm->colors_nr() < GFX_PIC_COLORS)
- free(pxm->alpha_map);
- free(pxm->data);
- }
- }
if (pxm->palette)
pxm->palette_revision = pxm->palette->getRevision();
}
diff --git a/engines/sci/gfx/gfx_resmgr.cpp b/engines/sci/gfx/gfx_resmgr.cpp
index 9aa829c90c..405b1a7b72 100644
--- a/engines/sci/gfx/gfx_resmgr.cpp
+++ b/engines/sci/gfx/gfx_resmgr.cpp
@@ -292,14 +292,14 @@ void GfxResManager::setStaticPalette(Palette *newPalette)
#define XLATE_AS_APPROPRIATE(key, entry) \
if (maps & key) { \
if (res->unscaled_data.pic&& (force || !res->unscaled_data.pic->entry->data)) { \
- gfx_xlate_pixmap(res->unscaled_data.pic->entry, mode, filter); \
+ gfx_xlate_pixmap(res->unscaled_data.pic->entry, mode); \
} if (scaled && res->scaled_data.pic && (force || !res->scaled_data.pic->entry->data)) { \
- gfx_xlate_pixmap(res->scaled_data.pic->entry, mode, filter); \
+ gfx_xlate_pixmap(res->scaled_data.pic->entry, mode); \
} \
}
static gfxr_pic_t *gfxr_pic_xlate_common(gfx_resource_t *res, int maps, int scaled, int force, gfx_mode_t *mode,
- gfx_xlate_filter_t filter, gfx_options_t *options) {
+ gfx_options_t *options) {
XLATE_AS_APPROPRIATE(GFX_MASK_VISUAL, visual_map);
XLATE_AS_APPROPRIATE(GFX_MASK_PRIORITY, priority_map);
@@ -320,8 +320,6 @@ gfx_mode_t mode_1x1_color_index = { /* Fake 1x1 mode */
/* flags */ 0,
/* palette */ NULL,
- /* color masks */ 0, 0, 0, 0,
- /* color shifts */ 0, 0, 0, 0,
Graphics::PixelFormat()
};
@@ -392,10 +390,10 @@ gfxr_pic_t *GfxResManager::getPic(int num, int maps, int flags, int default_pale
#ifdef CUSTOM_GRAPHICS_OPTIONS
npic = gfxr_pic_xlate_common(res, maps, scaled || _options->pic0_unscaled, 0, _driver->getMode(),
- _options->pic_xlate_filter, _options);
+ _options);
#else
npic = gfxr_pic_xlate_common(res, maps, 1, 0, _driver->getMode(),
- GFX_XLATE_FILTER_NONE, _options);
+ _options);
#endif
@@ -494,9 +492,9 @@ gfxr_pic_t *GfxResManager::addToPic(int old_nr, int new_nr, int flags, int old_d
int old_ID = get_pic_id(res);
set_pic_id(res, GFXR_RES_ID(GFX_RESOURCE_TYPE_PIC, new_nr)); // To ensure that our graphical translation options work properly
#ifdef CUSTOM_GRAPHICS_OPTIONS
- pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), _options->pic_xlate_filter, _options);
+ pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), _options);
#else
- pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), GFX_XLATE_FILTER_NONE, _options);
+ pic = gfxr_pic_xlate_common(res, GFX_MASK_VISUAL, 1, 1, _driver->getMode(), _options);
#endif
set_pic_id(res, old_ID);
}
@@ -590,12 +588,8 @@ gfxr_view_t *GfxResManager::getView(int nr, int *loop, int *cel, int palette) {
if (!cel_data->data) {
if (!cel_data->palette)
cel_data->palette = view->palette->getref();
-#ifdef CUSTOM_GRAPHICS_OPTIONS
gfx_get_res_config(_options, cel_data);
- gfx_xlate_pixmap(cel_data, _driver->getMode(), _options->view_xlate_filter);
-#else
- gfx_xlate_pixmap(cel_data, _driver->getMode(), GFX_XLATE_FILTER_NONE);
-#endif
+ gfx_xlate_pixmap(cel_data, _driver->getMode());
}
return view;
@@ -678,9 +672,9 @@ gfx_pixmap_t *GfxResManager::getCursor(int num) {
}
#ifdef CUSTOM_GRAPHICS_OPTIONS
gfx_get_res_config(_options, cursor);
- gfx_xlate_pixmap(cursor, _driver->getMode(), _options->cursor_xlate_filter);
+ gfx_xlate_pixmap(cursor, _driver->getMode());
#else
- gfx_xlate_pixmap(cursor, _driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(cursor, _driver->getMode());
#endif
res->unscaled_data.pointer = cursor;
diff --git a/engines/sci/gfx/gfx_support.cpp b/engines/sci/gfx/gfx_support.cpp
index 314e955367..f8776c3257 100644
--- a/engines/sci/gfx/gfx_support.cpp
+++ b/engines/sci/gfx/gfx_support.cpp
@@ -218,7 +218,7 @@ int gfx_crossblit_pixmap(gfx_mode_t *mode, gfx_pixmap_t *pxm, int priority, rect
byte *priority_pos = priority_dest;
unsigned int alpha_mask, alpha_min;
int bpp = mode->bytespp;
- int bytes_per_alpha_pixel = pxm->alpha_map ? 1 : bpp;
+ int bytes_per_alpha_pixel = bpp;
int bytes_per_alpha_line = bytes_per_alpha_pixel * pxm->width;
int xl = pxm->width, yl = pxm->height;
int xoffset = (dest_coords.x < 0) ? - dest_coords.x : 0;
@@ -290,7 +290,7 @@ int gfx_crossblit_pixmap(gfx_mode_t *mode, gfx_pixmap_t *pxm, int priority, rect
else {
int shift_nr = 0;
- alpha_mask = mode->alpha_mask;
+ alpha_mask = 0;
if (!alpha_mask && pxm->alpha_map) {
error("Invalid alpha mode: both pxm->alpha_map and alpha_mask are white");
return GFX_ERROR;
diff --git a/engines/sci/gfx/gfx_system.h b/engines/sci/gfx/gfx_system.h
index 0f5292aedf..7858b860bb 100644
--- a/engines/sci/gfx/gfx_system.h
+++ b/engines/sci/gfx/gfx_system.h
@@ -75,9 +75,6 @@ struct gfx_mode_t {
*/
Palette *palette;
- // TODO: remove those
- uint32 red_mask, green_mask, blue_mask, alpha_mask;
- short red_shift, green_shift, blue_shift, alpha_shift;
Graphics::PixelFormat format;
};
diff --git a/engines/sci/gfx/gfx_tools.cpp b/engines/sci/gfx/gfx_tools.cpp
index 9e81ec1a8a..22181822cc 100644
--- a/engines/sci/gfx/gfx_tools.cpp
+++ b/engines/sci/gfx/gfx_tools.cpp
@@ -51,26 +51,6 @@ gfx_mode_t *gfx_new_mode(int xfact, int yfact, const Graphics::PixelFormat &form
mode->bytespp = format.bytesPerPixel;
mode->format = format;
- // FIXME: I am not sure whether the following assignments are quite right.
- // The only code using these are the built-in scalers of the SCI engine.
- // And those are pretty weird, so I am not sure I interpreted them correctly.
- // They also seem somewhat inefficient and and should probably just be
- // replaced resp. rewritten from scratch.
- if (format.bytesPerPixel > 1) {
- mode->red_mask = format.ARGBToColor(0, 0xFF, 0, 0);
- mode->green_mask = format.ARGBToColor(0, 0, 0xFF, 0);
- mode->blue_mask = format.ARGBToColor(0, 0, 0, 0xFF);
- mode->alpha_mask = format.ARGBToColor(0xFF, 0, 0, 0);
- mode->red_shift = format.rShift;
- mode->green_shift = format.gShift;
- mode->blue_shift = format.bShift;
- mode->alpha_shift = format.aShift;
- } else {
- mode->red_mask = mode->green_mask = mode->blue_mask = 0;
- mode->alpha_mask = 0;
- mode->red_shift = mode->green_shift = mode->blue_shift = 0;
- mode->alpha_shift = 0;
- }
mode->flags = flags;
mode->palette = palette;
diff --git a/engines/sci/gfx/gfx_tools.h b/engines/sci/gfx/gfx_tools.h
index 9b4ce32e89..69e82a92d6 100644
--- a/engines/sci/gfx/gfx_tools.h
+++ b/engines/sci/gfx/gfx_tools.h
@@ -36,12 +36,6 @@ namespace Sci {
/** @name SCI graphics subsystem helper functions */
/** @{ */
-enum gfx_xlate_filter_t {
- GFX_XLATE_FILTER_NONE,
- GFX_XLATE_FILTER_LINEAR,
- GFX_XLATE_FILTER_TRILINEAR
-};
-
/**
* Allocates a new gfx_mode_t structure with the specified parameters
*
@@ -176,9 +170,8 @@ void gfx_copy_pixmap_box_i(gfx_pixmap_t *dest, gfx_pixmap_t *src, rect_t box);
*
* @param[in] pxm The pixmap to translate
* @param[in] mode The mode according which to scale
- * @param[in] filter How to filter the data
*/
-void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode, gfx_xlate_filter_t filter);
+void gfx_xlate_pixmap(gfx_pixmap_t *pxm, gfx_mode_t *mode);
#define GFX_CROSSBLIT_FLAG_DATA_IS_HOMED (1<<0) /**< Means that the first byte in the visual data refers to the point corresponding to (dest.x, dest.y) */
diff --git a/engines/sci/gfx/operations.cpp b/engines/sci/gfx/operations.cpp
index 0fad18d261..2da129ca69 100644
--- a/engines/sci/gfx/operations.cpp
+++ b/engines/sci/gfx/operations.cpp
@@ -195,7 +195,7 @@ static void _gfxop_install_pixmap(GfxDriver *driver, gfx_pixmap_t *pxm) {
assert(pxm->palette->getParent() == driver->getMode()->palette);
if (pxm->palette_revision != pxm->palette->getRevision())
- gfx_xlate_pixmap(pxm, driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(pxm, driver->getMode());
if (!driver->getMode()->palette->isDirty())
return;
@@ -995,7 +995,7 @@ void gfxop_update(GfxState *state) {
if (state->fullscreen_override) {
// We've been asked to re-draw the active full-screen image, essentially.
rect_t rect = gfx_rect(0, 0, 320, 200);
- gfx_xlate_pixmap(state->fullscreen_override, state->driver->getMode(), GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(state->fullscreen_override, state->driver->getMode());
gfxop_draw_pixmap(state, state->fullscreen_override, rect, Common::Point(0, 0));
_gfxop_update_box(state, rect);
}
@@ -1875,11 +1875,7 @@ void gfxop_draw_text(GfxState *state, TextHandle *handle, rect_t zone) {
gfx_pixmap_t *pxm = handle->text_pixmaps[i];
if (!pxm->data) {
-#ifdef CUSTOM_GRAPHICS_OPTIONS
- gfx_xlate_pixmap(pxm, state->driver->getMode(), state->options->text_xlate_filter);
-#else
- gfx_xlate_pixmap(pxm, state->driver->getMode(), GFX_XLATE_FILTER_NONE);
-#endif
+ gfx_xlate_pixmap(pxm, state->driver->getMode());
}
if (!pxm)
error("Could not find text pixmap %d/%d", i, handle->lines.size());
diff --git a/engines/sci/gfx/res_pic.cpp b/engines/sci/gfx/res_pic.cpp
index 041a47119f..8808e7fb0c 100644
--- a/engines/sci/gfx/res_pic.cpp
+++ b/engines/sci/gfx/res_pic.cpp
@@ -1556,7 +1556,7 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
gfx_mode_t *mode = gfx_new_mode(pic->visual_map->index_width / 320,
pic->visual_map->index_height / 200, format, view->palette, 0);
- gfx_xlate_pixmap(view, mode, GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(view, mode);
gfx_free_mode(mode);
// When the mode is freed, the associated view
// palette is freed too, so set it to NULL
@@ -1661,7 +1661,7 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
Graphics::PixelFormat format(1, 0, 0, 0, 0, 0, 0, 0, 0); // 1 byte/p, which handles masks and the rest for us
gfx_mode_t *mode = gfx_new_mode(pic->visual_map->index_width / 320, pic->visual_map->index_height / 200, format, view->palette, 0);
- gfx_xlate_pixmap(view, mode, GFX_XLATE_FILTER_NONE);
+ gfx_xlate_pixmap(view, mode);
gfx_free_mode(mode);
if (flags & DRAWPIC01_FLAG_OVERLAID_PIC)
diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp
index ea7a835684..92ce853f28 100644
--- a/engines/sci/sci.cpp
+++ b/engines/sci/sci.cpp
@@ -158,10 +158,6 @@ Common::Error SciEngine::run() {
_gamestate->gfx_state = &gfx_state;
// Assign default values to the config manager, in case settings are missing
- ConfMan.registerDefault("cursor_filter", "0");
- ConfMan.registerDefault("view_filter", "0");
- ConfMan.registerDefault("pic_filter", "0");
- ConfMan.registerDefault("text_filter", "0");
ConfMan.registerDefault("dither_mode", "0");
// Default config:
@@ -172,10 +168,6 @@ Common::Error SciEngine::run() {
gfx_options.pic0_dither_mode = (DitherMode)ConfMan.getInt("dither_mode");
gfx_options.pic0_brush_mode = GFX_BRUSH_MODE_RANDOM_ELLIPSES;
gfx_options.pic0_line_mode = GFX_LINE_MODE_CORRECT;
- gfx_options.cursor_xlate_filter = (gfx_xlate_filter_t)ConfMan.getInt("cursor_filter");
- gfx_options.view_xlate_filter = (gfx_xlate_filter_t)ConfMan.getInt("view_filter");
- gfx_options.pic_xlate_filter = (gfx_xlate_filter_t)ConfMan.getInt("pic_filter");
- gfx_options.text_xlate_filter = (gfx_xlate_filter_t)ConfMan.getInt("text_filter");
for (int i = 0; i < GFX_RESOURCE_TYPES_NR; i++) {
gfx_options.res_conf.assign[i] = NULL;
gfx_options.res_conf.mod[i] = NULL;