simplify color calculation.
This commit is contained in:
parent
3bf0b9534c
commit
2f24b31b28
|
@ -76,53 +76,13 @@ COLOR4D::COLOR4D( EDA_COLOR_T aColor )
|
||||||
|
|
||||||
COLOR4D COLOR4D::LegacyMix( COLOR4D aColor ) const
|
COLOR4D COLOR4D::LegacyMix( COLOR4D aColor ) const
|
||||||
{
|
{
|
||||||
/* Memoization storage. This could be potentially called for each
|
COLOR4D candidate;
|
||||||
* color merge so a cache is useful (there are few colours anyway) */
|
|
||||||
static std::map< std::pair< uint32_t, uint32_t >, uint32_t > mix_cache;
|
|
||||||
|
|
||||||
// First easy thing: a black gives always the other colour
|
|
||||||
if( *this == COLOR4D::BLACK )
|
|
||||||
return aColor;
|
|
||||||
|
|
||||||
if( aColor == COLOR4D::BLACK )
|
|
||||||
return *this;
|
|
||||||
|
|
||||||
uint32_t myPackedColor = ToU32();
|
|
||||||
uint32_t aPackedColor = aColor.ToU32();
|
|
||||||
|
|
||||||
/* Now we are sure that black can't occur, so the rule is:
|
|
||||||
* BLACK means not computed yet. If we're lucky we already have
|
|
||||||
* an answer */
|
|
||||||
auto search = mix_cache.find( std::pair< uint32_t, uint32_t >( myPackedColor,
|
|
||||||
aPackedColor ) );
|
|
||||||
COLOR4D candidate = COLOR4D::BLACK;
|
|
||||||
|
|
||||||
if( search != mix_cache.end() )
|
|
||||||
candidate.FromU32( search->second );
|
|
||||||
|
|
||||||
if( candidate != COLOR4D::BLACK )
|
|
||||||
return candidate;
|
|
||||||
|
|
||||||
// Blend the two colors (i.e. OR the RGB values)
|
// Blend the two colors (i.e. OR the RGB values)
|
||||||
COLOR4D mixed( ( (uint8_t)( 255.0 * this->r ) | (uint8_t)( 255.0 * aColor.r ) ) / 255.0,
|
candidate.r = ( (unsigned)( 255.0 * r ) | (unsigned)( 255.0 * aColor.r ) ) / 255.0,
|
||||||
( (uint8_t)( 255.0 * this->g ) | (uint8_t)( 255.0 * aColor.g ) ) / 255.0,
|
candidate.g = ( (unsigned)( 255.0 * g ) | (unsigned)( 255.0 * aColor.g ) ) / 255.0,
|
||||||
( (uint8_t)( 255.0 * this->b ) | (uint8_t)( 255.0 * aColor.b ) ) / 255.0,
|
candidate.b = ( (unsigned)( 255.0 * b ) | (unsigned)( 255.0 * aColor.b ) ) / 255.0,
|
||||||
1.0 );
|
candidate.a = 1.0;
|
||||||
candidate = mixed;
|
|
||||||
|
|
||||||
/* Here, BLACK is *not* a good answer, since it would recompute the next time.
|
|
||||||
* Even theorically its not possible (with the current rules), but
|
|
||||||
* maybe the metric will change in the future */
|
|
||||||
if( candidate == COLOR4D::BLACK )
|
|
||||||
candidate = COLOR4D( DARKDARKGRAY );
|
|
||||||
|
|
||||||
// Store the result in the cache. The operation is commutative, too
|
|
||||||
mix_cache.insert( std::pair< std::pair< uint32_t, uint32_t >, uint32_t >
|
|
||||||
( std::pair< uint32_t, uint32_t >( myPackedColor, aPackedColor ),
|
|
||||||
candidate.ToU32() ) );
|
|
||||||
mix_cache.insert( std::pair< std::pair< uint32_t, uint32_t >, uint32_t >
|
|
||||||
( std::pair< uint32_t, uint32_t >( aPackedColor, myPackedColor ),
|
|
||||||
candidate.ToU32() ) );
|
|
||||||
|
|
||||||
return candidate;
|
return candidate;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue