changeset 4719:62eb233b12ed

shrink the size of the ghost image, courtesy of Roberto Togni
author melanson
date Sat, 16 Feb 2002 01:30:11 +0000
parents c70b0c4b85f5
children 10ad330c1733
files fli.c
diffstat 1 files changed, 32 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/fli.c	Fri Feb 15 22:31:10 2002 +0000
+++ b/fli.c	Sat Feb 16 01:30:11 2002 +0000
@@ -39,7 +39,7 @@
 {
   memset(palette, 0, PALETTE_SIZE);
 
-  return malloc(width * height * sizeof (unsigned int));
+  return malloc(width * height * sizeof (unsigned char));
 }
 
 void decode_fli_frame(
@@ -55,6 +55,8 @@
   int pixel_ptr;
   int palette_ptr1;
   int palette_ptr2;
+  unsigned char palette_idx1;
+  unsigned char palette_idx2;
 
   unsigned int frame_size;
   int num_chunks;
@@ -77,7 +79,7 @@
   signed char byte_run;
   int pixel_skip;
   int update_whole_frame = 0; // Palette change flag
-  unsigned int *fli_ghost_image = (unsigned int *)context;
+  unsigned char *fli_ghost_image = (unsigned char *)context;
   int ghost_pixel_ptr;
   int ghost_y_ptr;
 	
@@ -164,18 +166,18 @@
             if (byte_run < 0)
             {
               byte_run = -byte_run;
-              palette_ptr1 = encoded[stream_ptr++] * 4;
-              palette_ptr2 = encoded[stream_ptr++] * 4;
+              palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
+              palette_ptr2 = (palette_idx2 = encoded[stream_ptr++]) * 4;
               for (j = 0; j < byte_run; j++)
               {
-                fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+                fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
 		if (bytes_per_pixel == 4) /* 32bpp */
 		    pixel_ptr++;
 
-                fli_ghost_image[ghost_pixel_ptr++] = palette_ptr2;
+                fli_ghost_image[ghost_pixel_ptr++] = palette_idx2;
                 decoded[pixel_ptr++] = palette[palette_ptr2 + 0];
                 decoded[pixel_ptr++] = palette[palette_ptr2 + 1];
                 decoded[pixel_ptr++] = palette[palette_ptr2 + 2];
@@ -187,8 +189,8 @@
             {
               for (j = 0; j < byte_run * 2; j++)
               {
-                palette_ptr1 = encoded[stream_ptr++] * 4;
-                fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+                palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
+                fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
@@ -231,8 +233,8 @@
             {
               for (j = 0; j < byte_run; j++)
               {
-                palette_ptr1 = encoded[stream_ptr++] * 4;
-                fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+                palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
+                fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
@@ -243,10 +245,10 @@
             else
             {
               byte_run = -byte_run;
-              palette_ptr1 = encoded[stream_ptr++] * 4;
+              palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
               for (j = 0; j < byte_run; j++)
               {
-                fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+                fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
                 decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
@@ -266,7 +268,7 @@
     case FLI_BLACK:
       // set the whole frame to color 0 (which is usually black) by
       // clearing the ghost image and trigger a full frame update
-      memset(fli_ghost_image, 0, width * height * sizeof(unsigned int));
+      memset(fli_ghost_image, 0, width * height * sizeof(unsigned char));
       update_whole_frame = 1;
       break;
 
@@ -284,10 +286,10 @@
           byte_run = encoded[stream_ptr++];
           if (byte_run > 0)
           {
-            palette_ptr1 = encoded[stream_ptr++] * 4;
+            palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
             for (j = 0; j < byte_run; j++)
             {
-              fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+              fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
               decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
               decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
               decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
@@ -300,8 +302,8 @@
             byte_run = -byte_run;
             for (j = 0; j < byte_run; j++)
             {
-              palette_ptr1 = encoded[stream_ptr++] * 4;
-              fli_ghost_image[ghost_pixel_ptr++] = palette_ptr1;
+              palette_ptr1 = (palette_idx1 = encoded[stream_ptr++]) * 4;
+              fli_ghost_image[ghost_pixel_ptr++] = palette_idx1;
               decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
               decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
               decoded[pixel_ptr++] = palette[palette_ptr1 + 2];
@@ -319,7 +321,16 @@
     case FLI_COPY:
       // copy the chunk (uncompressed frame) to the ghost image and
       // schedule the whole frame to be updated
-      memcpy(fli_ghost_image, &encoded[stream_ptr], chunk_size - 6);
+      if (chunk_size - 6 > width * height)
+      {
+        mp_msg(MSGT_DECVIDEO, MSGL_WARN,
+         "FLI: in chunk FLI_COPY : source data (%d bytes) bigger than image," \
+         " skipping chunk\n",
+         chunk_size - 6);
+         break;
+      }
+      else
+        memcpy(fli_ghost_image, &encoded[stream_ptr], chunk_size - 6);
       stream_ptr += chunk_size - 6;
       update_whole_frame = 1;
       break;
@@ -330,7 +341,8 @@
       break;
 
     default:
-      printf ("FLI: Unrecognized chunk type: %d\n", chunk_type);
+      mp_msg (MSGT_DECVIDEO, MSGL_WARN,
+       "FLI: Unrecognized chunk type: %d\n", chunk_type);
       break;
     }
 
@@ -343,7 +355,7 @@
     pixel_ptr = ghost_pixel_ptr = 0;
     while (pixel_ptr < (width * height * bytes_per_pixel))
     {
-      palette_ptr1 = fli_ghost_image[ghost_pixel_ptr++];
+      palette_ptr1 = fli_ghost_image[ghost_pixel_ptr++] * 4;
       decoded[pixel_ptr++] = palette[palette_ptr1 + 0];
       decoded[pixel_ptr++] = palette[palette_ptr1 + 1];
       decoded[pixel_ptr++] = palette[palette_ptr1 + 2];