📄 libmng_pixels.c
字号:
(mng_uint32)(AB) / (mng_uint32)(AC)); \ (RC) = (mng_uint16)((S * (mng_uint32)(RT) + \ T * (mng_uint32)(RB) + (mng_uint32)32767) >> 16); \ (GC) = (mng_uint16)((S * (mng_uint32)(GT) + \ T * (mng_uint32)(GB) + (mng_uint32)32767) >> 16); \ (BC) = (mng_uint16)((S * (mng_uint32)(BT) + \ T * (mng_uint32)(BB) + (mng_uint32)32767) >> 16); }/* ************************************************************************** *//* note a good optimizing compiler will optimize this */#define DIV255B8(x) (mng_uint8)(((x) + 127) / 255)#define DIV255B16(x) (mng_uint16)(((x) + 32767) / 65535)/* ************************************************************************** *//* * * *//* * Progressive display check - checks to see if progressive display is * *//* * in order & indicates so * *//* * * *//* * The routine is called after a call to one of the display_xxx routines * *//* * if appropriate * *//* * * *//* * The refresh is warrented in the read_chunk routine (mng_read.c) * *//* * and only during read&display processing, since there's not much point * *//* * doing it from memory! * *//* * * *//* ************************************************************************** */mng_retcode mng_display_progressive_check (mng_datap pData){ if ((pData->bDoProgressive) && /* need progressive display? */ ((pData->eImagetype != mng_it_mng) || (pData->iDataheight > 300)) && (pData->iDestb - pData->iDestt > 50) && (!pData->pCurraniobj)) { mng_int32 iC = pData->iRow + pData->iDestt - pData->iSourcet; if (iC % 20 == 0) /* every 20th line */ pData->bNeedrefresh = MNG_TRUE; } return MNG_NOERROR;}/* ************************************************************************** *//* * * *//* * Display routines - convert rowdata (which is already color-corrected) * *//* * to the output canvas, respecting the opacity information * *//* * * *//* ************************************************************************** */MNG_LOCAL void check_update_region (mng_datap pData){ /* determine actual canvas row */ mng_int32 iRow = pData->iRow + pData->iDestt - pData->iSourcet; /* check for change in update-region */ if ((pData->iDestl < (mng_int32)pData->iUpdateleft) || (pData->iUpdateright == 0)) pData->iUpdateleft = pData->iDestl; if (pData->iDestr > (mng_int32)pData->iUpdateright) pData->iUpdateright = pData->iDestr; if ((iRow < (mng_int32)pData->iUpdatetop) || (pData->iUpdatebottom == 0)) pData->iUpdatetop = iRow; if (iRow+1 > (mng_int32)pData->iUpdatebottom) pData->iUpdatebottom = iRow+1; return;}/* ************************************************************************** */#ifndef MNG_SKIPCANVAS_RGB8mng_retcode mng_display_rgb8 (mng_datap pData){ mng_uint8p pScanline; mng_uint8p pDataline; mng_int32 iX;#ifndef MNG_NO_16BIT_SUPPORT mng_uint16 iA16;#ifndef MNG_OPTIMIZE_FOOTPRINT_COMPOSE mng_uint16 iFGr16, iFGg16, iFGb16; mng_uint16 iBGr16, iBGg16, iBGb16;#else mng_uint16 iFGg16; mng_uint16 iBGg16;#endif#endif mng_uint8 iA8;#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, 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 * 3) + (pData->iDestl * 3); 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 */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+2); *(pScanline+2) = *(pDataline+4); pScanline += (pData->iColinc * 3); pDataline += 8; } } else#endif { for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc) { /* copy the values */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+1); *(pScanline+2) = *(pDataline+2); pScanline += (pData->iColinc * 3); 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) { iA16 = mng_get_uint16 (pDataline+6); if (iA16) /* any opacity at all ? */ { if (iA16 == 0xFFFF) /* fully opaque ? */ { /* scale down by dropping the LSB */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+2); *(pScanline+2) = *(pDataline+4); } else { /* get the proper values */#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE int i; for (i=2; i >= 0; i--) { iFGg16 = mng_get_uint16 (pDataline+i+i); /* scale background up */ iBGg16 = (mng_uint16)(*(pScanline+i)); iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; /* now compose */ MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); /* and return the composed values */ *(pScanline+i) = (mng_uint8)(iFGg16 >> 8); }#else iFGr16 = mng_get_uint16 (pDataline ); iFGg16 = mng_get_uint16 (pDataline+2); iFGb16 = mng_get_uint16 (pDataline+4); /* scale background up */ iBGr16 = (mng_uint16)(*pScanline ); iBGg16 = (mng_uint16)(*(pScanline+1)); iBGb16 = (mng_uint16)(*(pScanline+2)); iBGr16 = (mng_uint16)((mng_uint32)iBGr16 << 8) | iBGr16; iBGg16 = (mng_uint16)((mng_uint32)iBGg16 << 8) | iBGg16; iBGb16 = (mng_uint16)((mng_uint32)iBGb16 << 8) | iBGb16; /* now compose */ MNG_COMPOSE16(iFGr16, iFGr16, iA16, iBGr16); MNG_COMPOSE16(iFGg16, iFGg16, iA16, iBGg16); MNG_COMPOSE16(iFGb16, iFGb16, iA16, iBGb16); /* and return the composed values */ *pScanline = (mng_uint8)(iFGr16 >> 8); *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); *(pScanline+2) = (mng_uint8)(iFGb16 >> 8);#endif } } pScanline += (pData->iColinc * 3); pDataline += 8; } } else#endif { for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc) { iA8 = *(pDataline+3); /* get alpha value */ if (iA8) /* any opacity at all ? */ { if (iA8 == 0xFF) /* fully opaque ? */ { /* then simply copy the values */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+1); *(pScanline+2) = *(pDataline+2); } else { /* do alpha composing */#ifdef MNG_OPTIMIZE_FOOTPRINT_COMPOSE int i; for (i=2; i >= 0; i--) { MNG_COMPOSE8 (*(pScanline+i), *(pDataline+i), iA8, *(pScanline+i)); }#else MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline ); MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)); MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2));#endif } } pScanline += (pData->iColinc * 3); pDataline += 4; } } } } check_update_region (pData);#ifdef MNG_SUPPORT_TRACE MNG_TRACE (pData, MNG_FN_DISPLAY_RGB8, MNG_LC_END);#endif return MNG_NOERROR;}#endif /* MNG_SKIPCANVAS_RGB8 *//* ************************************************************************** */#ifndef MNG_SKIPCANVAS_RGBA8mng_retcode mng_display_rgba8 (mng_datap pData){ mng_uint8p pScanline; 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_RGBA8, 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 ? */ {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -