mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
DRY-ing some loops in the software renderer (and improving performance).
This commit is contained in:
parent
f5af56f1b5
commit
a4b2a5dfa9
1 changed files with 31 additions and 121 deletions
|
|
@ -566,6 +566,12 @@ namespace GradientPixelIterators
|
|||
};
|
||||
}
|
||||
|
||||
#define JUCE_PERFORM_PIXEL_OP_LOOP(op) \
|
||||
{ \
|
||||
const int destStride = destData.pixelStride; \
|
||||
do { dest->op; dest = addBytesToPointer (dest, destStride); } while (--width > 0); \
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
/** Contains classes for filling edge tables with various fill types. */
|
||||
namespace EdgeTableFillers
|
||||
|
|
@ -576,9 +582,9 @@ namespace EdgeTableFillers
|
|||
{
|
||||
public:
|
||||
SolidColour (const Image::BitmapData& image, const PixelARGB& colour)
|
||||
: data (image), sourceColour (colour)
|
||||
: destData (image), sourceColour (colour)
|
||||
{
|
||||
if (sizeof (PixelType) == 3 && data.pixelStride == sizeof (PixelType))
|
||||
if (sizeof (PixelType) == 3 && destData.pixelStride == sizeof (PixelType))
|
||||
{
|
||||
areRGBComponentsEqual = sourceColour.getRed() == sourceColour.getGreen()
|
||||
&& sourceColour.getGreen() == sourceColour.getBlue();
|
||||
|
|
@ -591,7 +597,7 @@ namespace EdgeTableFillers
|
|||
|
||||
forcedinline void setEdgeTableYPos (const int y) noexcept
|
||||
{
|
||||
linePixels = (PixelType*) data.getLinePointer (y);
|
||||
linePixels = (PixelType*) destData.getLinePointer (y);
|
||||
}
|
||||
|
||||
forcedinline void handleEdgeTablePixel (const int x, const int alphaLevel) const noexcept
|
||||
|
|
@ -634,7 +640,7 @@ namespace EdgeTableFillers
|
|||
}
|
||||
|
||||
private:
|
||||
const Image::BitmapData& data;
|
||||
const Image::BitmapData& destData;
|
||||
PixelType* linePixels;
|
||||
PixelARGB sourceColour;
|
||||
PixelRGB filler [4];
|
||||
|
|
@ -642,27 +648,17 @@ namespace EdgeTableFillers
|
|||
|
||||
forcedinline PixelType* getPixel (const int x) const noexcept
|
||||
{
|
||||
return addBytesToPointer (linePixels, x * data.pixelStride);
|
||||
}
|
||||
|
||||
forcedinline void incDestPixelPointer (PixelType*& p) const noexcept
|
||||
{
|
||||
p = addBytesToPointer (p, data.pixelStride);
|
||||
return addBytesToPointer (linePixels, x * destData.pixelStride);
|
||||
}
|
||||
|
||||
inline void blendLine (PixelType* dest, const PixelARGB& colour, int width) const noexcept
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (colour);
|
||||
incDestPixelPointer (dest);
|
||||
}
|
||||
while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (colour))
|
||||
}
|
||||
|
||||
forcedinline void replaceLine (PixelRGB* dest, const PixelARGB& colour, int width) const noexcept
|
||||
{
|
||||
if (data.pixelStride == sizeof (*dest))
|
||||
if (destData.pixelStride == sizeof (*dest))
|
||||
{
|
||||
if (areRGBComponentsEqual) // if all the component values are the same, we can cheat..
|
||||
{
|
||||
|
|
@ -701,40 +697,21 @@ namespace EdgeTableFillers
|
|||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->set (colour);
|
||||
incDestPixelPointer (dest);
|
||||
}
|
||||
while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (set (colour))
|
||||
}
|
||||
}
|
||||
|
||||
forcedinline void replaceLine (PixelAlpha* dest, const PixelARGB& colour, int width) const noexcept
|
||||
{
|
||||
if (data.pixelStride == sizeof (*dest))
|
||||
{
|
||||
if (destData.pixelStride == sizeof (*dest))
|
||||
memset (dest, colour.getAlpha(), (size_t) width);
|
||||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->setAlpha (colour.getAlpha());
|
||||
incDestPixelPointer (dest);
|
||||
}
|
||||
while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (setAlpha (colour.getAlpha()))
|
||||
}
|
||||
|
||||
forcedinline void replaceLine (PixelARGB* dest, const PixelARGB& colour, int width) const noexcept
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->set (colour);
|
||||
incDestPixelPointer (dest);
|
||||
|
||||
} while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (set (colour))
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (SolidColour)
|
||||
|
|
@ -774,34 +751,15 @@ namespace EdgeTableFillers
|
|||
PixelType* dest = getPixel (x);
|
||||
|
||||
if (alphaLevel < 0xff)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (GradientType::getPixel (x++), (uint32) alphaLevel);
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++), (uint32) alphaLevel))
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (GradientType::getPixel (x++));
|
||||
incDestPixelPointer (dest);
|
||||
}
|
||||
while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++)))
|
||||
}
|
||||
|
||||
void handleEdgeTableLineFull (int x, int width) const noexcept
|
||||
{
|
||||
PixelType* dest = getPixel (x);
|
||||
|
||||
do
|
||||
{
|
||||
dest->blend (GradientType::getPixel (x++));
|
||||
incDestPixelPointer (dest);
|
||||
}
|
||||
while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++)))
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
@ -813,11 +771,6 @@ namespace EdgeTableFillers
|
|||
return addBytesToPointer (linePixels, x * destData.pixelStride);
|
||||
}
|
||||
|
||||
forcedinline void incDestPixelPointer (PixelType*& p) const noexcept
|
||||
{
|
||||
p = addBytesToPointer (p, destData.pixelStride);
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE (Gradient)
|
||||
};
|
||||
|
||||
|
|
@ -873,26 +826,14 @@ namespace EdgeTableFillers
|
|||
|
||||
if (alphaLevel < 0xfe)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*getSrcPixel (repeatPattern ? (x++ % srcData.width) : x++), (uint32) alphaLevel);
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (repeatPattern ? (x++ % srcData.width) : x++), (uint32) alphaLevel))
|
||||
}
|
||||
else
|
||||
{
|
||||
if (repeatPattern)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*getSrcPixel (x++ % srcData.width));
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width)))
|
||||
else
|
||||
{
|
||||
copyRow (dest, getSrcPixel (x), width);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -905,26 +846,14 @@ namespace EdgeTableFillers
|
|||
|
||||
if (extraAlpha < 0xfe)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*getSrcPixel (repeatPattern ? (x++ % srcData.width) : x++), (uint32) extraAlpha);
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (repeatPattern ? (x++ % srcData.width) : x++), (uint32) extraAlpha))
|
||||
}
|
||||
else
|
||||
{
|
||||
if (repeatPattern)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*getSrcPixel (x++ % srcData.width));
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width)))
|
||||
else
|
||||
{
|
||||
copyRow (dest, getSrcPixel (x), width);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -957,11 +886,6 @@ namespace EdgeTableFillers
|
|||
return addBytesToPointer (sourceLineStart, x * srcData.pixelStride);
|
||||
}
|
||||
|
||||
forcedinline void incDestPixelPointer (DestPixelType*& p) const noexcept
|
||||
{
|
||||
p = addBytesToPointer (p, destData.pixelStride);
|
||||
}
|
||||
|
||||
forcedinline void copyRow (DestPixelType* dest, SrcPixelType const* src, int width) const noexcept
|
||||
{
|
||||
if (srcData.pixelStride == 3 && destData.pixelStride == 3)
|
||||
|
|
@ -970,11 +894,14 @@ namespace EdgeTableFillers
|
|||
}
|
||||
else
|
||||
{
|
||||
const int destStride = destData.pixelStride;
|
||||
const int srcStride = srcData.pixelStride;
|
||||
|
||||
do
|
||||
{
|
||||
dest->blend (*src);
|
||||
incDestPixelPointer (dest);
|
||||
src = addBytesToPointer (src, srcData.pixelStride);
|
||||
dest = addBytesToPointer (dest, destStride);
|
||||
src = addBytesToPointer (src, srcStride);
|
||||
} while (--width > 0);
|
||||
}
|
||||
}
|
||||
|
|
@ -1042,21 +969,9 @@ namespace EdgeTableFillers
|
|||
alphaLevel >>= 8;
|
||||
|
||||
if (alphaLevel < 0xfe)
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*span++, (uint32) alphaLevel);
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*span++, (uint32) alphaLevel))
|
||||
else
|
||||
{
|
||||
do
|
||||
{
|
||||
dest->blend (*span++);
|
||||
incDestPixelPointer (dest);
|
||||
} while (--width > 0);
|
||||
}
|
||||
JUCE_PERFORM_PIXEL_OP_LOOP (blend (*span++))
|
||||
}
|
||||
|
||||
forcedinline void handleEdgeTableLineFull (const int x, int width) noexcept
|
||||
|
|
@ -1086,11 +1001,6 @@ namespace EdgeTableFillers
|
|||
return addBytesToPointer (linePixels, x * destData.pixelStride);
|
||||
}
|
||||
|
||||
forcedinline void incDestPixelPointer (DestPixelType*& p) const noexcept
|
||||
{
|
||||
p = addBytesToPointer (p, destData.pixelStride);
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
template <class PixelType>
|
||||
void generate (PixelType* dest, const int x, int numPixels) noexcept
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue