mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Pixel blending fix.
This commit is contained in:
parent
679f29f923
commit
9affbafa75
1 changed files with 34 additions and 34 deletions
|
|
@ -35,6 +35,16 @@
|
|||
class PixelRGB;
|
||||
class PixelAlpha;
|
||||
|
||||
inline uint32 maskPixelComponents (uint32 x) noexcept
|
||||
{
|
||||
return (x >> 8) & 0x00ff00ff;
|
||||
}
|
||||
|
||||
inline uint32 clampPixelComponents (uint32 x) noexcept
|
||||
{
|
||||
return (x & 0x00ff00ff) | (maskPixelComponents (x) * 0xff);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Represents a 32-bit ARGB pixel with premultiplied alpha, and can perform compositing
|
||||
|
|
@ -98,13 +108,10 @@ public:
|
|||
template <class Pixel>
|
||||
forcedinline void blend (const Pixel& src) noexcept
|
||||
{
|
||||
uint32 sargb = src.getARGB();
|
||||
const uint32 alpha = 0x100 - (sargb >> 24);
|
||||
|
||||
sargb += 0x00ff00ff & ((getRB() * alpha) >> 8);
|
||||
sargb += 0xff00ff00 & (getAG() * alpha);
|
||||
|
||||
argb = sargb;
|
||||
const uint32 alpha = 0x100 - src.getAlpha();
|
||||
uint32 rb = src.getRB() + maskPixelComponents (getRB() * alpha);
|
||||
uint32 ag = src.getAG() + maskPixelComponents (getAG() * alpha);
|
||||
argb = clampPixelComponents (rb) + (clampPixelComponents (ag) << 8);
|
||||
}
|
||||
|
||||
/** Blends another pixel onto this one.
|
||||
|
|
@ -123,17 +130,14 @@ public:
|
|||
template <class Pixel>
|
||||
forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept
|
||||
{
|
||||
++extraAlpha;
|
||||
uint32 ag = maskPixelComponents (extraAlpha * src.getAG());
|
||||
const uint32 alpha = 0x100 - (ag >> 16);
|
||||
ag += maskPixelComponents (getAG() * alpha);
|
||||
|
||||
uint32 sargb = ((extraAlpha * src.getAG()) & 0xff00ff00)
|
||||
| (((extraAlpha * src.getRB()) >> 8) & 0x00ff00ff);
|
||||
uint32 rb = maskPixelComponents (extraAlpha * src.getRB())
|
||||
+ maskPixelComponents (getRB() * alpha);
|
||||
|
||||
const uint32 alpha = 0x100 - (sargb >> 24);
|
||||
|
||||
sargb += 0x00ff00ff & ((getRB() * alpha) >> 8);
|
||||
sargb += 0xff00ff00 & (getAG() * alpha);
|
||||
|
||||
argb = sargb;
|
||||
argb = clampPixelComponents(rb) + (clampPixelComponents (ag) << 8);
|
||||
}
|
||||
|
||||
/** Blends another pixel with this one, creating a colour that is somewhere
|
||||
|
|
@ -347,15 +351,14 @@ public:
|
|||
template <class Pixel>
|
||||
forcedinline void blend (const Pixel& src) noexcept
|
||||
{
|
||||
uint32 sargb = src.getARGB();
|
||||
const uint32 alpha = 0x100 - (sargb >> 24);
|
||||
const uint32 alpha = 0x100 - src.getAlpha();
|
||||
|
||||
sargb += 0x00ff00ff & ((getRB() * alpha) >> 8);
|
||||
sargb += 0x0000ff00 & (g * alpha);
|
||||
uint32 rb = clampPixelComponents (src.getRB() + maskPixelComponents (getRB() * alpha));
|
||||
uint32 ag = src.getAG() + (g * alpha >> 8);
|
||||
|
||||
r = (uint8) (sargb >> 16);
|
||||
g = (uint8) (sargb >> 8);
|
||||
b = (uint8) sargb;
|
||||
r = (uint8) (rb >> 16);
|
||||
g = (uint8) clampPixelComponents (ag);
|
||||
b = (uint8) rb;
|
||||
}
|
||||
|
||||
forcedinline void blend (const PixelRGB src) noexcept
|
||||
|
|
@ -371,19 +374,16 @@ public:
|
|||
template <class Pixel>
|
||||
forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept
|
||||
{
|
||||
++extraAlpha;
|
||||
const uint32 srb = (extraAlpha * src.getRB()) >> 8;
|
||||
const uint32 sag = extraAlpha * src.getAG();
|
||||
uint32 sargb = (sag & 0xff00ff00) | (srb & 0x00ff00ff);
|
||||
uint32 ag = maskPixelComponents (extraAlpha * src.getAG());
|
||||
const uint32 alpha = 0x100 - (ag >> 16);
|
||||
ag += g * alpha >> 8;
|
||||
|
||||
const uint32 alpha = 0x100 - (sargb >> 24);
|
||||
uint32 rb = clampPixelComponents (maskPixelComponents (extraAlpha * src.getRB())
|
||||
+ maskPixelComponents (getRB() * alpha));
|
||||
|
||||
sargb += 0x00ff00ff & ((getRB() * alpha) >> 8);
|
||||
sargb += 0x0000ff00 & (g * alpha);
|
||||
|
||||
b = (uint8) sargb;
|
||||
g = (uint8) (sargb >> 8);
|
||||
r = (uint8) (sargb >> 16);
|
||||
b = (uint8) rb;
|
||||
g = (uint8) clampPixelComponents (ag);
|
||||
r = (uint8) (rb >> 16);
|
||||
}
|
||||
|
||||
/** Blends another pixel with this one, creating a colour that is somewhere
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue