Browse Source

Handling variable pixel stride in transformed image render.

tags/2021-05-28
jules 13 years ago
parent
commit
ec590c29cf
1 changed files with 60 additions and 32 deletions
  1. +60
    -32
      modules/juce_graphics/native/juce_RenderingHelpers.h

+ 60
- 32
modules/juce_graphics/native/juce_RenderingHelpers.h View File

@@ -996,7 +996,7 @@ namespace EdgeTableFillers
SrcPixelType p;
generate (&p, x, 1);
linePixels[x].blend (p, (uint32) (alphaLevel * extraAlpha) >> 8);
getDestPixel (x)->blend (p, (uint32) (alphaLevel * extraAlpha) >> 8);
}
forcedinline void handleEdgeTablePixelFull (const int x) noexcept
@@ -1004,7 +1004,7 @@ namespace EdgeTableFillers
SrcPixelType p;
generate (&p, x, 1);
linePixels[x].blend (p, (uint32) extraAlpha);
getDestPixel (x)->blend (p, (uint32) extraAlpha);
}
void handleEdgeTableLine (const int x, int width, int alphaLevel) noexcept
@@ -1018,7 +1018,7 @@ namespace EdgeTableFillers
SrcPixelType* span = scratchBuffer;
generate (span, x, width);
DestPixelType* dest = linePixels + x;
DestPixelType* dest = getDestPixel (x);
alphaLevel *= extraAlpha;
alphaLevel >>= 8;
@@ -1026,14 +1026,16 @@ namespace EdgeTableFillers
{
do
{
dest++ ->blend (*span++, (uint32) alphaLevel);
dest->blend (*span++, (uint32) alphaLevel);
incDestPixelPointer (dest);
} while (--width > 0);
}
else
{
do
{
dest++ ->blend (*span++);
dest->blend (*span++);
incDestPixelPointer (dest);
} while (--width > 0);
}
}
@@ -1060,6 +1062,16 @@ namespace EdgeTableFillers
}
private:
forcedinline DestPixelType* getDestPixel (const int x) const noexcept
{
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
@@ -1145,25 +1157,29 @@ namespace EdgeTableFillers
c[2] += weight * src[2];
c[3] += weight * src[3];
src += this->srcData.pixelStride;
weight = (uint32) (subPixelX * (256 - subPixelY));
c[0] += weight * src[4];
c[1] += weight * src[5];
c[2] += weight * src[6];
c[3] += weight * src[7];
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
c[3] += weight * src[3];
src += this->srcData.lineStride;
weight = (uint32) ((256 - subPixelX) * subPixelY);
weight = (uint32) (subPixelX * subPixelY);
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
c[3] += weight * src[3];
weight = (uint32) (subPixelX * subPixelY);
c[0] += weight * src[4];
c[1] += weight * src[5];
c[2] += weight * src[6];
c[3] += weight * src[7];
src -= this->srcData.pixelStride;
weight = (uint32) ((256 - subPixelX) * subPixelY);
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
c[3] += weight * src[3];
dest->setARGB ((uint8) (c[PixelARGB::indexA] >> 16),
(uint8) (c[PixelARGB::indexR] >> 16),
@@ -1181,11 +1197,13 @@ namespace EdgeTableFillers
c[2] += weight * src[2];
c[3] += weight * src[3];
src += this->srcData.pixelStride;
weight = subPixelX;
c[0] += weight * src[4];
c[1] += weight * src[5];
c[2] += weight * src[6];
c[3] += weight * src[7];
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
c[3] += weight * src[3];
dest->setARGB ((uint8) (c[PixelARGB::indexA] >> 8),
(uint8) (c[PixelARGB::indexR] >> 8),
@@ -1227,22 +1245,26 @@ namespace EdgeTableFillers
c[1] += weight * src[1];
c[2] += weight * src[2];
src += this->srcData.pixelStride;
weight = subPixelX * (256 - subPixelY);
c[0] += weight * src[3];
c[1] += weight * src[4];
c[2] += weight * src[5];
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
src += this->srcData.lineStride;
weight = (256 - subPixelX) * subPixelY;
weight = subPixelX * subPixelY;
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
weight = subPixelX * subPixelY;
c[0] += weight * src[3];
c[1] += weight * src[4];
c[2] += weight * src[5];
src -= this->srcData.pixelStride;
weight = (256 - subPixelX) * subPixelY;
c[0] += weight * src[0];
c[1] += weight * src[1];
c[2] += weight * src[2];
dest->setARGB ((uint8) 255,
(uint8) (c[PixelRGB::indexR] >> 16),
@@ -1259,9 +1281,11 @@ namespace EdgeTableFillers
c[1] += weight * src[1];
c[2] += weight * src[2];
c[0] += subPixelX * src[3];
c[1] += subPixelX * src[4];
c[2] += subPixelX * src[5];
src += this->srcData.pixelStride;
c[0] += subPixelX * src[0];
c[1] += subPixelX * src[1];
c[2] += subPixelX * src[2];
dest->setARGB ((uint8) 255,
(uint8) (c[PixelRGB::indexR] >> 8),
@@ -1295,10 +1319,13 @@ namespace EdgeTableFillers
{
uint32 c = 256 * 128;
c += src[0] * ((256 - subPixelX) * (256 - subPixelY));
src += this->srcData.pixelStride;
c += src[1] * (subPixelX * (256 - subPixelY));
src += this->srcData.lineStride;
c += src[0] * ((256 - subPixelX) * subPixelY);
c += src[1] * (subPixelX * subPixelY);
src -= this->srcData.pixelStride;
c += src[0] * ((256 - subPixelX) * subPixelY);
*((uint8*) dest) = (uint8) (c >> 16);
}
@@ -1307,7 +1334,8 @@ namespace EdgeTableFillers
{
uint32 c = 128;
c += src[0] * (256 - subPixelX);
c += src[1] * subPixelX;
src += this->srcData.pixelStride;
c += src[0] * subPixelX;
*((uint8*) dest) = (uint8) (c >> 8);
}


Loading…
Cancel
Save