1
0
Fork 0
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:
jules 2012-12-15 22:16:29 +00:00
parent f5af56f1b5
commit a4b2a5dfa9

View file

@ -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