📄 libmng_pixels.c
字号:
/* ************************************************************************** */mng_retcode display_rgb8 (mng_datap pData){ mng_uint8p pScanline; mng_uint8p pDataline; mng_int32 iX; mng_uint16 iA16; mng_uint16 iFGr16, iFGg16, iFGb16; mng_uint16 iBGr16, iBGg16, iBGb16; 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 */ if (pData->bIsRGBA16) /* adjust source row starting-point */ pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); else pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); if (pData->bIsOpaque) /* forget about transparency ? */ { 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 { 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 { 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 */ 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); } } pScanline += (pData->iColinc * 3); pDataline += 8; } } else { 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 */ MNG_COMPOSE8 (*pScanline, *pDataline, iA8, *pScanline ) MNG_COMPOSE8 (*(pScanline+1), *(pDataline+1), iA8, *(pScanline+1)) MNG_COMPOSE8 (*(pScanline+2), *(pDataline+2), iA8, *(pScanline+2)) } } 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;}/* ************************************************************************** */mng_retcode display_rgba8 (mng_datap pData){ mng_uint8p pScanline; mng_uint8p pDataline; mng_int32 iX; mng_uint16 iFGa16, iBGa16, iCa16; mng_uint8 iFGa8, iBGa8, iCa8; mng_uint16 iFGr16, iFGg16, iFGb16; mng_uint16 iBGr16, iBGg16, iBGb16; mng_uint16 iCr16, iCg16, iCb16; 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 */ if (pData->bIsRGBA16) /* adjust source row starting-point */ pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 3); else pDataline = pDataline + ((pData->iSourcel / pData->iColinc) << 2); if (pData->bIsOpaque) /* forget about transparency ? */ { 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+3) = *(pDataline+6); pScanline += (pData->iColinc << 2); pDataline += 8; } } else { 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+3) = *(pDataline+3); pScanline += (pData->iColinc << 2); pDataline += 4; } } } else { if (pData->bIsRGBA16) /* 16-bit input row ? */ { for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc) { /* get alpha values */ iFGa16 = mng_get_uint16 (pDataline+6); iBGa16 = (mng_uint16)(*(pScanline+3)); iBGa16 = (mng_uint16)(iBGa16 << 8) | iBGa16; if (iFGa16) /* any opacity at all ? */ { /* fully opaque or background fully transparent ? */ if ((iFGa16 == 0xFFFF) || (iBGa16 == 0)) { /* plain copy it */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+2); *(pScanline+2) = *(pDataline+4); *(pScanline+3) = *(pDataline+6); } else { if (iBGa16 == 0xFFFF) /* background fully opaque ? */ { /* get the proper values */ 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, iFGa16, iBGr16) MNG_COMPOSE16(iFGg16, iFGg16, iFGa16, iBGg16) MNG_COMPOSE16(iFGb16, iFGb16, iFGa16, iBGb16) /* and return the composed values */ *pScanline = (mng_uint8)(iFGr16 >> 8); *(pScanline+1) = (mng_uint8)(iFGg16 >> 8); *(pScanline+2) = (mng_uint8)(iFGb16 >> 8); /* alpha remains fully opaque !!! */ } else { /* 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; /* let's blend */ MNG_BLEND16 (mng_get_uint16 (pDataline ), mng_get_uint16 (pDataline+2), mng_get_uint16 (pDataline+4), iFGa16, iBGr16, iBGg16, iBGb16, iBGa16, iCr16, iCg16, iCb16, iCa16) /* and return the composed values */ *pScanline = (mng_uint8)(iCr16 >> 8); *(pScanline+1) = (mng_uint8)(iCg16 >> 8); *(pScanline+2) = (mng_uint8)(iCb16 >> 8); *(pScanline+3) = (mng_uint8)(iCa16 >> 8); } } } pScanline += (pData->iColinc << 2); pDataline += 8; } } else { for (iX = pData->iSourcel + pData->iCol; iX < pData->iSourcer; iX += pData->iColinc) { iFGa8 = *(pDataline+3); /* get alpha values */ iBGa8 = *(pScanline+3); if (iFGa8) /* any opacity at all ? */ { /* fully opaque or background fully transparent ? */ if ((iFGa8 == 0xFF) || (iBGa8 == 0)) { /* then simply copy the values */ *pScanline = *pDataline; *(pScanline+1) = *(pDataline+1); *(pScanline+2) = *(pDataline+2); *(pScanline+3) = *(pDataline+3); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -