void PLFilterSubtract::Apply(PLBmpBase * pBmpSource, PLBmp * pBmpDest) const { // Calculate the size of the new bitmap pBmpDest->Create (pBmpSource->GetWidth(), pBmpSource->GetHeight(), pBmpSource->GetPixelFormat(), NULL, 0, pBmpSource->GetResolution()); for (int y = 0; y < pBmpSource->GetHeight(); ++y) { for (int x = 0; x < pBmpSource->GetWidth(); ++x) { PLPixel32 srcPixel = pBmpSource->GetPixel32(x,y); PLPixel32 differencePixel; if (x < m_pBmpSubtrahend->GetWidth() && y < m_pBmpSubtrahend->GetHeight()) { PLPixel32 substrahendPixel = m_pBmpSubtrahend->GetPixel32(x,y); differencePixel.SetR( static_cast<PLBYTE>(abs(srcPixel.GetR() - substrahendPixel.GetR())) ); differencePixel.SetG( static_cast<PLBYTE>(abs(srcPixel.GetG() - substrahendPixel.GetG())) ); differencePixel.SetB( static_cast<PLBYTE>(abs(srcPixel.GetB() - substrahendPixel.GetB())) ); differencePixel.SetA( static_cast<PLBYTE>(abs(srcPixel.GetA() - substrahendPixel.GetA())) ); } else { differencePixel = srcPixel; } pBmpDest->SetPixel(x,y,differencePixel); } } }
void PLFilterGetAlpha::Apply(PLBmpBase * pBmpSource, PLBmp * pBmpDest) const { // Only works for 32 bpp bitmaps. PLASSERT (pBmpSource->GetBitsPerPixel() == 32); PLASSERT (pBmpSource->HasAlpha()); pBmpDest->Create (pBmpSource->GetWidth(), pBmpSource->GetHeight(), PLPixelFormat::L8, NULL, 0, pBmpSource->GetResolution()); PLPixel32 ** pSrcLines = pBmpSource->GetLineArray32(); PLBYTE ** pDstLines = pBmpDest->GetLineArray(); for (int y = 0; y<pBmpDest->GetHeight(); ++y) { // For each line PLPixel32 * pSrcPixel = pSrcLines[y]; PLBYTE * pDstPixel = pDstLines[y]; for (int x = 0; x < pBmpDest->GetWidth(); ++x) { // For each pixel *pDstPixel = pSrcPixel->GetA(); ++pSrcPixel; ++pDstPixel; } } }
void multAndStore(PLPixel32 & theResult, PLPixel32 * theSource, int theScale ) { theResult.SetR( static_cast<PLBYTE>(minimum(theResult.GetR() + (((theSource->GetR() * theScale)+128) / 256), 255)) ); theResult.SetG( static_cast<PLBYTE>(minimum(theResult.GetG() + (((theSource->GetG() * theScale)+128) / 256), 255)) ); theResult.SetB( static_cast<PLBYTE>(minimum(theResult.GetB() + (((theSource->GetB() * theScale)+128) / 256), 255)) ); theResult.SetA( static_cast<PLBYTE>(minimum(theResult.GetA() + (((theSource->GetA() * theScale)+128) / 256), 255)) ); }