revise cgifsave checksum
We were calling it a sum and looking for a change threshold, but really it's only useful as a checksum and does not have a magnitude. Revise comments and variable names to reflect this.
This commit is contained in:
parent
89bbb7981d
commit
a9bfd508f5
@ -76,10 +76,6 @@ typedef struct _VipsForeignSaveCgif {
|
|||||||
int *global_colour_table;
|
int *global_colour_table;
|
||||||
int global_colour_table_length;
|
int global_colour_table_length;
|
||||||
|
|
||||||
/* We save ->ready a frame at a time, regenerating the
|
|
||||||
* palette if we see a significant frame to frame change.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The current frame coming from libvips, the y position we write to,
|
/* The current frame coming from libvips, the y position we write to,
|
||||||
* and some spare pixels we copy down when we move to the next frame.
|
* and some spare pixels we copy down when we move to the next frame.
|
||||||
*/
|
*/
|
||||||
@ -96,7 +92,7 @@ typedef struct _VipsForeignSaveCgif {
|
|||||||
/* The current colourmap, updated on a significant frame change.
|
/* The current colourmap, updated on a significant frame change.
|
||||||
*/
|
*/
|
||||||
VipsPel *palette_rgb;
|
VipsPel *palette_rgb;
|
||||||
gint64 frame_sum;
|
gint64 frame_checksum;
|
||||||
|
|
||||||
/* The index frame we get libimagequant to generate.
|
/* The index frame we get libimagequant to generate.
|
||||||
*/
|
*/
|
||||||
@ -222,10 +218,8 @@ vips_foreign_save_cgif_write_frame( VipsForeignSaveCgif *cgif )
|
|||||||
VIPS_REGION_ADDR( cgif->frame, 0, frame_rect->top );
|
VIPS_REGION_ADDR( cgif->frame, 0, frame_rect->top );
|
||||||
|
|
||||||
VipsPel * restrict p;
|
VipsPel * restrict p;
|
||||||
VipsPel *rgb;
|
|
||||||
gint64 sum;
|
|
||||||
double change;
|
|
||||||
int i;
|
int i;
|
||||||
|
VipsPel *rgb;
|
||||||
CGIF_FrameConfig frame_config;
|
CGIF_FrameConfig frame_config;
|
||||||
|
|
||||||
#ifdef DEBUG_VERBOSE
|
#ifdef DEBUG_VERBOSE
|
||||||
@ -250,27 +244,31 @@ vips_foreign_save_cgif_write_frame( VipsForeignSaveCgif *cgif )
|
|||||||
/* Do we need to compute a new palette? Do it if the frame sum
|
/* Do we need to compute a new palette? Do it if the frame sum
|
||||||
* changes.
|
* changes.
|
||||||
*
|
*
|
||||||
* frame_sum 0 means no current colourmap.
|
* frame_checksum 0 means no current colourmap.
|
||||||
*/
|
*/
|
||||||
if( !cgif->global_colour_table ) {
|
if( !cgif->global_colour_table ) {
|
||||||
sum = 0;
|
gint64 checksum;
|
||||||
|
|
||||||
|
/* We need a checksum which detects colour changes, but
|
||||||
|
* doesn't care about pixel ordering.
|
||||||
|
*
|
||||||
|
* Scale RGBA differently so that changes like [0, 255, 0]
|
||||||
|
* to [255, 0, 0] are detected.
|
||||||
|
*/
|
||||||
|
checksum = 0;
|
||||||
p = frame_bytes;
|
p = frame_bytes;
|
||||||
for( i = 0; i < n_pels; i++ ) {
|
for( i = 0; i < n_pels; i++ ) {
|
||||||
/* Scale RGBA differently so that changes like
|
checksum += p[0] * 1000;
|
||||||
* [0, 255, 0] to [255, 0, 0] are detected.
|
checksum += p[1] * 100;
|
||||||
*/
|
checksum += p[2] * 10;
|
||||||
sum += p[0] * 1000;
|
checksum += p[3];
|
||||||
sum += p[1] * 100;
|
|
||||||
sum += p[2] * 10;
|
|
||||||
sum += p[3];
|
|
||||||
|
|
||||||
p += 4;
|
p += 4;
|
||||||
}
|
}
|
||||||
change = VIPS_ABS( ((double) sum - cgif->frame_sum) ) / n_pels;
|
|
||||||
|
|
||||||
if( cgif->frame_sum == 0 ||
|
if( cgif->frame_checksum == 0 ||
|
||||||
change > 0 ) {
|
checksum != cgif->frame_checksum ) {
|
||||||
cgif->frame_sum = sum;
|
cgif->frame_checksum = checksum;
|
||||||
|
|
||||||
/* If this is not our first cmap, make a note that we
|
/* If this is not our first cmap, make a note that we
|
||||||
* need to attach it as a local cmap when we write.
|
* need to attach it as a local cmap when we write.
|
||||||
@ -292,8 +290,8 @@ vips_foreign_save_cgif_write_frame( VipsForeignSaveCgif *cgif )
|
|||||||
cgif->n_cmaps_generated += 1;
|
cgif->n_cmaps_generated += 1;
|
||||||
cgif->lp = vips__quantise_get_palette(
|
cgif->lp = vips__quantise_get_palette(
|
||||||
cgif->quantisation_result );
|
cgif->quantisation_result );
|
||||||
printf( "frame %d, change %g, new %d item colourmap\n",
|
printf( "frame %d, new %d item colourmap\n",
|
||||||
page_index, change, cgif->lp->count );
|
page_index, cgif->lp->count );
|
||||||
#endif/*DEBUG_PERCENT*/
|
#endif/*DEBUG_PERCENT*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user