@@ -816,14 +816,6 @@ CPLErr BlendBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
816816 for (int i = 0 ; i < nBufXSize;
817817 ++i, ++nSrcIdx, nDstOffset += nPixelSpace)
818818 {
819- const int nOverlay =
820- (pabyOverlayR && pabyOverlayG && pabyOverlayB)
821- ? RGBToGrayScale (pabyOverlayR[nSrcIdx],
822- pabyOverlayG[nSrcIdx],
823- pabyOverlayB[nSrcIdx])
824- : pabyOverlay ? pabyOverlay[nSrcIdx]
825- : 255 ;
826-
827819 // Corrected to take into account m_opacity255Scale
828820 const int nOverlayA =
829821 pabyOverlayA ? ((pabyOverlayA[nSrcIdx] *
@@ -832,22 +824,34 @@ CPLErr BlendBand::IRasterIO(GDALRWFlag eRWFlag, int nXOff, int nYOff,
832824 256 )
833825 : m_oBlendDataset.m_opacity255Scale ;
834826
835- const int nSrc = paby ? paby[nSrcIdx] : 255 ;
836827 const int nSrcA = pabyA ? pabyA[nSrcIdx] : 255 ;
837828
838829 const int nSrcAMul255MinusOverlayA =
839830 (nSrcA * (255 - nOverlayA) + 255 ) / 256 ;
840- int nDst = (nOverlay * nOverlayA +
841- nSrc * nSrcAMul255MinusOverlayA + 255 ) /
842- 256 ;
831+ const int nDstA = nOverlayA + nSrcAMul255MinusOverlayA;
843832 if (nBand != 4 )
844833 {
845- const int nDstA = nOverlayA + nSrcAMul255MinusOverlayA;
834+ const int nOverlay =
835+ (pabyOverlayR && pabyOverlayG && pabyOverlayB)
836+ ? RGBToGrayScale (pabyOverlayR[nSrcIdx],
837+ pabyOverlayG[nSrcIdx],
838+ pabyOverlayB[nSrcIdx])
839+ : pabyOverlay ? pabyOverlay[nSrcIdx]
840+ : 255 ;
841+
842+ const int nSrc = paby ? paby[nSrcIdx] : 255 ;
843+ int nDst = (nOverlay * nOverlayA +
844+ nSrc * nSrcAMul255MinusOverlayA + 255 ) /
845+ 256 ;
846846 if (nDstA != 0 && nDstA != 255 )
847847 nDst = (nDst * 255 + (nDstA / 2 )) / nDstA;
848+ pabyDst[nDstOffset] =
849+ static_cast <GByte>(std::min (nDst, 255 ));
850+ }
851+ else
852+ {
853+ pabyDst[nDstOffset] = static_cast <GByte>(nDstA);
848854 }
849- pabyDst[nDstOffset] =
850- static_cast <GByte>(std::min (nDst, 255 ));
851855 }
852856 }
853857 }
0 commit comments