aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/gfx/resource/sci_view_1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/gfx/resource/sci_view_1.cpp')
-rw-r--r--engines/sci/gfx/resource/sci_view_1.cpp210
1 files changed, 95 insertions, 115 deletions
diff --git a/engines/sci/gfx/resource/sci_view_1.cpp b/engines/sci/gfx/resource/sci_view_1.cpp
index d0dd660f2f..4d2daa0462 100644
--- a/engines/sci/gfx/resource/sci_view_1.cpp
+++ b/engines/sci/gfx/resource/sci_view_1.cpp
@@ -42,18 +42,17 @@
#define NEXT_RUNLENGTH_BYTE(n) \
if (literal_pos == runlength_pos) \
literal_pos += n; \
- runlength_pos += n;
+ runlength_pos += n;
#define NEXT_LITERAL_BYTE(n) \
if (literal_pos == runlength_pos) \
runlength_pos += n; \
- literal_pos += n;
+ literal_pos += n;
static int
-decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int mirrored, int pixmap_size, int size,
- int runlength_pos, int literal_pos, int xl, int yl, int color_key)
-{
- int writepos = mirrored? xl : 0;
+decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int mirrored, int pixmap_size, int size,
+ int runlength_pos, int literal_pos, int xl, int yl, int color_key) {
+ int writepos = mirrored ? xl : 0;
if (mirrored) {
int linebase = 0;
@@ -69,40 +68,36 @@ decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int m
if (op & V1_RLE) {
bytes = op & 0x3f;
op &= (V1_RLE | V1_RLE_BG);
- readbytes = (op & V1_RLE_BG)? 0 : 1;
+ readbytes = (op & V1_RLE_BG) ? 0 : 1;
} else {
readbytes = bytes = op & 0x3f;
op = 0;
}
- if (runlength_pos + readbytes > size)
- {
+ if (runlength_pos + readbytes > size) {
GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
- id, loop, cel, readbytes, size - runlength_pos, runlength_pos-1);
+ id, loop, cel, readbytes, size - runlength_pos, runlength_pos - 1);
return 1;
}
-/*
- if (writepos - bytes < 0) {
- GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
- id, loop, cel, writepos - bytes, pixmap_size, pos - 1);
- bytes = pixmap_size - writepos;
- }
-*/
- if (op==V1_RLE)
- {
+ /*
+ if (writepos - bytes < 0) {
+ GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
+ id, loop, cel, writepos - bytes, pixmap_size, pos - 1);
+ bytes = pixmap_size - writepos;
+ }
+ */
+ if (op == V1_RLE) {
color = resource[literal_pos];
NEXT_LITERAL_BYTE(1);
}
- if (!op && literal_pos + bytes > size)
- {
+ if (!op && literal_pos + bytes > size) {
GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
- id, loop, cel, bytes, size - literal_pos, literal_pos-1);
+ id, loop, cel, bytes, size - literal_pos, literal_pos - 1);
return 1;
}
- while (bytes--)
- {
+ while (bytes--) {
if (op) {
if (op & V1_RLE_BG) {
writepos--;
@@ -115,17 +110,15 @@ decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int m
writepos--;
*(dest + writepos) = *(resource + literal_pos);
NEXT_LITERAL_BYTE(1);
-
+
}
- if (writepos == linebase)
- {
- writepos+=2*xl;
- linebase+=xl;
+ if (writepos == linebase) {
+ writepos += 2 * xl;
+ linebase += xl;
}
}
}
- }
- else {
+ } else {
while (writepos < pixmap_size && literal_pos < size && runlength_pos < size) {
int op = resource[runlength_pos];
int bytes;
@@ -136,7 +129,7 @@ decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int m
if (op & V1_RLE) {
bytes = op & 0x3f;
op &= (V1_RLE | V1_RLE_BG);
- readbytes = (op & V1_RLE_BG)? 0 : 1;
+ readbytes = (op & V1_RLE_BG) ? 0 : 1;
} else {
readbytes = bytes = op & 0x3f;
op = 0;
@@ -148,22 +141,20 @@ decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int m
if (writepos + bytes > pixmap_size) {
GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
- id, loop, cel, writepos-bytes, pixmap_size, runlength_pos - 1);
+ id, loop, cel, writepos - bytes, pixmap_size, runlength_pos - 1);
bytes = pixmap_size - writepos;
}
- if (!op && literal_pos + bytes > size)
- {
+ if (!op && literal_pos + bytes > size) {
GFXWARN("View %02x:(%d/%d) requires %d bytes to be read when %d are available at pos %d\n",
- id, loop, cel, bytes, size - literal_pos, literal_pos-1);
+ id, loop, cel, bytes, size - literal_pos, literal_pos - 1);
return 1;
}
- if (writepos + bytes > pixmap_size)
- {
+ if (writepos + bytes > pixmap_size) {
GFXWARN("Writing out of bounds: %d bytes at %d > size %d\n", bytes, writepos, pixmap_size);
}
-
+
if (op) {
if (op & V1_RLE_BG)
memset(dest + writepos, color_key, bytes);
@@ -187,10 +178,9 @@ decompress_sci_view(int id, int loop, int cel, byte *resource, byte *dest, int m
}
static int
-decompress_sci_view_amiga(int id, int loop, int cel, byte *resource, byte *dest, int mirrored, int pixmap_size, int size,
- int pos, int xl, int yl, int color_key)
-{
- int writepos = mirrored? xl - 1 : 0;
+decompress_sci_view_amiga(int id, int loop, int cel, byte *resource, byte *dest, int mirrored, int pixmap_size, int size,
+ int pos, int xl, int yl, int color_key) {
+ int writepos = mirrored ? xl - 1 : 0;
while (writepos < pixmap_size && pos < size) {
int op = resource[pos++];
@@ -213,8 +203,7 @@ decompress_sci_view_amiga(int id, int loop, int cel, byte *resource, byte *dest,
/* Then move to the end of next line */
writepos += 2 * xl;
- if (writepos >= pixmap_size && bytes)
- {
+ if (writepos >= pixmap_size && bytes) {
GFXWARN("View %02x:(%d/%d) writing out of bounds\n", id, loop, cel);
break;
}
@@ -223,7 +212,7 @@ decompress_sci_view_amiga(int id, int loop, int cel, byte *resource, byte *dest,
} else {
if (writepos + bytes > pixmap_size) {
GFXWARN("View %02x:(%d/%d) describes more bytes than needed: %d/%d bytes at rel. offset 0x%04x\n",
- id, loop, cel, writepos-bytes, pixmap_size, pos - 1);
+ id, loop, cel, writepos - bytes, pixmap_size, pos - 1);
bytes = pixmap_size - writepos;
}
memset(dest + writepos, color, bytes);
@@ -232,16 +221,15 @@ decompress_sci_view_amiga(int id, int loop, int cel, byte *resource, byte *dest,
}
if (writepos < pixmap_size) {
- GFXWARN("View %02x:(%d/%d) not enough pixel data in view\n", id, loop, cel);
- return 1;
+ GFXWARN("View %02x:(%d/%d) not enough pixel data in view\n", id, loop, cel);
+ return 1;
}
return 0;
}
gfx_pixmap_t *
-gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, int size, gfxr_view_t *view, int amiga_game)
-{
+gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, int size, gfxr_view_t *view, int amiga_game) {
int xl = get_int_16(resource);
int yl = get_int_16(resource + 2);
int xhot = (gint8) resource[4];
@@ -253,14 +241,14 @@ gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, int size
int decompress_failed;
retval->color_key = resource[6];
- retval->xoffset = (mirrored)? xhot : -xhot;
+ retval->xoffset = (mirrored) ? xhot : -xhot;
retval->yoffset = -yhot;
if (view) {
retval->colors = view->colors;
retval->colors_nr = view->colors_nr;
}
-
+
retval->flags |= GFX_PIXMAP_FLAG_EXTERNAL_PALETTE;
if (xl <= 0 || yl <= 0) {
@@ -271,12 +259,12 @@ gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, int size
if (amiga_game)
decompress_failed = decompress_sci_view_amiga(id, loop, cel,
- resource, dest, mirrored, pixmap_size, size, pos,
- xl, yl, retval->color_key);
+ resource, dest, mirrored, pixmap_size, size, pos,
+ xl, yl, retval->color_key);
else
decompress_failed = decompress_sci_view(id, loop, cel,
- resource, dest, mirrored, pixmap_size, size, pos,
- pos, xl, yl, retval->color_key);
+ resource, dest, mirrored, pixmap_size, size, pos,
+ pos, xl, yl, retval->color_key);
if (decompress_failed) {
gfx_free_pixmap(NULL, retval);
@@ -287,8 +275,7 @@ gfxr_draw_cel1(int id, int loop, int cel, int mirrored, byte *resource, int size
}
static int
-gfxr_draw_loop1(gfxr_loop_t *dest, int id, int loop, int mirrored, byte *resource, int offset, int size, gfxr_view_t *view, int amiga_game)
-{
+gfxr_draw_loop1(gfxr_loop_t *dest, int id, int loop, int mirrored, byte *resource, int offset, int size, gfxr_view_t *view, int amiga_game) {
int i;
int cels_nr = get_int_16(resource + offset);
@@ -335,8 +322,7 @@ gfxr_draw_loop1(gfxr_loop_t *dest, int id, int loop, int mirrored, byte *resourc
gfxr_view_t *
gfxr_draw_view1(int id, byte *resource, int size, gfx_pixmap_color_t *static_pal,
- int static_pal_nr)
-{
+ int static_pal_nr) {
int i;
int palette_offset;
gfxr_view_t *view;
@@ -362,29 +348,28 @@ gfxr_draw_view1(int id, byte *resource, int size, gfx_pixmap_color_t *static_pal
return NULL;
}
-/* fprintf(stderr, "View flags are 0x%02x\n", resource[3]);*/
+ /* fprintf(stderr, "View flags are 0x%02x\n", resource[3]);*/
-/*
- for (i = 0; i < V1_MAGICS_NR; i++)
- if (resource[V1_FIRST_MAGIC + i] != view_magics[i]) {
- GFXWARN("View %04x: View magic #%d should be %02x but is %02x\n",
- id, i, view_magics[i], resource[V1_FIRST_MAGIC + i]);
- }
-*/
+ /*
+ for (i = 0; i < V1_MAGICS_NR; i++)
+ if (resource[V1_FIRST_MAGIC + i] != view_magics[i]) {
+ GFXWARN("View %04x: View magic #%d should be %02x but is %02x\n",
+ id, i, view_magics[i], resource[V1_FIRST_MAGIC + i]);
+ }
+ */
- if (palette_offset > 0)
- {
- if (palette_offset > size) {
- GFXERROR("Palette is outside of view %04x\n", id);
- free(view);
- return NULL;
- }
- if (!(view->colors = gfxr_read_pal1(id, &(view->colors_nr),
- resource + palette_offset, size - palette_offset))) {
- GFXERROR("view %04x: Palette reading failed. Aborting...\n", id);
- free(view);
- return NULL;
- }
+ if (palette_offset > 0) {
+ if (palette_offset > size) {
+ GFXERROR("Palette is outside of view %04x\n", id);
+ free(view);
+ return NULL;
+ }
+ if (!(view->colors = gfxr_read_pal1(id, &(view->colors_nr),
+ resource + palette_offset, size - palette_offset))) {
+ GFXERROR("view %04x: Palette reading failed. Aborting...\n", id);
+ free(view);
+ return NULL;
+ }
} else if (static_pal_nr == GFX_SCI1_AMIGA_COLORS_NR) {
/* Assume we're running an amiga game. */
amiga_game = 1;
@@ -392,12 +377,12 @@ gfxr_draw_view1(int id, byte *resource, int size, gfx_pixmap_color_t *static_pal
view->colors_nr = static_pal_nr;
view->flags |= GFX_PIXMAP_FLAG_EXTERNAL_PALETTE;
} else {
- GFXWARN("view %04x: Doesn't have a palette. Can FreeSCI handle this?\n", view->ID);
- view->colors = NULL;
- view->colors_nr = 0;
+ GFXWARN("view %04x: Doesn't have a palette. Can FreeSCI handle this?\n", view->ID);
+ view->colors = NULL;
+ view->colors_nr = 0;
}
- view->loops = (gfxr_loop_t*)sci_malloc(sizeof (gfxr_loop_t) * view->loops_nr);
+ view->loops = (gfxr_loop_t*)sci_malloc(sizeof(gfxr_loop_t) * view->loops_nr);
for (i = 0; i < view->loops_nr; i++) {
int error_token = 0;
@@ -408,8 +393,8 @@ gfxr_draw_view1(int id, byte *resource, int size, gfx_pixmap_color_t *static_pal
error_token = 1;
}
- if (error_token || gfxr_draw_loop1(view->loops + i, id, i, mirror_mask & (1<<i),
- resource, loop_offset, size, view, amiga_game)) {
+ if (error_token || gfxr_draw_loop1(view->loops + i, id, i, mirror_mask & (1 << i),
+ resource, loop_offset, size, view, amiga_game)) {
/* An error occured */
view->loops_nr = i;
gfxr_free_view(NULL, view);
@@ -440,8 +425,7 @@ gfxr_draw_view1(int id, byte *resource, int size, gfx_pixmap_color_t *static_pal
#define V2_LITERAL_OFFSET 28
gfx_pixmap_t *
-gfxr_draw_cel11(int id, int loop, int cel, int mirrored, byte *resource_base, byte *cel_base, int size, gfxr_view_t *view)
-{
+gfxr_draw_cel11(int id, int loop, int cel, int mirrored, byte *resource_base, byte *cel_base, int size, gfxr_view_t *view) {
int xl = get_uint_16(cel_base + V2_CEL_WIDTH);
int yl = get_uint_16(cel_base + V2_CEL_HEIGHT);
int xdisplace = get_uint_16(cel_base + V2_X_DISPLACEMENT);
@@ -449,20 +433,20 @@ gfxr_draw_cel11(int id, int loop, int cel, int mirrored, byte *resource_base, by
int runlength_offset = get_uint_16(cel_base + V2_RUNLENGTH_OFFSET);
int literal_offset = get_uint_16(cel_base + V2_LITERAL_OFFSET);
int pixmap_size = xl * yl;
-
+
gfx_pixmap_t *retval = gfx_pixmap_alloc_index_data(gfx_new_pixmap(xl, yl, id, loop, cel));
byte *dest = retval->index_data;
int decompress_failed;
retval->color_key = cel_base[V2_COLOR_KEY];
- retval->xoffset = (mirrored)? xdisplace : -xdisplace;
+ retval->xoffset = (mirrored) ? xdisplace : -xdisplace;
retval->yoffset = -ydisplace;
if (view) {
retval->colors = view->colors;
retval->colors_nr = view->colors_nr;
}
-
+
retval->flags |= GFX_PIXMAP_FLAG_EXTERNAL_PALETTE;
if (xl <= 0 || yl <= 0) {
@@ -472,7 +456,7 @@ gfxr_draw_cel11(int id, int loop, int cel, int mirrored, byte *resource_base, by
}
decompress_failed = decompress_sci_view(id, loop, cel, resource_base, dest, mirrored, pixmap_size, size,
- runlength_offset, literal_offset, xl, yl, retval->color_key);
+ runlength_offset, literal_offset, xl, yl, retval->color_key);
if (decompress_failed) {
gfx_free_pixmap(NULL, retval);
@@ -484,17 +468,15 @@ gfxr_draw_cel11(int id, int loop, int cel, int mirrored, byte *resource_base, by
gfxr_loop_t *
gfxr_draw_loop11(int id, int loop, int mirrored, byte *resource_base, byte *loop_base, int size, int cels_nr,
- gfxr_loop_t *result, gfxr_view_t *view, int bytes_per_cel)
-{
+ gfxr_loop_t *result, gfxr_view_t *view, int bytes_per_cel) {
byte *seeker = loop_base;
int i;
result->cels_nr = cels_nr;
result->cels = (gfx_pixmap_t **)
- sci_malloc(sizeof(gfx_pixmap_t *) * cels_nr);
+ sci_malloc(sizeof(gfx_pixmap_t *) * cels_nr);
- for (i = 0; i < cels_nr; i++)
- {
+ for (i = 0; i < cels_nr; i++) {
result->cels[i] = gfxr_draw_cel11(id, loop, i, mirrored, resource_base, seeker, size, view);
seeker += bytes_per_cel;
}
@@ -503,10 +485,9 @@ gfxr_draw_loop11(int id, int loop, int mirrored, byte *resource_base, byte *loop
}
gfxr_view_t *
-gfxr_draw_view11(int id, byte *resource, int size)
-{
+gfxr_draw_view11(int id, byte *resource, int size) {
gfxr_view_t *view;
- int header_size = get_uint_16(resource + V2_HEADER_SIZE);
+ int header_size = get_uint_16(resource + V2_HEADER_SIZE);
int palette_offset = get_uint_16(resource + V2_PALETTE_OFFSET);
int bytes_per_loop = resource[V2_BYTES_PER_LOOP];
int loops_num = resource[V2_LOOPS_NUM];
@@ -524,11 +505,10 @@ gfxr_draw_view11(int id, byte *resource, int size)
view->loops = (gfxr_loop_t *)calloc(view->loops_nr, sizeof(gfxr_loop_t));
/* There is no indication of size here, but this is certainly large enough */
- view->colors = gfxr_read_pal11(id, &view->colors_nr, resource + palette_offset, 1284);
-
+ view->colors = gfxr_read_pal11(id, &view->colors_nr, resource + palette_offset, 1284);
+
seeker = resource + header_size;
- for (i = 0; i < view->loops_nr; i++)
- {
+ for (i = 0; i < view->loops_nr; i++) {
int loop_offset = get_uint_16(seeker + V2_LOOP_OFFSET);
int cels = seeker[V2_CELS_NUM];
int mirrored = seeker[V2_IS_MIRROR];
@@ -536,16 +516,16 @@ gfxr_draw_view11(int id, byte *resource, int size)
printf("%d\n", mirrored);
if (copy_entry == 255)
- gfxr_draw_loop11(id, i, 0, resource, resource + loop_offset, size, cels, view->loops + i,
- view, bytes_per_cel); else
- {
- byte *temp = resource + header_size + copy_entry * bytes_per_loop;
- loop_offset = get_uint_16(temp + V2_LOOP_OFFSET);
- cels = temp[V2_CELS_NUM];
- gfxr_draw_loop11(id, i, 1, resource, resource + loop_offset, size, cels,
- view->loops + i, view, bytes_per_cel);
- }
-
+ gfxr_draw_loop11(id, i, 0, resource, resource + loop_offset, size, cels, view->loops + i,
+ view, bytes_per_cel);
+ else {
+ byte *temp = resource + header_size + copy_entry * bytes_per_loop;
+ loop_offset = get_uint_16(temp + V2_LOOP_OFFSET);
+ cels = temp[V2_CELS_NUM];
+ gfxr_draw_loop11(id, i, 1, resource, resource + loop_offset, size, cels,
+ view->loops + i, view, bytes_per_cel);
+ }
+
seeker += bytes_per_loop;
}