123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- ////////////////////////////////////////////////////////////////////////////////
- //
- // Copyright 2016 RWS Inc, All Rights Reserved
- //
- // This program is free software; you can redistribute it and/or modify
- // it under the terms of version 2 of the GNU General Public License as published by
- // the Free Software Foundation
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License along
- // with this program; if not, write to the Free Software Foundation, Inc.,
- // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- //
- // alpha.cpp
- //
- // History:
- // 10/04/96 JMI Started.
- //
- //
- //////////////////////////////////////////////////////////////////////////////
- //
- // Cheezy ass alpha blit.
- //
- //////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////
- // Includes.
- //////////////////////////////////////////////////////////////////////////////
- /*
- #include "System.h"
- #ifdef PATHS_IN_INCLUDES
- #include "GREEN/Image/Image.h"
- #include "GREEN/BLiT/BLIT.H"
- #else
- #include "Image.h"
- #include "BLIT.H"
- #endif
- #else
- */
- #include "RSPiX.h"
- #include "alpha.h"
- //////////////////////////////////////////////////////////////////////////////
- // Macros.
- //////////////////////////////////////////////////////////////////////////////
- #define TRANS_INDEX 14
- //////////////////////////////////////////////////////////////////////////////
- // HACKS.
- //////////////////////////////////////////////////////////////////////////////
- #if 0
- //========================================================================================
- extern short rspBlitT(U8 u8Trans, RImage* pimSrc,RImage* pimDst,short sSrcX,short sSrcY,short sDstX,
- short sDstY,short sW,short sH,RRect* prDst,const RRect* prSrc);
- //========================================================================================
- #endif
- //////////////////////////////////////////////////////////////////////////////
- // Instantiate statics.
- //////////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
- // Con/Destruction.
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
- // Functions.
- ///////////////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////////////
- //
- // Whatever this ends up doing, it will suck and eventually be replaced
- // so that's the comment or something.
- //
- ///////////////////////////////////////////////////////////////////////////
- static short Alpha( // Returns 0 on success.
- RImage* pimSrc, // Source to blit through pimMask.
- RImage* pimMask, // Mask.
- RImage* pimDst, // Destination for masked blit.
- short sSrcX, // X coordinate in source.
- short sSrcY, // Y coordinate in source.
- short sDstX, // X coordinate in dest.
- short sDstY, // Y coordinate in dest.
- short sW, // Width to blt.
- short sH) // Height to blt.
- {
- short sRes = 0; // Assume success.
- short sMaskX = 0;
- short sMaskY = 0;
- // X/W Clip.
- if (sSrcX < 0)
- {
- sW += sSrcX;
- sDstX -= sSrcX;
- sMaskX -= sSrcX;
- sSrcX = 0;
- }
- if (sDstX < 0)
- {
- sW += sDstX;
- sSrcX -= sDstX;
- sMaskX -= sDstX;
- sDstX = 0;
- }
- if (sSrcX + sW > pimSrc->m_sWidth)
- {
- sW = pimSrc->m_sWidth - sSrcX;
- }
- if (sDstX + sW > pimDst->m_sWidth)
- {
- sW = pimDst->m_sWidth - sDstX;
- }
- if (sMaskX + sW > pimMask->m_sWidth)
- {
- sW = pimMask->m_sWidth;
- }
- // Y/H Clip.
- if (sSrcY < 0)
- {
- sH += sSrcY;
- sDstY -= sSrcY;
- sMaskY -= sSrcY;
- sSrcY = 0;
- }
- if (sDstY < 0)
- {
- sH += sDstY;
- sSrcY -= sDstY;
- sMaskY -= sDstY;
- sDstY = 0;
- }
- if (sSrcY + sH > pimSrc->m_sHeight)
- {
- sH = pimSrc->m_sHeight - sSrcY;
- }
- if (sDstY + sH > pimDst->m_sHeight)
- {
- sH = pimDst->m_sHeight - sDstY;
- }
- if (sMaskY + sH > pimMask->m_sHeight)
- {
- sH = pimMask->m_sHeight;
- }
- // If there's anything left . . .
- if (sW > 0 && sH > 0)
- {
- U8* pu8SrcRow = pimSrc->m_pData + sSrcX + sSrcY * pimSrc->m_lPitch;
- U8* pu8SrcBlt;
- U8* pu8MaskRow = pimMask->m_pData + sMaskX + sMaskY * pimMask->m_lPitch;
- U8* pu8MaskBlt;
- U8* pu8DstRow = pimDst->m_pData + sDstX + sDstY * pimDst->m_lPitch;
- U8* pu8DstBlt;
-
- short sWidth;
- while (sH--)
- {
- pu8SrcBlt = pu8SrcRow;
- pu8MaskBlt = pu8MaskRow;
- pu8DstBlt = pu8DstRow;
- sWidth = sW;
- while (sWidth--)
- {
- if (*pu8MaskBlt++ != 0)
- {
- *pu8DstBlt = *pu8SrcBlt;
- }
- pu8DstBlt++;
- pu8SrcBlt++;
- }
- pu8SrcRow += pimSrc->m_lPitch;
- pu8MaskRow += pimMask->m_lPitch;
- pu8DstRow += pimDst->m_lPitch;
- }
- }
- return sRes;
- }
- ///////////////////////////////////////////////////////////////////////////
- //
- // BLiTs using loaded m_imMask (8 bpp only) as mask.
- // 0 in mask indicates opaque. Other values are punch through.
- //
- ///////////////////////////////////////////////////////////////////////////
- short CAlpha::Blit( // Returns 0 on success.
- RImage* pimSrc, // Source image.
- RImage* pimDst, // Destination image.
- short sSrcX, // Source coordinate in pimSrc to start effect. Can
- // be negative.
- short sSrcY, // Source coordinate in pimSrc to start effect. Can
- // be negative.
- short sDstX, // Destination coordinate in pimDst for pimSrc(0,0).
- short sDstY, // Destination coordinate in pimDst for pimSrc(0,0).
- RRect* prc) // Rectangle to clip Dst to.
- {
- short sRes = 0; // Assume success.
- // If there is any data . . .
- if (m_imMask.m_pData != NULL || m_imMask.m_pSpecial != NULL)
- {
- RImage imDecompress;
- // Allocate image.
- if (imDecompress.CreateImage(
- pimSrc->m_sWidth,
- pimSrc->m_sHeight,
- RImage::BMP8,
- 0, // Use default pitch.
- pimSrc->m_sDepth) == 0)
- {
- // Decompress sprite.
- rspBlit(pimSrc, &imDecompress, 0, 0);
-
- // Blit transparency into decompression buffer.
- rspBlitT(TRANS_INDEX,
- &m_imMask,
- &imDecompress,
- 0, 0,
- sSrcX, sSrcY,
- m_imMask.m_sWidth, m_imMask.m_sHeight,
- NULL,
- NULL);
- // Blit to screen.
- rspBlitT(
- 0,
- &imDecompress,
- pimDst,
- 0, 0,
- sDstX, sDstY,
- imDecompress.m_sWidth, imDecompress.m_sHeight,
- prc,
- NULL);
- }
- else
- {
- TRACE("Blit(): Unable to allocate image to decompress pimSrc.\n");
- sRes = -2;
- }
- }
- else
- {
- TRACE("Blit(): No mask! Use regular blt.\n");
- sRes = -1;
- }
- return sRes;
- }
- ///////////////////////////////////////////////////////////////////////////
- //
- // Loads the specified file into m_imMask using RImage::Load() and calls
- // Convert(FSPR1) to prepare the data.
- //
- ///////////////////////////////////////////////////////////////////////////
- short CAlpha::Load( // Returns 0 on success.
- char* pszFileName) // Filename to load.
- {
- short sRes = 0; // Assume success.
- if (m_imMask.Load(pszFileName) == 0)
- {
- #if 0
- rspSetConvertToFSPR1(128, 0);
- if (m_imMask.Convert(FSPR1) == FSPR1)
- {
- // Success.
- }
- else
- {
- TRACE("Load(): RImage::Convert(FSPR1) failed.\n");
- sRes = -2;
- }
- #endif
- m_sShadowW = m_imMask.m_sWidth;
- m_sShadowH = 5;
- m_sShadowX = 0;
- m_sShadowY = m_imMask.m_sHeight - m_sShadowH;
- }
- else
- {
- TRACE("Load(): RImage::Load() failed.\n");
- sRes = -1;
- }
- return sRes;
- }
- //////////////////////////////////////////////////////////////////////////////
- // EOF
- //////////////////////////////////////////////////////////////////////////////
|