/* SCRNTRNS.h Copyright (C) 2012 Paul C. Pratt You can redistribute this file and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. You should have received a copy of the license along with this file; see the file COPYING. This file 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 license for more details. */ /* SCReeN TRaNSlater */ /* required arguments for this template */ #ifndef ScrnTrns_DoTrans /* procedure to be created by this template */ #error "ScrnTrns_DoTrans not defined" #endif #ifndef ScrnTrns_Src #error "ScrnTrns_Src not defined" #endif #ifndef ScrnTrns_Dst #error "ScrnTrns_Dst not defined" #endif #ifndef ScrnTrns_SrcDepth #error "ScrnTrns_SrcDepth not defined" #endif #ifndef ScrnTrns_DstDepth #error "ScrnTrns_DstDepth not defined" #endif /* optional argument for this template */ #ifndef ScrnTrns_Scale #define ScrnTrns_Scale 1 #endif #ifndef ScrnTrns_DstZLo #define ScrnTrns_DstZLo 0 #endif /* check of parameters */ #if (ScrnTrns_SrcDepth < 4) #error "bad ScrnTrns_SrcDepth" #endif #if (ScrnTrns_DstDepth < 4) #error "bad ScrnTrns_Dst" #endif /* now define the procedure */ LOCALPROC ScrnTrns_DoTrans(si4b top, si4b left, si4b bottom, si4b right) { int i; int j; ui5b t0; ui5b t1; ui4r jn = right - left; ui4r SrcSkip = vMacScreenByteWidth - (jn << (ScrnTrns_SrcDepth - 3)); ui3b *pSrc = ((ui3b *)ScrnTrns_Src) + (left << (ScrnTrns_SrcDepth - 3)) + vMacScreenByteWidth * (ui5r)top; ui5b *pDst = ((ui5b *)ScrnTrns_Dst) + left * ScrnTrns_Scale + (ui5r)vMacScreenWidth * ScrnTrns_Scale * ScrnTrns_Scale * top; ui4r DstSkip = (vMacScreenWidth - jn) * ScrnTrns_Scale; #if ScrnTrns_Scale > 1 int k; ui5b *p3; ui5b *p4; #endif for (i = bottom - top; --i >= 0; ) { #if ScrnTrns_Scale > 1 p3 = pDst; #endif for (j = jn; --j >= 0; ) { #if 4 == ScrnTrns_SrcDepth t0 = do_get_mem_word(pSrc); pSrc += 2; t1 = #if ScrnTrns_DstZLo ((t0 & 0x7C00) << 17) | ((t0 & 0x7000) << 12) | ((t0 & 0x03E0) << 14) | ((t0 & 0x0380) << 9) | ((t0 & 0x001F) << 11) | ((t0 & 0x001C) << 6); #else ((t0 & 0x7C00) << 9) | ((t0 & 0x7000) << 4) | ((t0 & 0x03E0) << 6) | ((t0 & 0x0380) << 1) | ((t0 & 0x001F) << 3) | ((t0 & 0x001C) >> 2); #endif #if 0 ((t0 & 0x7C00) << 1) | ((t0 & 0x7000) >> 4) | ((t0 & 0x03E0) << 14) | ((t0 & 0x0380) << 9) | ((t0 & 0x001F) << 27) | ((t0 & 0x001C) << 22); #endif #elif 5 == ScrnTrns_SrcDepth t0 = do_get_mem_long(pSrc); pSrc += 4; #if ScrnTrns_DstZLo t1 = t0 << 8; #else t1 = t0; #endif #endif #if ScrnTrns_Scale > 1 for (k = ScrnTrns_Scale; --k >= 0; ) #endif { *pDst++ = t1; } } pSrc += SrcSkip; pDst += DstSkip; #if ScrnTrns_Scale > 1 #if ScrnTrns_Scale > 2 for (k = ScrnTrns_Scale - 1; --k >= 0; ) #endif { p4 = p3; for (j = ScrnTrns_Scale * jn; --j >= 0; ) { *pDst++ = *p4++; } pDst += DstSkip; } #endif /* ScrnTrns_Scale > 1 */ } } /* undefine template locals and parameters */ #undef ScrnTrns_DoTrans #undef ScrnTrns_Src #undef ScrnTrns_Dst #undef ScrnTrns_SrcDepth #undef ScrnTrns_DstDepth #undef ScrnTrns_Scale #undef ScrnTrns_DstZLo