void PLSubBmp::Create( PLBmpBase & SrcBmp, const PLRect & SrcRect) { PLASSERT (!m_pLineArray); int bpp = SrcBmp.GetBitsPerPixel(); if (bpp <= 8) m_pClrTab = new PLPixel32[(int)(1 << bpp)]; else m_pClrTab = NULL; initLocals (SrcRect.Width(), SrcRect.Height(), SrcBmp.GetPixelFormat()); if (bpp <= 8) SetPalette (SrcBmp.GetPalette()); m_pLineArray = new PLBYTE * [m_Size.y]; PLBYTE** ppSrcLines = SrcBmp.GetLineArray(); int XOfs = SrcRect.tl.x*(bpp/8); for (int y=0; y<m_Size.y; y++) m_pLineArray[y] = ppSrcLines[SrcRect.tl.y+y]+XOfs; PLASSERT_VALID(this); }
void applyMultiplicationMap (PLBmp & textureBmp, const PLBmp & attnBmp, const PLRect & srcRect, double myLightingFactor) { assert(attnBmp.GetBitsPerPixel() == 8); assert(textureBmp.GetBitsPerPixel() == 32); assert (srcRect.Width() > 0 && srcRect.Height() > 0); double Scale = double(srcRect.Width())/textureBmp.GetWidth(); double YScale = double(srcRect.Height())/textureBmp.GetHeight(); assert (Scale == YScale); (void)YScale; PLBYTE ** myAttnBmpLines = attnBmp.GetLineArray(); PLPixel32 ** myTextureBmpLines = (PLPixel32**)textureBmp.GetLineArray(); if (Scale > 0.99) { for (int y=0;y<textureBmp.GetHeight(); y++) { for (int x=0;x<textureBmp.GetWidth(); x++) { PLPixel32& col = myTextureBmpLines[y][x]; PLBYTE myScale; myScale = PLBYTE(myAttnBmpLines[int(Scale*y+srcRect.tl.y)] [int(Scale*x+srcRect.tl.x)]); int tempIntR = int((myLightingFactor * col.GetR() * myScale)/256); int tempIntG = int((myLightingFactor * col.GetG() * myScale)/256); int tempIntB = int((myLightingFactor * col.GetB() * myScale)/256); col.Set( static_cast<PLBYTE>(min(tempIntR,255)), static_cast<PLBYTE>(min(tempIntG,255)), static_cast<PLBYTE>(min(tempIntB,255)), 255 ); } } } else { int MaxY = attnBmp.GetHeight()-1; int MaxX = attnBmp.GetWidth()-1; for (int y=0;y<textureBmp.GetHeight(); y++) { double ySrcPos = Scale*y+srcRect.tl.y; int yLightPos = int (ySrcPos); double yLightFade = fmod (ySrcPos, 1); if (yLightPos >= MaxY) { yLightPos = MaxY - 1; yLightFade = 1; } for (int x=0;x<textureBmp.GetWidth(); x++) { PLPixel32& col = myTextureBmpLines[y][x]; double xSrcPos = Scale*x+srcRect.tl.x; int xLightPos = int (xSrcPos); double xLightFade = fmod (xSrcPos, 1); if (xLightPos >= MaxX) { xLightPos = MaxX - 1; xLightFade = 1; } double myScale = double(myAttnBmpLines[yLightPos][xLightPos])* (1-xLightFade)*(1-yLightFade) + double(myAttnBmpLines[yLightPos][xLightPos+1])* xLightFade*(1-yLightFade) + double(myAttnBmpLines[yLightPos+1][xLightPos])* (1-xLightFade)*yLightFade + double(myAttnBmpLines[yLightPos+1][xLightPos+1])* xLightFade*yLightFade; int tempIntR = int((myLightingFactor * col.GetR() * myScale) /256); int tempIntG = int((myLightingFactor * col.GetG() * myScale) /256); int tempIntB = int((myLightingFactor * col.GetB() * myScale) /256); col.Set( static_cast<PLBYTE>(min(tempIntR,255)), static_cast<PLBYTE>(min(tempIntG,255)), static_cast<PLBYTE>(min(tempIntB,255)), 255); } } } }