aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sci/gfx/gfx_driver.cpp6
-rw-r--r--engines/sci/gfx/gfx_tools.cpp28
-rw-r--r--engines/sci/gfx/gfx_tools.h16
-rw-r--r--engines/sci/gfx/resource/sci_pic_0.cpp8
4 files changed, 27 insertions, 31 deletions
diff --git a/engines/sci/gfx/gfx_driver.cpp b/engines/sci/gfx/gfx_driver.cpp
index e77be19611..5951ef252f 100644
--- a/engines/sci/gfx/gfx_driver.cpp
+++ b/engines/sci/gfx/gfx_driver.cpp
@@ -44,8 +44,7 @@ struct _scummvm_driver_state {
int _modifierStates;
-static int
-scummvm_init_specific(gfx_driver_t *drv, int xfact, int yfact, int bytespp) {
+static int scummvm_init_specific(gfx_driver_t *drv, int xfact, int yfact, int bytespp) {
int i;
if (!drv->state) // = S
@@ -77,7 +76,8 @@ scummvm_init_specific(gfx_driver_t *drv, int xfact, int yfact, int bytespp) {
memset(S->visual[i], 0, S->xsize * S->ysize);
}
- drv->mode = gfx_new_mode(xfact, yfact, bytespp, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0);
+ Graphics::PixelFormat format = { bytespp, 0, 0, 0, 0, 0, 0, 0, 0 };
+ drv->mode = gfx_new_mode(xfact, yfact, format, 256, 0);
return GFX_OK;
}
diff --git a/engines/sci/gfx/gfx_tools.cpp b/engines/sci/gfx/gfx_tools.cpp
index fe3e99b6a8..db6fa7f834 100644
--- a/engines/sci/gfx/gfx_tools.cpp
+++ b/engines/sci/gfx/gfx_tools.cpp
@@ -44,22 +44,26 @@ void gfx_clip_box_basic(rect_t *box, int maxx, int maxy) {
box->yl = maxy - box->y + 1;
}
-gfx_mode_t *gfx_new_mode(int xfact, int yfact, int bytespp, unsigned int red_mask, unsigned int green_mask,
- unsigned int blue_mask, unsigned int alpha_mask, int red_shift, int green_shift,
- int blue_shift, int alpha_shift, int palette, int flags) {
+gfx_mode_t *gfx_new_mode(int xfact, int yfact, const Graphics::PixelFormat &format, int palette, int flags) {
gfx_mode_t *mode = (gfx_mode_t *)sci_malloc(sizeof(gfx_mode_t));
mode->xfact = xfact;
mode->yfact = yfact;
- mode->bytespp = bytespp;
- mode->red_mask = red_mask;
- mode->green_mask = green_mask;
- mode->blue_mask = blue_mask;
- mode->alpha_mask = alpha_mask;
- mode->red_shift = red_shift;
- mode->green_shift = green_shift;
- mode->blue_shift = blue_shift;
- mode->alpha_shift = alpha_shift;
+ mode->bytespp = format.bytesPerPixel;
+
+ // 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.
+ 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.rLoss;
+ mode->green_shift = format.gLoss;
+ mode->blue_shift = format.bLoss;
+ mode->alpha_shift = format.aLoss;
mode->flags = flags;
if (palette) {
diff --git a/engines/sci/gfx/gfx_tools.h b/engines/sci/gfx/gfx_tools.h
index bdd834f895..97451196e1 100644
--- a/engines/sci/gfx/gfx_tools.h
+++ b/engines/sci/gfx/gfx_tools.h
@@ -29,6 +29,8 @@
#ifndef SCI_GFX_GFX_TOOLS_H
#define SCI_GFX_GFX_TOOLS_H
+#include "graphics/pixelformat.h"
+
#include "sci/gfx/gfx_system.h"
#include "sci/gfx/gfx_driver.h"
@@ -45,20 +47,10 @@ extern int gfx_crossblit_alpha_threshold; /* Crossblitting functions use this va
** for distinguishing between transparent and opaque
** wrt alpha values */
-gfx_mode_t *gfx_new_mode(int xfact, int yfact, int bytespp, unsigned int red_mask, unsigned int green_mask,
- unsigned int blue_mask, unsigned int alpha_mask, int red_shift, int green_shift,
- int blue_shift, int alpha_shift, int palette, int flags);
+gfx_mode_t *gfx_new_mode(int xfact, int yfact, const Graphics::PixelFormat &format, int palette, int flags);
/* Allocates a new gfx_mode_t structure with the specified parameters
** Parameters: (int x int) xfact x yfact: Horizontal and vertical scaling factors
-** (int) bytespp: Bytes per pixel
-** (unsigned int) red_mask: Red bit mask
-** (unsigned int) green_mask: Green bit mask
-** (unsigned int) blue_mask: Blue bit mask
-** (unsigned int) Alpha_mask: Alpha bit mask, or 0 if the alpha channel is not supported
-** (int) red_shift: Red shift value
-** (int) green_shift: Green shift value
-** (int) blue_shift: Blue shift value
-** (int) alpha_shift: Alpha shift value
+** (Graphics::PixelFormat) format: pixel format description
** (int) palette: Number of palette colors, 0 if we're not in palette mode
** (int) flags: GFX_MODE_FLAG_* values ORred together, or just 0
** Returns : (gfx_mode_t *) A newly allocated gfx_mode_t structure
diff --git a/engines/sci/gfx/resource/sci_pic_0.cpp b/engines/sci/gfx/resource/sci_pic_0.cpp
index 4e470a9435..c8209cd172 100644
--- a/engines/sci/gfx/resource/sci_pic_0.cpp
+++ b/engines/sci/gfx/resource/sci_pic_0.cpp
@@ -1647,9 +1647,9 @@ void gfxr_draw_pic01(gfxr_pic_t *pic, int flags, int default_palette, int size,
p0printf("Embedded view @%d\n", pos);
// Set up mode structure for resizing the view
+ Graphics::PixelFormat format = { 1, 0, 0, 0, 0, 0, 0, 0, 0 }; // 1bpp, which handles masks and the rest for us
mode = gfx_new_mode(pic->visual_map->index_xl / 320,
- pic->visual_map->index_yl / 200, 1, // 1bpp, which handles masks and the rest for us
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0);
+ pic->visual_map->index_yl / 200, format, 16, 0);
GET_ABS_COORDS(posx, posy);
bytesize = (*(resource + pos)) + (*(resource + pos + 1) << 8);
@@ -1779,9 +1779,9 @@ void gfxr_draw_pic11(gfxr_pic_t *pic, int flags, int default_palette, int size,
gfx_mode_t *mode;
gfx_pixmap_t *view = NULL;
// Set up mode structure for resizing the view
+ Graphics::PixelFormat format = { 1, 0, 0, 0, 0, 0, 0, 0, 0 }; // 1bpp, which handles masks and the rest for us
mode = gfx_new_mode(pic->visual_map->index_xl / 320, pic->visual_map->index_yl / 200,
- 1, // 1bpp, which handles masks and the rest for us
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 0);
+ format, 16, 0);
pic->visual_map->colors = gfxr_read_pal11(-1, &(pic->visual_map->colors_nr), resource + palette_data_ptr, 1284);