HV* countColors( SV *img ) { STRLEN l; U32 *rgba = (U32*)SvPVx( img, l ), i; HV* counts = newHV(); SV *dummy = newSV( 4 ); l /= 4; for( i = 0; i < l; ++i ) { U32 hash; PERL_HASH( (U32)hash, (char*)&rgba[ i ], 4 ); SvPV_set( dummy, (char*)&rgba[ i ] ); if( hv_exists_ent( counts, dummy, hash ) ) { SV **val = hv_fetch( counts, (char*)&rgba[ i ], 4, hash ); SvIV_set( *val, SvIV( *val ) + 1 ); } else { SV *val = newSViv( 1 ); hv_store( counts, (char*)&rgba[ i ], 4, val, hash ); } } return counts; }