aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx/resource/sci_resmgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx/resource/sci_resmgr.c')
-rw-r--r--engines/sci/gfx/resource/sci_resmgr.c341
1 files changed, 341 insertions, 0 deletions
diff --git a/engines/sci/gfx/resource/sci_resmgr.c b/engines/sci/gfx/resource/sci_resmgr.c
new file mode 100644
index 0000000000..6475369230
--- /dev/null
+++ b/engines/sci/gfx/resource/sci_resmgr.c
@@ -0,0 +1,341 @@
+/***************************************************************************
+ sci_resmgr.c Copyright (C) 2000 Christoph Reichenbach
+
+ This program may be modified and copied freely according to the terms of
+ the GNU general public license (GPL), as long as the above copyright
+ notice and the licensing information contained herein are preserved.
+
+ Please refer to www.gnu.org for licensing details.
+
+ This work is provided AS IS, without warranty of any kind, expressed or
+ implied, including but not limited to the warranties of merchantibility,
+ noninfringement, and fitness for a specific purpose. The author will not
+ be held liable for any damage caused by this work or derivatives of it.
+
+ By using this source code, you agree to the licensing terms as stated
+ above.
+
+
+ Please contact the maintainer for bug reports or inquiries.
+
+ Current Maintainer:
+
+ Christoph Reichenbach (CR) <jameson@linuxgames.com>
+
+***************************************************************************/
+/* The interpreter-specific part of the resource manager, for SCI */
+
+#include <sci_memory.h>
+#include <sciresource.h>
+#include <gfx_widgets.h>
+#include <gfx_resmgr.h>
+#include <gfx_options.h>
+
+int
+gfxr_interpreter_options_hash(gfx_resource_type_t type, int version,
+ gfx_options_t *options,
+ void *internal, int palette)
+{
+ switch (type) {
+
+ case GFX_RESOURCE_TYPE_VIEW:
+ return palette;
+
+ case GFX_RESOURCE_TYPE_PIC:
+ if (version >= SCI_VERSION_01_VGA)
+ return options->pic_port_bounds.y;
+ else
+ return (options->pic0_unscaled)? 0x10000 :
+ (options->pic0_dither_mode << 12)
+ | (options->pic0_dither_pattern << 8)
+ | (options->pic0_brush_mode << 4)
+ | (options->pic0_line_mode);
+
+ case GFX_RESOURCE_TYPE_FONT:
+ return 0;
+
+ case GFX_RESOURCE_TYPE_CURSOR:
+ return 0;
+
+ case GFX_RESOURCE_TYPES_NR:
+ default:
+ GFXERROR("Invalid resource type: %d\n", type);
+ return -1;
+ }
+}
+
+
+gfxr_pic_t *
+gfxr_interpreter_init_pic(int version, gfx_mode_t *mode, int ID, void *internal)
+{
+ return gfxr_init_pic(mode, ID, version >= SCI_VERSION_01_VGA);
+}
+
+
+void
+gfxr_interpreter_clear_pic(int version, gfxr_pic_t *pic, void *internal)
+{
+ gfxr_clear_pic0(pic, SCI_TITLEBAR_SIZE);
+}
+
+
+int
+gfxr_interpreter_calculate_pic(gfx_resstate_t *state, gfxr_pic_t *scaled_pic, gfxr_pic_t *unscaled_pic,
+ int flags, int default_palette, int nr, void *internal)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ resource_t *res = scir_find_resource(resmgr, sci_pic, nr, 0);
+ int need_unscaled = unscaled_pic != NULL;
+ gfxr_pic0_params_t style, basic_style;
+
+ basic_style.line_mode = GFX_LINE_MODE_CORRECT;
+ basic_style.brush_mode = GFX_BRUSH_MODE_SCALED;
+ basic_style.pic_port_bounds = state->options->pic_port_bounds;
+
+ style.line_mode = state->options->pic0_line_mode;
+ style.brush_mode = state->options->pic0_brush_mode;
+ style.pic_port_bounds = state->options->pic_port_bounds;
+
+ if (!res || !res->data)
+ return GFX_ERROR;
+
+ if (state->version >= SCI_VERSION_01_VGA) {
+ if (need_unscaled)
+ {
+ if (state->version == SCI_VERSION_1_1)
+ gfxr_draw_pic11(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id,
+ state->static_palette, state->static_palette_entries);
+ else
+ gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id, 1,
+ state->static_palette, state->static_palette_entries);
+ }
+ if (scaled_pic && scaled_pic->undithered_buffer)
+ memcpy(scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer, scaled_pic->undithered_buffer_size);
+
+ if (state->version == SCI_VERSION_1_1)
+ gfxr_draw_pic11(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id,
+ state->static_palette, state->static_palette_entries);
+ else
+ gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id, state->version,
+ state->static_palette, state->static_palette_entries);
+ } else {
+ if (need_unscaled)
+ gfxr_draw_pic01(unscaled_pic, flags, default_palette, res->size, res->data, &basic_style, res->id, 0,
+ state->static_palette, state->static_palette_entries);
+
+ if (scaled_pic && scaled_pic->undithered_buffer)
+ memcpy(scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer, scaled_pic->undithered_buffer_size);
+
+ gfxr_draw_pic01(scaled_pic, flags, default_palette, res->size, res->data, &style, res->id, 0,
+ state->static_palette, state->static_palette_entries);
+ if (need_unscaled)
+ gfxr_remove_artifacts_pic0(scaled_pic, unscaled_pic);
+
+ if (!scaled_pic->undithered_buffer)
+ scaled_pic->undithered_buffer = sci_malloc(scaled_pic->undithered_buffer_size);
+
+ memcpy(scaled_pic->undithered_buffer, scaled_pic->visual_map->index_data, scaled_pic->undithered_buffer_size);
+
+ gfxr_dither_pic0(scaled_pic, state->options->pic0_dither_mode, state->options->pic0_dither_pattern);
+ }
+
+ /* Mark default palettes */
+ if (scaled_pic)
+ scaled_pic->visual_map->loop = default_palette;
+
+ if (unscaled_pic)
+ unscaled_pic->visual_map->loop = default_palette;
+
+ return GFX_OK;
+}
+
+
+void
+gfxr_palettize_view(gfxr_view_t *view, gfx_pixmap_color_t *source, int source_entries)
+{
+ int i;
+
+ for (i=0;i<MIN(view->colors_nr,source_entries);i++)
+ {
+ if ((view->colors[i].r == 0) &&
+ (view->colors[i].g == 0) &&
+ (view->colors[i].b == 0))
+ {
+ view->colors[i] = source[i];
+ }
+ }
+}
+
+gfxr_view_t *
+gfxr_draw_view11(int id, byte *resource, int size);
+
+gfxr_view_t *
+gfxr_interpreter_get_view(gfx_resstate_t *state, int nr, void *internal, int palette)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ resource_t *res = scir_find_resource(resmgr, sci_view, nr, 0);
+ int resid = GFXR_RES_ID(GFX_RESOURCE_TYPE_VIEW, nr);
+ gfxr_view_t *result;
+
+ if (!res || !res->data)
+ return NULL;
+
+ if (state->version < SCI_VERSION_01) palette=-1;
+
+ switch (state->version)
+ {
+ case SCI_VERSION_0:
+ case SCI_VERSION_01:
+ result=gfxr_draw_view0(resid, res->data, res->size, palette);
+ break;
+ case SCI_VERSION_01_VGA:
+ case SCI_VERSION_01_VGA_ODD:
+ case SCI_VERSION_1_EARLY:
+ case SCI_VERSION_1_LATE:
+ result=gfxr_draw_view1(resid, res->data, res->size, state->static_palette, state->static_palette_entries);
+ break;
+ case SCI_VERSION_1_1:
+ case SCI_VERSION_32:
+ result=gfxr_draw_view11(resid, res->data, res->size);
+ break;
+ }
+
+ if (state->version >= SCI_VERSION_01_VGA)
+ {
+ if (!result->colors)
+ {
+ result->colors = (gfx_pixmap_color_t*)sci_malloc(sizeof(gfx_pixmap_color_t) * state->static_palette_entries);
+ memset(result->colors, 0, sizeof(gfx_pixmap_color_t) * state->static_palette_entries);
+ result->colors_nr = state->static_palette_entries;
+ }
+ gfxr_palettize_view(result, state->static_palette, state->static_palette_entries);
+ }
+ return result;
+}
+
+
+gfx_bitmap_font_t *
+gfxr_interpreter_get_font(gfx_resstate_t *state, int nr, void *internal)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ resource_t *res = scir_find_resource(resmgr, sci_font, nr, 0);
+ if (!res || !res->data)
+ return NULL;
+
+ return gfxr_read_font(res->id, res->data, res->size);
+}
+
+
+gfx_pixmap_t *
+gfxr_interpreter_get_cursor(gfx_resstate_t *state, int nr, void *internal)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ resource_t *res = scir_find_resource(resmgr, sci_cursor, nr, 0);
+ int resid = GFXR_RES_ID(GFX_RESOURCE_TYPE_CURSOR, nr);
+
+ if (!res || !res->data)
+ return NULL;
+
+ if (state->version >= SCI_VERSION_1_1) {
+ GFXWARN("Attempt to retreive cursor in SCI1.1 or later\n");
+ return NULL;
+ }
+
+ if (state->version == SCI_VERSION_0)
+ return gfxr_draw_cursor0(resid, res->data, res->size);
+ else
+ return gfxr_draw_cursor01(resid, res->data, res->size);
+}
+
+
+int *
+gfxr_interpreter_get_resources(gfx_resstate_t *state, gfx_resource_type_t type,
+ int version, int *entries_nr, void *internal)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ int restype;
+ int *resources;
+ int count = 0;
+ int top = sci_max_resource_nr[version] + 1;
+ int i;
+ switch (type) {
+
+ case GFX_RESOURCE_TYPE_VIEW: restype = sci_view;
+ break;
+
+ case GFX_RESOURCE_TYPE_PIC: restype = sci_pic;
+ break;
+
+ case GFX_RESOURCE_TYPE_CURSOR: restype = sci_cursor;
+ break;
+
+ case GFX_RESOURCE_TYPE_FONT: restype = sci_font;
+ break;
+
+ default:
+ GFX_DEBUG("Unsupported resource %d\n", type);
+ return NULL; /* unsupported resource */
+
+ }
+
+ resources = (int*)sci_malloc(sizeof(int) * top);
+
+ for (i = 0; i < top; i++)
+ if (scir_test_resource(resmgr, restype, i))
+ resources[count++] = i;
+
+ *entries_nr = count;
+
+ return resources;
+}
+
+gfx_pixmap_color_t *
+gfxr_interpreter_get_static_palette(gfx_resstate_t *state, int version, int *colors_nr, void *internal)
+{
+ if (version >= SCI_VERSION_01_VGA)
+ return gfxr_interpreter_get_palette(state, version, colors_nr, internal, 999);
+
+ *colors_nr = GFX_SCI0_PIC_COLORS_NR;
+ return gfx_sci0_pic_colors;
+}
+
+gfx_pixmap_color_t *
+gfxr_interpreter_get_palette(gfx_resstate_t *state, int version, int *colors_nr,
+ void *internal, int nr)
+{
+ resource_mgr_t *resmgr = (resource_mgr_t *) state->misc_payload;
+ resource_t *res;
+
+ if (version < SCI_VERSION_01_VGA)
+ return NULL;
+
+ res = scir_find_resource(resmgr, sci_palette, nr, 0);
+ if (!res || !res->data)
+ return NULL;
+
+ switch (version)
+ {
+ case SCI_VERSION_01_VGA :
+ case SCI_VERSION_01_VGA_ODD :
+ case SCI_VERSION_1_EARLY :
+ case SCI_VERSION_1_LATE :
+ return gfxr_read_pal1(res->id, colors_nr, res->data, res->size);
+ case SCI_VERSION_1_1 :
+ case SCI_VERSION_32 :
+ GFX_DEBUG("Palettes are not yet supported in this SCI version\n");
+ return NULL;
+
+ default:
+ BREAKPOINT();
+ return NULL;
+ }
+}
+
+int
+gfxr_interpreter_needs_multicolored_pointers(int version, void *internal)
+{
+ return (version > SCI_VERSION_1);
+}
+
+
+