diff options
Diffstat (limited to 'engines/sci/gfx/resource/sci_view_1.cpp')
-rw-r--r-- | engines/sci/gfx/resource/sci_view_1.cpp | 210 |
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; } |