📄 bbc888.c
字号:
/*===========================================================================
2D Graphics Library
ALL RIGHTS RESERVED, COPYRIGHT (C) FUJITSU LIMITED 1993-2002
LICENSED MATERIAL - PROGRAM PROPERTY OF FUJITSU LIMITED
===========================================================================*/
#include "gl.h"#include "defhook.h"#define BitLen 24#define PTR(b,o) (Acc *)( (char *)(b)+(o) )int_GL_bbcopyRGB888(GL_WP *gp){ long soffs,doffs ; Acc dmask_head, dmask_tail ; int sbitp,dbitp,lines,words ; int slbytes, dlbytes ; slbytes = gp->bitblt.slbytes ; dlbytes = gp->bitblt.dlbytes ; if(gp->bitblt.ty<0){ slbytes = -slbytes ; dlbytes = -dlbytes ; } if(gp->bitblt.tx<0){ Acc *basep = gp->hwork.VRAMadr[gp->bitblt.spage][0] ; soffs = gp->bitblt.soffs ; sbitp = gp->bitblt.sbitp + BitLen -1 ; doffs = gp->bitblt.doffs ; dbitp = gp->bitblt.dbitp + BitLen -1 ; lines = Abs(gp->bitblt.ty) ; AdjAccOffs(soffs,sbitp) ; AdjAccOffs(doffs,dbitp) ; dmask_head = (Acc)-1 ; if(dbitp<31) dmask_head = ~(dmask_head>>(dbitp+1)) ; words = (-gp->bitblt.tx*BitLen) + (DBits-(dbitp+1)) ; dmask_tail = ~((Acc)-1L>>((-words)&DMask)) ; words >>= DShift ; if(words==0){ dmask_head &= ~dmask_tail ; dmask_tail = 0 ; } else words-- ; while(lines--){ register Acc *dst ; int n ; dst = _AddAdrHigh(gp->hwork.VRAMadr[gp->hwork.page][0],doffs) ; n = dbitp-sbitp ; if(n){ register long src ; register long count ; register Acc d, o ; int un ; src = soffs ; d = *PTR(basep,src) ; src -= AccLen ; o = 0 ; if(n<0){ un = -n ; *dst = *dst & ~dmask_head | (d<<un) & dmask_head ; n += DBits ; } else { un = DBits - n ; if(src>=0){ o = *PTR(basep,src) ; src -= AccLen ; } *dst = *dst & ~dmask_head | ((d>>n)|(o<<un)) & dmask_head ; d = o ; } dst-- ; count = words ; while(count--){ if(src>=0){ o = *PTR(basep,src) ; src -= AccLen ; } *dst = (d>>n)|(o<<un) ; dst-- ; d = o ; o = 0 ; } if(dmask_tail){ if(src>=0) o = *PTR(basep,src) ; *dst = *dst & dmask_tail | ((d>>n)|(o<<un)) &~dmask_tail ; } soffs += slbytes ; doffs += dlbytes ; } else { register Acc *src ; register long count ; src = PTR(basep, soffs) ; *dst = *dst & ~dmask_head | *src & dmask_head ; src-- ; dst-- ; count = words ; while(count--) *dst-- = *src-- ; if(dmask_tail){ *dst = *dst & dmask_tail | *src &~dmask_tail ; } soffs += slbytes ; doffs += dlbytes ; } } } else { soffs = gp->bitblt.soffs ; sbitp = gp->bitblt.sbitp ; doffs = gp->bitblt.doffs ; dbitp = gp->bitblt.dbitp ; lines = Abs(gp->bitblt.ty) ; AdjAccOffs(soffs, sbitp) ; AdjAccOffs(doffs, dbitp) ; dmask_head = (Acc)-1L>>dbitp ; words = (gp->bitblt.tx*BitLen) + dbitp ; dmask_tail = ~((Acc)-1L>>(words&DMask)) ; words >>= DShift ; if(words==0){ dmask_head &= dmask_tail ; dmask_tail = 0 ; } else words-- ; while(lines--){ register Acc *src ; register Acc *dst ; register long count ; int n ; src = _AddAdr(gp->hwork.VRAMadr[gp->bitblt.spage][0], soffs) ; dst = _AddAdr(gp->hwork.VRAMadr[gp->hwork.page ][0], doffs) ; n = sbitp-dbitp ; if(n){ register Acc d, o ; register int un ; d = *src++ ; if(n<0){ un = -n ; *dst = *dst & ~dmask_head | (d>>un) & dmask_head ; n += DBits ; } else { un = DBits - n ; o = *src++ ; *dst = *dst & ~dmask_head | ((d<<n)|(o>>un)) & dmask_head ; d = o ; } dst++ ; count = words ; while(count--){ o = *src++ ; *dst++ = (d<<n)|(o>>un) ; d = o ; } if(dmask_tail){ o = *src ; *dst = *dst & ~dmask_tail| ((d<<n)|(o>>un)) & dmask_tail ; } soffs += slbytes ; doffs += dlbytes ; } else { *dst = *dst & ~dmask_head | *src & dmask_head ; src++ ; dst++ ; count = words ; while(count--) *dst++ = *src++ ; if(dmask_tail){ *dst = *dst & ~dmask_tail | *src & dmask_tail ; } soffs += slbytes ; doffs += dlbytes ; } } } return GL_Ok ;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -