?? libmng_pixels.c
字號:
MNG_COMPOSE8 (*(pScanline+1), *pDataline, iFGa8, *(pScanline+1))
MNG_COMPOSE8 (*(pScanline+2), *(pDataline+1), iFGa8, *(pScanline+2))
MNG_COMPOSE8 (*(pScanline+3), *(pDataline+2), iFGa8, *(pScanline+3))
#endif
}
else
{ /* now blend */
MNG_BLEND8 (*pDataline, *(pDataline+1), *(pDataline+2), iFGa8,
*(pScanline+1), *(pScanline+2), *(pScanline+3), iBGa8,
iCr8, iCg8, iCb8, iCa8)
/* and return the composed values */
*pScanline = iCa8;
*(pScanline+1) = iCr8;
*(pScanline+2) = iCg8;
*(pScanline+3) = iCb8;
}
}
}
pScanline += (pData->iColinc << 2);
pDataline += 4;
}
}
}
}
check_update_region (pData);
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8, MNG_LC_END)
#endif
return MNG_NOERROR;
}
#endif /* MNG_SKIPCANVAS_ARGB8 */
/* ************************************************************************** */
#ifndef MNG_SKIPCANVAS_ARGB8_PM
mng_retcode mng_display_argb8_pm (mng_datap pData)
{
mng_uint8p pScanline;
mng_uint8p pDataline;
mng_int32 iX;
mng_uint32 s, t;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_START)
#endif
/* viewable row ? */
if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
{ /* address destination row */
pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
pData->iRow + pData->iDestt -
pData->iSourcet);
/* adjust destination row starting-point */
pScanline = pScanline + (pData->iCol << 2) + (pData->iDestl << 2);
pDataline = pData->pRGBArow; /* address source row */
#ifndef MNG_NO_16BIT_SUPPORT
if (pData->bIsRGBA16) /* adjust source row starting-point */
pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
else
#endif
pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
if (pData->bIsOpaque) /* forget about transparency ? */
{
#ifndef MNG_NO_16BIT_SUPPORT
if (pData->bIsRGBA16) /* 16-bit input row ? */
{
for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc)
{ /* scale down by dropping the LSB */
if ((s = pDataline[6]) == 0)
*(mng_uint32*) pScanline = 0; /* set all components = 0 */
else
{
if (s == 255)
{
pScanline[0] = 255;
pScanline[1] = pDataline[0];
pScanline[2] = pDataline[2];
pScanline[3] = pDataline[4];
}
else
{
pScanline[0] = (mng_uint8)s;
#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
{
int i;
for (i=2; i >= 0; i--)
{
pScanline[3-i] = DIV255B8(s * pDataline[4-i-i]);
}
}
#else
pScanline[1] = DIV255B8(s * pDataline[0]);
pScanline[2] = DIV255B8(s * pDataline[2]);
pScanline[3] = DIV255B8(s * pDataline[4]);
#endif
}
}
pScanline += (pData->iColinc << 2);
pDataline += 8;
}
}
else
#endif
{
for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc)
{ /* copy the values and premultiply */
if ((s = pDataline[3]) == 0)
*(mng_uint32*) pScanline = 0; /* set all components = 0 */
else
{
if (s == 255)
{
pScanline[0] = 255;
pScanline[1] = pDataline[0];
pScanline[2] = pDataline[1];
pScanline[3] = pDataline[2];
}
else
{
pScanline[0] = (mng_uint8)s;
#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
{
int i;
for (i=2; i >= 0; i--)
{
pScanline[3-i] = DIV255B8(s * pDataline[2-i]);
}
}
#else
pScanline[1] = DIV255B8(s * pDataline[0]);
pScanline[2] = DIV255B8(s * pDataline[1]);
pScanline[3] = DIV255B8(s * pDataline[2]);
#endif
}
}
pScanline += (pData->iColinc << 2);
pDataline += 4;
}
}
}
else
{
#ifndef MNG_NO_16BIT_SUPPORT
if (pData->bIsRGBA16) /* 16-bit input row ? */
{
for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc)
{ /* get alpha values */
if ((s = pDataline[6]) != 0) /* any opacity at all ? */
{ /* fully opaque or background fully transparent ? */
if (s == 255)
{ /* plain copy it */
pScanline[0] = 255;
pScanline[1] = pDataline[0];
pScanline[2] = pDataline[2];
pScanline[3] = pDataline[4];
}
else
{ /* now blend (premultiplied) */
t = 255 - s;
pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
{
int i;
for (i=2; i >= 0; i--)
{
pScanline[3-i] = DIV255B8(s * pDataline[4-i-i] + t *
pScanline[3-i]);
}
}
#else
pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
pScanline[2] = DIV255B8(s * pDataline[2] + t * pScanline[2]);
pScanline[3] = DIV255B8(s * pDataline[4] + t * pScanline[3]);
#endif
}
}
pScanline += (pData->iColinc << 2);
pDataline += 8;
}
}
else
#endif
{
for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc)
{
if ((s = pDataline[3]) != 0) /* any opacity at all ? */
{ /* fully opaque ? */
if (s == 255)
{ /* then simply copy the values */
pScanline[0] = 255;
pScanline[1] = pDataline[0];
pScanline[2] = pDataline[1];
pScanline[3] = pDataline[2];
}
else
{ /* now blend (premultiplied) */
t = 255 - s;
pScanline[0] = (mng_uint8)(255 - DIV255B8(t * (255 - pScanline[0])));
#ifdef MNG_OPTIMIZE_FOOTPRINT_DIV
{
int i;
for (i=2; i >= 0; i--)
{
pScanline[3-i] = DIV255B8(s * pDataline[2-i] + t *
pScanline[3-i]);
}
}
#else
pScanline[1] = DIV255B8(s * pDataline[0] + t * pScanline[1]);
pScanline[2] = DIV255B8(s * pDataline[1] + t * pScanline[2]);
pScanline[3] = DIV255B8(s * pDataline[2] + t * pScanline[3]);
#endif
}
}
pScanline += (pData->iColinc << 2);
pDataline += 4;
}
}
}
}
check_update_region (pData);
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DISPLAY_ARGB8_PM, MNG_LC_END)
#endif
return MNG_NOERROR;
}
#endif /* MNG_SKIPCANVAS_ARGB8_PM */
/* ************************************************************************** */
#ifndef MNG_SKIPCANVAS_RGB8_A8
mng_retcode mng_display_rgb8_a8 (mng_datap pData)
{
mng_uint8p pScanline;
mng_uint8p pAlphaline;
mng_uint8p pDataline;
mng_int32 iX;
mng_uint8 iFGa8, iBGa8, iCa8;
#ifndef MNG_NO_16BIT_SUPPORT
mng_uint16 iFGa16, iBGa16, iCa16;
#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE
mng_uint16 iFGr16, iFGg16, iFGb16;
#else
mng_uint16 iFGg16;
#endif
mng_uint16 iBGr16, iBGg16, iBGb16;
mng_uint16 iCr16, iCg16, iCb16;
#endif
mng_uint8 iCr8, iCg8, iCb8;
#ifdef MNG_SUPPORT_TRACE
MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8_A8, MNG_LC_START)
#endif
/* viewable row ? */
if ((pData->iRow >= pData->iSourcet) && (pData->iRow < pData->iSourceb))
{ /* address destination rows */
pScanline = (mng_uint8p)pData->fGetcanvasline (((mng_handle)pData),
pData->iRow + pData->iDestt -
pData->iSourcet);
pAlphaline = (mng_uint8p)pData->fGetalphaline (((mng_handle)pData),
pData->iRow + pData->iDestt -
pData->iSourcet);
/* adjust destination rows starting-point */
pScanline = pScanline + (pData->iCol * 3) + (pData->iDestl * 3);
pAlphaline = pAlphaline + pData->iCol + pData->iDestl;
pDataline = pData->pRGBArow; /* address source row */
#ifndef MNG_NO_16BIT_SUPPORT
if (pData->bIsRGBA16) /* adjust source row starting-point */
pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3);
else
#endif
pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2);
if (pData->bIsOpaque)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -