stoneage8.5/石器时代8.5客户端最新源代码/石器源码/system/sprdisp.cpp
2020-06-23 15:53:23 +08:00

2933 lines
94 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************/
/* sprdisp.c */
/************************/
#include "../systeminc/version.h"
#include "../systeminc/system.h"
#include "../systeminc/loadrealbin.h"
#include "../systeminc/loadsprbin.h"
#include "../systeminc/anim_tbl.h"
#include "../systeminc/map.h"
#include "../systeminc/battleMap.h"
#define STOCK_DISP_BUFFER_NO_BMP ( 1 << 31 ) // ???????
#define STOCK_DISP_BUFFER_LINE ( 1 << 30 ) // ???
#define STOCK_DISP_BUFFER_BOX ( 1 << 29 ) // ????
#define STOCK_DISP_BUFFER_BOX_FILL ( 1 << 28 ) // ????????
#define STOCK_DISP_BUFFER_CIRCLE ( 1 << 27 ) // ?
extern int displayBpp;
// ?????
DISP_BUFFER DispBuffer;
#ifndef __CARYTEST
// Realbin ???????????????
char *pRealBinBits;
// ?? Realbin ????????????
int RealBinWidth, RealBinHeight;
#endif
#ifdef _READ16BITBMP
BYTE *pRealBinAlpha;
#endif
// ????????????
int SurfaceBusyFlag = 0;
// ?????????
extern ACTION* pActMenuWnd2;
// ??????
extern unsigned int MenuToggleFlag;
// Robin 04/14 for Trade
extern ACTION* pActMenuWnd4;
// Bankman
extern ACTION* pActMenuWnd5;
extern unsigned short highColorPalette[256];
#ifdef _READ16BITBMP
extern AddressBin_s adrntruebuff[MAX_GRAPHICS_24];
extern BOOL g_bUseAlpha;
#endif
// ??????
int SortComp( DISP_SORT *pDisp1, DISP_SORT *pDisp2 );
typedef int CMPFUNC( const void *, const void * );
// ?????????????????
inline void GetBoxDispBuffer( DISP_INFO *pDispInfo, int bmpNo );
#ifdef _SURFACE_ANIM
void DrawAni(void);
int iProcessAniNum;
#endif
void DrawGrayA(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType);
#ifdef _READ16BITBMP
void DrawAlpha(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,int Alpha,bool bLastOne);
extern int displayBpp;
void DrawStaturated(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne);
#ifdef _SFUMATO
void DrawGray(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType, int sfumato);
#else
void DrawGray(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType);
#endif
void DrawAlphaChannel(SURFACE_INFO *surface_info,BYTE *AlphaData,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne);
#ifdef _SFUMATO
void DrawSfumato(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType, int sfumato);
#endif
#endif
void DrawStaturated(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne);
void DrawGray(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType);
// ??????? ///////////////////////////////////////////////////////////
void SortDispBuffer( void )
{
//???????
qsort( DispBuffer.DispSort, // ??????
DispBuffer.DispCnt, // ?????
sizeof( DISP_SORT ), // ?????
( CMPFUNC * )SortComp // ?????????
);
}
DISP_SORT *pSortTileTail;
#ifdef __SKYISLAND
// ????? /////////////////////////////////////////////////////////////////
BOOL PutTileBmp( void )
{
DISP_INFO *pDispInfo;
int i;
int bmpNo;
RECT src;
int sx, sy;
BOOL retainbackbuffer = FALSE;
pSortTileTail = DispBuffer.DispSort;
SURFACE_INFO *lpSurfaceInfo;
#ifdef _READ16BITBMP
SURFACE_INFO *lpSurfaceInfoSys;
#endif
if( (ProcNo==PROC_GAME/* && SubProcNo==3*/) || ProcNo==PROC_BATTLE){
#ifdef _SURFACE_ANIM
iProcessAniNum = 0;
#endif
if( fastDrawTile && (fastDrawTileFlag==0 || amountXFastDraw || amountYFastDraw) ){
retainbackbuffer = TRUE;
// ?????????????????????????????
if( ProcNo != PROC_BATTLE){
src.top = 0;
src.left = 0;
src.right = DEF_APPSIZEX;
src.bottom = DEF_APPSIZEY;
sx = 0;
sy = 0;
//???????????????
if( ResoMode == 1 ){
//src.right /= 2;
//src.bottom /= 2;
src.right >>= 1;
src.bottom >>= 1;
}
if( amountXFastDraw > 0 ){
src.right -= amountXFastDraw;
sx += amountXFastDraw;
}else if( amountXFastDraw < 0 ){
src.left -= amountXFastDraw;
}
if( amountYFastDraw > 0 ){
src.bottom -= amountYFastDraw;
sy += amountYFastDraw;
}else if( amountYFastDraw < 0 ){
src.top -= amountYFastDraw;
}
if( lpDraw->lpBACKBUFFER->BltFast( sx, sy, lpBattleSurface, &src, DDBLTFAST_WAIT ) == DDERR_SURFACEBUSY )
SurfaceBusyFlag = TRUE;
#ifdef _READ16BITBMP
if(g_bUseAlpha){
if(lpDraw->lpBACKBUFFERSYS->BltFast(sx,sy,lpBattleSurfaceSys,&src,DDBLTFAST_WAIT) == DDERR_SURFACEBUSY)
SurfaceBusyFlag = TRUE;
}
#endif
}
// ???????????
for( i = 0; i<DispBuffer.DispCnt ; i++, pSortTileTail++ ){
#ifdef _SURFACE_ANIM
if(pSortTileTail->dispPrio == 0) continue;
#endif
// 因为有排序过,所以如果目前的显示顺序比地表大的话,表示地表已经处理完了
if( pSortTileTail->dispPrio > DISP_PRIO_TILE){
DispBuffer.DispCnt -= i;
#ifdef _SURFACE_ANIM
iProcessAniNum = i;
#endif
break;
}
// ????????????????
// 取得第一个要处理的图的 DispInfo 资料
pDispInfo = DispBuffer.DispInfo + pSortTileTail->no;
bmpNo = pDispInfo->bmpNo; // ????
// ?????
// ?????????
if( pDispInfo->pAct != NULL ){
if( pDispInfo->pAct->atr & ACT_ATR_HIDE2 ) continue;
}
// ?????????????????????????
// ?????????
if( LoadBmp( bmpNo ) == FALSE ) continue;
#ifdef _READ16BITBMP
if(g_bUseAlpha){
for(lpSurfaceInfo = SpriteInfo[ bmpNo ].lpSurfaceInfo,lpSurfaceInfoSys = SpriteInfo[bmpNo].lpSurfaceInfoSys
;lpSurfaceInfo != NULL,lpSurfaceInfoSys != NULL
;lpSurfaceInfo = lpSurfaceInfo->pNext,lpSurfaceInfoSys = lpSurfaceInfoSys->pNext){
if(ResoMode == 1){
if(DrawSurfaceFast((pDispInfo->x >> 1) + lpSurfaceInfo->offsetX,
(pDispInfo->y >> 1) + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface,lpSurfaceInfoSys->lpSurface) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
else{
if(DrawSurfaceFast(pDispInfo->x + lpSurfaceInfo->offsetX,
pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface,lpSurfaceInfoSys->lpSurface) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
lpSurfaceInfo->date = SurfaceDate;
}
}
else
#endif
{
for(lpSurfaceInfo = SpriteInfo[ bmpNo ].lpSurfaceInfo;lpSurfaceInfo != NULL;lpSurfaceInfo = lpSurfaceInfo->pNext ){
if(ResoMode == 1){
if(DrawSurfaceFast((pDispInfo->x >> 1) + lpSurfaceInfo->offsetX,
(pDispInfo->y >> 1) + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface ) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
else{
#ifdef _CACHE_SURFACE_
DrawSurfaceFromPalette(lpSurfaceInfo);
#endif
if(DrawSurfaceFast(pDispInfo->x + lpSurfaceInfo->offsetX,
pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface ) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
lpSurfaceInfo->date = SurfaceDate;
}
}
}
}
}
if(retainbackbuffer){
if( lpBattleSurface->BltFast( 0, 0, lpDraw->lpBACKBUFFER, NULL, DDBLTFAST_WAIT ) == DDERR_SURFACEBUSY ) SurfaceBusyFlag = TRUE;
#ifdef _READ16BITBMP
if(g_bUseAlpha) if(lpBattleSurfaceSys->BltFast(0,0,lpDraw->lpBACKBUFFERSYS,NULL,DDBLTFAST_WAIT) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
#endif
}
if( ProcNo != PROC_BATTLE){
#ifdef _LOST_FOREST_FOG
if(nowFloor!=7450 && nowFloor!=7451
#ifdef _NEW_CLOUD
//&& nowFloor != 61000 && nowFloor != 61100
#endif
){
#endif
extern DWORD sky_island_no;
if( sky_island_no){
#ifdef _NEW_CLOUD
extern void SkyIslandDraw(int floor);
SkyIslandDraw(nowFloor);
#else
extern void SkyIslandDraw();
SkyIslandDraw();
#endif
return FALSE;
}
#ifdef _LOST_FOREST_FOG
}
#endif
}
return retainbackbuffer;
}
#endif
unsigned char AlphaBytes[64*48+1];
unsigned char AlphaColorBytes[64*48*4+1];
// ????? /////////////////////////////////////////////////////////////////
void PutBmp( void )
{
#ifdef __SKYISLAND
// ???????????
switch( BackBufferDrawType ){//背景类型
case DRAW_BACK_NORMAL://无背景
ClearBackSurface(); //清空背景显示
void SkyIslandProc();
SkyIslandProc();
if( !PutTileBmp() ){
if( fastDrawTile && lpDraw->lpBACKBUFFER->BltFast( 0, 0, lpBattleSurface, NULL, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ) == DDERR_SURFACEBUSY ){
SurfaceBusyFlag = TRUE;
return;
}
}
#ifdef _SURFACE_ANIM
DrawAni();
#endif
break;
case DRAW_BACK_BATTLE: //战斗背景
amountXFastDraw = amountYFastDraw = 0;
PutTileBmp();
DrawBattleMap();
break;
default:
if( !PutTileBmp() ){
if( fastDrawTile && lpDraw->lpBACKBUFFER->BltFast( 0, 0, lpBattleSurface, NULL, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ) == DDERR_SURFACEBUSY ){
SurfaceBusyFlag = TRUE;
return;
}
}
break;
}
DISP_SORT *pDispSort = pSortTileTail;
#else
DISP_SORT *pDispSort = DispBuffer.DispSort;
#endif
DISP_INFO *pDispInfo;
int i;
int bmpNo;
UCHAR putTextFlag = 0;
unsigned char drawMapEffectFlag = 0;
unsigned char drawFastTileFlag = 0;
unsigned char drawFastTileFlag2 = 0;
#ifndef __CARYTEST
SURFACE_INFO *lpSurfaceInfo;
#ifdef _READ16BITBMP
SURFACE_INFO *lpSurfaceInfoSys;
#endif
#else
DDSURFACEDESC ddsd; // ??????
LPWORD surface;
int pitch;
BOOL locked = FALSE;
int x, y;
short width, height;
ZeroMemory( &ddsd, sizeof( DDSURFACEDESC ) );
ddsd.dwSize = sizeof( DDSURFACEDESC );
if( lpDraw->lpBACKBUFFER->Lock( NULL, &ddsd, DDLOCK_WAIT, NULL ) == DD_OK ){
surface = (LPWORD)ddsd.lpSurface;
pitch = ddsd.lPitch;
locked = TRUE;
}
#endif
// ???????????
for( i = 0; i < DispBuffer.DispCnt ; i++, pDispSort++ ){
pDispInfo = &DispBuffer.DispInfo[pDispSort->no];
bmpNo = pDispInfo->bmpNo;//秀图ID
if( putTextFlag == 0 ){
if( pDispSort->dispPrio >= DISP_PRIO_MENU ){
PutText( FONT_PRIO_BACK );
#ifdef _CHANNEL_MODIFY
PutText(FONT_PRIO_CHATBUFFER);
#endif
putTextFlag = 1;
}
}
if( putTextFlag == 1 ){
if( pDispSort->dispPrio >= DISP_PRIO_YES_NO_WND ){
PutText( FONT_PRIO_FRONT );
putTextFlag = 2;
}
}
#ifdef _TRADETALKWND // Syu ADD 交易新增对话框架
//增加一层新的文字显示顺序
if( putTextFlag == 2 ){
if( pDispSort->dispPrio >= DISP_PRIO_BOX3 ){
PutText( FONT_PRIO_AFRONT );
putTextFlag = 2;
}
}
#endif
if( pDispSort->dispPrio > DISP_PRIO_MENU ){
if( MenuToggleFlag & JOY_CTRL_M && pActMenuWnd2 != NULL ){
if( pActMenuWnd2->hp > 0 ){
#ifdef _2005_ValentineDay
// 不让玩家看到小地图
if (nowFloor != 17006)
#endif
drawAutoMap( pActMenuWnd2->x, pActMenuWnd2->y );
}
}
}
// ?????????
if( pDispSort->dispPrio >= DISP_PRIO_RESERVE ){
#ifdef __SKYISLAND
#ifdef _NEW_CLOUD
extern void SkyIslandDraw2(int fl);
SkyIslandDraw2(nowFloor);
#else
extern void SkyIslandDraw2();
SkyIslandDraw2();
#endif
#endif
drawMapEffect();
drawMapEffectFlag = 1;
}
#ifndef __SKYISLAND
// ??????
if( fastDrawTile ){
RECT src;
int sx, sy;
if( pDispSort->dispPrio >= DISP_PRIO_TILE && drawFastTileFlag2 == 0 ){
if( ProcNo == PROC_GAME && SubProcNo == 3 && fastDrawTileFlag ){
// ?????????????????????????????
src.top = 0;
src.left = 0;
src.right = DEF_APPSIZEX;
src.bottom = DEF_APPSIZEY;
sx = 0;
sy = 0;
//???????????????
if( ResoMode == 1 ){
src.right >>= 1;
src.bottom >>= 1;
}
if( amountXFastDraw > 0 ){
src.right -= amountXFastDraw;
sx += amountXFastDraw;
}
else if( amountXFastDraw < 0 ) src.left -= amountXFastDraw;
if( amountYFastDraw > 0 ){
src.bottom -= amountYFastDraw;
sy += amountYFastDraw;
}
else if( amountYFastDraw < 0 ) src.top -= amountYFastDraw;
if( lpDraw->lpBACKBUFFER->BltFast( sx, sy, lpBattleSurface, &src, DDBLTFAST_WAIT ) == DDERR_SURFACEBUSY )
SurfaceBusyFlag = TRUE;
drawFastTileFlag2 = 1;
}
}
if( pDispSort->dispPrio > DISP_PRIO_TILE && drawFastTileFlag == 0 ){
if( ProcNo == PROC_GAME && SubProcNo == 3 && fastDrawTileFlag ){
// ????????????????????????????
if( lpBattleSurface->BltFast( 0, 0, lpDraw->lpBACKBUFFER, NULL, DDBLTFAST_WAIT ) == DDERR_SURFACEBUSY )
SurfaceBusyFlag = TRUE;
drawFastTileFlag = 1;
}
}
}
#endif
// ???????
if( bmpNo & STOCK_DISP_BUFFER_NO_BMP ){
if( bmpNo & ( STOCK_DISP_BUFFER_BOX | STOCK_DISP_BUFFER_BOX_FILL | STOCK_DISP_BUFFER_LINE ) ){
GetBoxDispBuffer( pDispInfo, bmpNo );
}
continue;
}
if( pDispInfo->pAct != NULL ){
if( pDispInfo->pAct->atr & ACT_ATR_HIDE2 ) continue;
}
if( LoadBmp( bmpNo ) == FALSE ) continue;
{
for(lpSurfaceInfo = SpriteInfo[ bmpNo ].lpSurfaceInfo;lpSurfaceInfo != NULL;lpSurfaceInfo = lpSurfaceInfo->pNext){
#ifdef _CACHE_SURFACE_
DrawSurfaceFromPalette(lpSurfaceInfo);
#endif
if(pDispInfo->DrawEffect == 2)//饱和处理
DrawStaturated(lpSurfaceInfo->lpSurface,
pDispInfo->x + lpSurfaceInfo->offsetX,pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->offsetX,lpSurfaceInfo->offsetY,
SpriteInfo[bmpNo].width,SpriteInfo[bmpNo].height,(lpSurfaceInfo->pNext == NULL ? true:false));
else if(pDispInfo->DrawEffect == 3 || pDispInfo->DrawEffect == 4)//石化和中毒处理
DrawGray(lpSurfaceInfo->lpSurface,
pDispInfo->x + lpSurfaceInfo->offsetX,pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->offsetX,lpSurfaceInfo->offsetY,
SpriteInfo[bmpNo].width,SpriteInfo[bmpNo].height,(lpSurfaceInfo->pNext == NULL ? true:false),pDispInfo->DrawEffect);
#ifdef _PETCOLOR_
else if(pDispInfo->DrawEffect==5){
DrawGray(lpSurfaceInfo->lpSurface,
pDispInfo->x + lpSurfaceInfo->offsetX,pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->offsetX,lpSurfaceInfo->offsetY,
SpriteInfo[bmpNo].width,SpriteInfo[bmpNo].height,(lpSurfaceInfo->pNext == NULL ? true:false),3);
}
#endif
#ifdef _NEW_COLOR_
else{
extern int NewColor16Flg;
if(SpriteInfo[ bmpNo ].AlphaFlg){
DDSURFACEDESC ddsd;
DDSURFACEDESC ddsd2;
short bx, by;
short x0, y0;
long w, h;
int Dstpitch, Srcpitch;
RECT rect = { 0, 0, SurfaceSizeX, SurfaceSizeY };
bx = x0 = pDispInfo->x + lpSurfaceInfo->offsetX;
by = y0 = pDispInfo->y + lpSurfaceInfo->offsetY;
w = rect.right - rect.left;
h = rect.bottom - rect.top;
if (bx >= lpDraw->xSize || bx + w <= 0 || by >= lpDraw->ySize || by + h <= 0) continue;
if (bx < 0){
rect.left -= bx;
x0 = 0;
}
if (bx + w > lpDraw->xSize) rect.right -= bx + w - lpDraw->xSize;
if (by < 0){
rect.top -= by;
y0 = 0;
}
if (by + h > lpDraw->ySize) rect.bottom -= by + h - lpDraw->ySize;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC));
ddsd.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC));
ddsd2.dwSize = sizeof(DDSURFACEDESC);
if (lpDraw->lpBACKBUFFER->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) continue;
if (lpSurfaceInfo->lpSurface->Lock(NULL, &ddsd2, DDLOCK_WAIT, NULL) != DD_OK) continue;
unsigned char *Dst, *Src;
Dst = (unsigned char *)ddsd.lpSurface;
Dstpitch = ddsd.lPitch;
Src = (unsigned char *)ddsd2.lpSurface;
Srcpitch = ddsd2.lPitch;
if(displayBpp==16){
ablend_565(lpSurfaceInfo->lpAlphaData, 64, Src, rect.left, rect.top, Srcpitch, Dst, x0 , y0 , rect.right-rect.left, rect.bottom-rect.top, Dstpitch);
}else{
DrawAlpha32((unsigned long *)Dst, x0, y0, Dstpitch, (unsigned long *)Src, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, Srcpitch);
}
if (lpSurfaceInfo->lpSurface->Unlock(NULL) != DD_OK) continue;
if (lpDraw->lpBACKBUFFER->Unlock(NULL) != DD_OK) continue;
}else
#endif
{
if( DrawSurfaceFast( pDispInfo->x + lpSurfaceInfo->offsetX,
pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface ) == DDERR_SURFACEBUSY ) SurfaceBusyFlag = TRUE;
}
lpSurfaceInfo->date = SurfaceDate;
}
}
}
}
/*
#ifdef _LOST_FOREST_FOG
if(nowFloor==7450||nowFloor==7451
#ifdef _NEW_CLOUD
//|| nowFloor==61000 || nowFloor==61100
#endif
){
extern DWORD sky_island_no;
if( sky_island_no){
#ifdef _NEW_CLOUD
extern void SkyIslandDraw(int floor);
SkyIslandDraw(nowFloor);
#else
extern void SkyIslandDraw();
SkyIslandDraw();
#endif
}
}
#endif
*/
#ifdef __SKYISLAND
#ifdef _NEW_CLOUD
extern void SkyIslandDraw2(int fl);
SkyIslandDraw2(nowFloor);
#else
extern void SkyIslandDraw2();
SkyIslandDraw2();
#endif
#endif
if( putTextFlag == 0 ){
// ?????????????????
PutText( FONT_PRIO_BACK );
// ?????
#ifdef _CHANNEL_MODIFY
PutText(FONT_PRIO_CHATBUFFER);
#endif
putTextFlag = 1;
}
// ?????( FRONT )
if( putTextFlag == 1 ){
PutText( FONT_PRIO_FRONT );
}
// ?????????
if( drawMapEffectFlag == 0 ) drawMapEffect();
memset(&DispBuffer,0,sizeof(DispBuffer));
}
//**************************************************************************/
// ?? ??????????????
// ?? UCHAR dispPrio????????
// int x, int y坐标
// int bmpNo图片号
// int chr_no???????
// int pat_no?????
//**************************************************************************/
// 储存所有要播放的Image
int StockDispBuffer( int x, int y, UCHAR dispPrio, int bmpNo, BOOL hitFlag )
{
short dx,dy;
int BmpNo;
DISP_SORT *pDispSort = DispBuffer.DispSort + DispBuffer.DispCnt;
DISP_INFO *pDispInfo = DispBuffer.DispInfo + DispBuffer.DispCnt;
if( DispBuffer.DispCnt >= DISP_BUFFER_SIZE ) return -2;
if( -1 <= bmpNo && bmpNo <= CG_INVISIBLE ) return -2;
if( bmpNo > CG_INVISIBLE ){
realGetNo( bmpNo , (U4 *)&BmpNo );
realGetPos( BmpNo , &dx, &dy);
}else{
dx = 0;
dy = 0;
BmpNo = bmpNo;
}
pDispSort->dispPrio = dispPrio;
pDispSort->no = DispBuffer.DispCnt;
pDispInfo->hitFlag = hitFlag;
if(hitFlag >= 20 && hitFlag < 30){
pDispInfo->DrawEffect = 2;
pDispInfo->hitFlag = hitFlag - 20;
}else if(hitFlag >= 30 && hitFlag < 40){
pDispInfo->DrawEffect = 3;
pDispInfo->hitFlag = hitFlag - 30;
}
else if(hitFlag >= 40 && hitFlag < 50){
pDispInfo->DrawEffect = 4;
pDispInfo->hitFlag = hitFlag - 40;
}
else pDispInfo->DrawEffect = 0;
pDispInfo->x = x + dx;
pDispInfo->y = y + dy;
pDispInfo->bmpNo = BmpNo;
pDispInfo->pAct = NULL;
return DispBuffer.DispCnt++;
}
#ifdef _SFUMATO
int StockDispBuffer2( int x, int y, UCHAR dispPrio, int bmpNo, BOOL hitFlag, int sfumato/* = 0*/)
#else
int StockDispBuffer2( int x, int y, UCHAR dispPrio, int bmpNo, BOOL hitFlag )
#endif
{
short dx,dy;
int BmpNo;
// ???????????????
DISP_SORT *pDispSort = DispBuffer.DispSort + DispBuffer.DispCnt;
DISP_INFO *pDispInfo = DispBuffer.DispInfo + DispBuffer.DispCnt;
// ??????????
if( DispBuffer.DispCnt >= DISP_BUFFER_SIZE ) return -2;
// ??????????????
if( -1 <= bmpNo && bmpNo <= CG_INVISIBLE ) return -2;
// ???
if( bmpNo > CG_INVISIBLE ){
BmpNo = bmpNo;
realGetPos( BmpNo , &dx, &dy);
}else{// ????????????
dx = 0;
dy = 0;
BmpNo = bmpNo;
}
// ??????
pDispSort->dispPrio = dispPrio;
pDispSort->no = DispBuffer.DispCnt;
// ?? ??????? ?
pDispInfo->x = x + dx;
pDispInfo->y = y + dy;
pDispInfo->bmpNo = BmpNo;
pDispInfo->hitFlag = hitFlag;
pDispInfo->pAct = NULL;
#ifdef _READ16BITBMP
if(pDispInfo->bmpNo >= OLD_GRAPHICS_START && pDispInfo->bmpNo < MAX_GRAPHICS){
if(adrntruebuff[pDispInfo->bmpNo - OLD_GRAPHICS_START].staturated == 1) pDispInfo->DrawEffect = 2;
}
#endif
#ifdef _SFUMATO
pDispInfo->sfumato = sfumato;
#endif
return DispBuffer.DispCnt++;
}
// 储存所有要播放的Image依Act的状况来设定
void StockTaskDispBuffer( void )
{
ACTION *pActLoop; /* ???????? */
DISP_SORT *pDispSort = DispBuffer.DispSort + DispBuffer.DispCnt;
DISP_INFO *pDispInfo = DispBuffer.DispInfo + DispBuffer.DispCnt;
/* ?????????? */
//while( pActLoop != pActBtm ){
for(pActLoop = pActTop->pNext ;
pActLoop != pActBtm ;
/* ?????????? */
pActLoop = pActLoop->pNext ){
// ??????????
if( DispBuffer.DispCnt >= DISP_BUFFER_SIZE ) break;
// ??????????????
if( -1 <= pActLoop ->bmpNo && pActLoop ->bmpNo <= CG_INVISIBLE ) continue;
// ????????????
if( pActLoop ->deathFlag == TRUE ) continue;
/* ???? */
if( pActLoop->atr & ACT_ATR_HIDE ) continue;
// ??????
pDispSort->dispPrio = pActLoop->dispPrio;
pDispSort->no = DispBuffer.DispCnt;
// ?? ??????? ?
pDispInfo->x = pActLoop->x + pActLoop->anim_x;
pDispInfo->y = pActLoop->y + pActLoop->anim_y;
pDispInfo->bmpNo = pActLoop->bmpNo;
pDispInfo->pAct = pActLoop;
// ???????
// ???
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL1 ) pDispInfo->hitFlag = 7;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL2 ) pDispInfo->hitFlag = 8;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL3 ) pDispInfo->hitFlag = 9;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL4 ) pDispInfo->hitFlag = 10;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL5 ) pDispInfo->hitFlag = 11;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL6 ) pDispInfo->hitFlag = 12;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL7 ) pDispInfo->hitFlag = 13;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_COL8 ) pDispInfo->hitFlag = 14;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_ALL4 ) pDispInfo->hitFlag = 6;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_ALL3 ) pDispInfo->hitFlag = 5;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_ALL2 ) pDispInfo->hitFlag = 4;
else
if( pActLoop->atr & ACT_ATR_HIT_BOX_ALL1 ) pDispInfo->hitFlag = 3;
else // ????
if( pActLoop->atr & ACT_ATR_HIT_BOX ) pDispInfo->hitFlag = 2;
else // ??
if( pActLoop->atr & ACT_ATR_HIT ) pDispInfo->hitFlag = 1;
else pDispInfo->hitFlag = FALSE;
// 4 石化
if(pActLoop->status == 4) pDispInfo->DrawEffect = 3;
// 1 毒
else if(pActLoop->status == 1) pDispInfo->DrawEffect = 4;
else pDispInfo->DrawEffect = 0;
#ifdef _PETCOLOR_
extern BOOL EncountFlag,DuelFlag,NoHelpFlag;
if(!pDispInfo->DrawEffect)
if(ProcNo==PROC_BATTLE && !EncountFlag && !vsLookFlag&&!eventEnemyFlag&&!DuelFlag&&!NoHelpFlag){
if(pActLoop->actNo == 0){
if (pActLoop->level == 1 && (ATR_PLACE_NO(pActLoop) >= 2 * MAX_BATTLE_ROW_CHARS && ATR_PLACE_NO(pActLoop)< 4 * MAX_BATTLE_ROW_CHARS)){
pDispInfo->DrawEffect=5;
}
}
}
#endif
#ifdef _READ16BITBMP
if(pDispInfo->bmpNo >= OLD_GRAPHICS_START && pDispInfo->bmpNo < MAX_GRAPHICS){
if(adrntruebuff[pDispInfo->bmpNo - OLD_GRAPHICS_START].staturated == 1) pDispInfo->DrawEffect = 2;
}
#endif
// ?????????????
pActLoop->hitDispNo = DispBuffer.DispCnt;
#ifdef _SFUMATO
pDispInfo->sfumato = pActLoop->sfumato;
#endif
// ????????
DispBuffer.DispCnt++;
// ???????
pDispSort++;
pDispInfo++;
}
}
// ??????????????? ///////////////////////////////////////////////////
// ???prio1??prio2???????????
void StockTaskDispBuffer2( int prio1, int prio2 )
{
ACTION *pActLoop; /* ???????? */
DISP_SORT *pDispSort = DispBuffer.DispSort + DispBuffer.DispCnt;
DISP_INFO *pDispInfo = DispBuffer.DispInfo + DispBuffer.DispCnt;
int tmp;
if( prio1 > prio2 )
{
tmp = prio1;
prio1 = prio2;
prio2 = tmp;
}
/* ?????????? */
//while( pActLoop != pActBtm ){
for(pActLoop = pActTop->pNext ;
pActLoop != pActBtm ;
/* ?????????? */
pActLoop = pActLoop->pNext ){
// ??????????
if( DispBuffer.DispCnt >= DISP_BUFFER_SIZE ) break;
// prio1??prio2????????
if( prio1 <= pActLoop->dispPrio && pActLoop->dispPrio <= prio2 )
continue;
// ??????????????
if( -1 <= pActLoop ->bmpNo && pActLoop ->bmpNo <= CG_INVISIBLE ) continue;
// ????????????
if( pActLoop ->deathFlag == TRUE ) continue;
/* ???? */
if( pActLoop->atr & ACT_ATR_HIDE ) continue;
// ??????
pDispSort->dispPrio = pActLoop->dispPrio;
pDispSort->no = DispBuffer.DispCnt;
// ?? ??????? ?
pDispInfo->x = pActLoop->x + pActLoop->anim_x;
pDispInfo->y = pActLoop->y + pActLoop->anim_y;
pDispInfo->bmpNo = pActLoop->bmpNo;
pDispInfo->pAct = pActLoop;
// ???????
if( pActLoop->atr & ACT_ATR_HIT_BOX ) pDispInfo->hitFlag = 2;
else
if( pActLoop->atr & ACT_ATR_HIT ) pDispInfo->hitFlag = 1;
else pDispInfo->hitFlag = FALSE;
// ?????????????
pActLoop->hitDispNo = DispBuffer.DispCnt;
// ????????
DispBuffer.DispCnt++;
// ???????
pDispSort++;
pDispInfo++;
}
}
// ???????????????? ***************************************/
void StockBoxDispBuffer( int x1, int y1, int x2, int y2, UCHAR dispPrio, int color, BOOL fill )
{
int col; // ?
// int ? short ??????
int x = ( x1 << 16 ) | x2; // ????????????????
int y = ( y1 << 16 ) | y2; // ????????????????
// ???????
if( fill == 0 ) col = color | STOCK_DISP_BUFFER_BOX | STOCK_DISP_BUFFER_NO_BMP ;
// ???????
else if( fill == 1 ) col = color | STOCK_DISP_BUFFER_BOX_FILL | STOCK_DISP_BUFFER_NO_BMP ;
// ?????
else if( fill == 2 ) col = color | STOCK_DISP_BUFFER_LINE | STOCK_DISP_BUFFER_NO_BMP ;
// ?????????????
StockDispBuffer( x, y, dispPrio, col, 0 );
}
// ????????????????? *********************************/
inline void GetBoxDispBuffer( DISP_INFO *pDispInfo, int bmpNo )
{
// ??????
RECT rect;
int color; // 
BOOL fill = FALSE; // ???????
int DispInfoX = pDispInfo->x;
int DispInfoY = pDispInfo->y;
// ????
rect.right = ( LONG )( pDispInfo->x & 0xffff );
rect.bottom = ( LONG )( pDispInfo->y & 0xffff );
// ??????????
_asm{
// rect.left ???
mov cl,16 // ??????????
mov eax, [ DispInfoX ]
sar eax, cl // ??????
mov [ rect.left ], eax
// rect.top ???
mov eax, [ DispInfoY ]
sar eax, cl
mov [ rect.top ], eax
}
// ???????
if( bmpNo & STOCK_DISP_BUFFER_BOX ){
color = bmpNo & 0xff; // ??????
DrawBox( &rect, color, 0 ); // ?????
// ???????
}else if( bmpNo & STOCK_DISP_BUFFER_BOX_FILL ){
color = color = bmpNo & 0xff; // 
DrawBox( &rect, color, 1 ); // ?????
}else if( bmpNo & STOCK_DISP_BUFFER_LINE ){
color = color = bmpNo & 0xff; // 
DrawBox( &rect, color, 2 ); // ????
}
}
// ?????? //////////////////////////////////////////////////////////////
int SortComp( DISP_SORT *pDisp1, DISP_SORT *pDisp2 )
{
// pDisp1 ??????????
if( pDisp1->dispPrio > pDisp2->dispPrio ){
return 1;
}
// pDisp2 ????????????
if( pDisp1->dispPrio < pDisp2->dispPrio ){
return -1;
}
// ?????????
// pDisp1 ??????????????????
if( pDisp1->no > pDisp2->no ){
return -1;
}
// ????????????????
return 1;
}
#ifdef _SURFACE_ANIM
// 画动态地表(优先权为0的动态地表)
void DrawAni()
{
DISP_INFO *pDispInfo;
int bmpNo;
SURFACE_INFO *lpSurfaceInfo;
#ifdef _READ16BITBMP
SURFACE_INFO *lpSurfaceInfoSys;
#endif
if(ProcNo != PROC_BATTLE){
pSortTileTail = DispBuffer.DispSort;
DispBuffer.DispCnt += iProcessAniNum;
for(int i = 0; i<DispBuffer.DispCnt; i++, pSortTileTail++ ){
if( pSortTileTail->dispPrio == DISP_PRIO_TILE) continue;
// 因为有排序过,所以如果目前的显示顺序比地表大的话,表示地表已经处理完了
if( pSortTileTail->dispPrio > DISP_PRIO_TILE){
DispBuffer.DispCnt -= i;
break;
}
// 取得第一个要处理的图的 DispInfo 资料
pDispInfo = DispBuffer.DispInfo + pSortTileTail->no;
bmpNo = pDispInfo->bmpNo; // ????
if( pDispInfo->pAct != NULL ){
if( pDispInfo->pAct->atr & ACT_ATR_HIDE2 ) continue;
}
if( LoadBmp( bmpNo ) == FALSE ) continue;
#ifdef _READ16BITBMP
if(g_bUseAlpha){
for(lpSurfaceInfo = SpriteInfo[ bmpNo ].lpSurfaceInfo,lpSurfaceInfoSys = SpriteInfo[ bmpNo ].lpSurfaceInfoSys
;lpSurfaceInfo != NULL,lpSurfaceInfoSys != NULL
;lpSurfaceInfo = lpSurfaceInfo->pNext,lpSurfaceInfoSys = lpSurfaceInfoSys->pNext){
if(ResoMode == 1){
if(DrawSurfaceFast((pDispInfo->x >> 1) + lpSurfaceInfo->offsetX,(pDispInfo->y >> 1) + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface,lpSurfaceInfoSys->lpSurface) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
else{
if(DrawSurfaceFast(pDispInfo->x + lpSurfaceInfo->offsetX,
pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface,lpSurfaceInfoSys->lpSurface) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
lpSurfaceInfo->date = SurfaceDate;
}
}
else
#endif
{
for(lpSurfaceInfo = SpriteInfo[ bmpNo ].lpSurfaceInfo;lpSurfaceInfo != NULL;lpSurfaceInfo = lpSurfaceInfo->pNext ){
if(ResoMode == 1){
if(DrawSurfaceFast((pDispInfo->x >> 1) + lpSurfaceInfo->offsetX,
(pDispInfo->y >> 1) + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface ) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
else{
#ifdef _CACHE_SURFACE_
DrawSurfaceFromPalette(lpSurfaceInfo);
#endif
if(DrawSurfaceFast(pDispInfo->x + lpSurfaceInfo->offsetX,
pDispInfo->y + lpSurfaceInfo->offsetY,
lpSurfaceInfo->lpSurface ) == DDERR_SURFACEBUSY) SurfaceBusyFlag = TRUE;
}
lpSurfaceInfo->date = SurfaceDate;
}
}
}
if(fastDrawTile && lpDraw->lpBACKBUFFER->BltFast( 0, 0, lpBattleSurface, NULL, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ) == DDERR_SURFACEBUSY){
SurfaceBusyFlag = TRUE;
return;
}
#ifdef _READ16BITBMP
if(g_bUseAlpha){
if(fastDrawTile && lpDraw->lpBACKBUFFERSYS->BltFast( 0, 0, lpBattleSurfaceSys, NULL, DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ) == DDERR_SURFACEBUSY){
SurfaceBusyFlag = TRUE;
return;
}
}
#endif
}
}
#endif
extern int gBitRShift;
void DrawGray(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2,nColorOverlayer;
int i,j,w = SURFACE_WIDTH,h = SURFACE_HEIGHT,subx,dx = 0,dy = 0;
int R,G,B,Gray,g;
bool odd = false;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
subx = ox;
if(iGrayType == 3) g = 6;
else if(iGrayType == 4) g = 5;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFER->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFER->Unlock(NULL);
return;
}
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest = (DWORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (DWORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 0){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
Gray = (R*3+G*5+B)/10;
*(DWORD*)ptSourceDest = (DWORD)(Gray << 16 | Gray << 8 | Gray);
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}else
#endif
if(displayBpp == 16){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xf800) >> 11;
G = (nColorOverlayer & 0x07e0) >> 6;
B = nColorOverlayer & 0x001f;
Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)(Gray << 11 | Gray << g | Gray);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}
lpSurface->Unlock(NULL);
lpDraw->lpBACKBUFFER->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFER,&rect,DDBLTFAST_WAIT);
return;
}
void DrawGrayA(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2,nColorOverlayer;
int i,j,w = SURFACE_WIDTH,h = SURFACE_HEIGHT,subx,dx = 0,dy = 0;
int R,G,B,Gray,g;
bool odd = false;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
subx = ox;
if(iGrayType == 3) g = 6;
else if(iGrayType == 4) g = 5;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFER->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFER->Unlock(NULL);
return;
}
unsigned char ALPHA = 150, RED = 250, GREEN = 0, BLUE = 250;
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest = (DWORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (DWORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 0){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
R = RED + (R - RED) * ALPHA / 0xff;
G = GREEN + (G - GREEN) * ALPHA / 0xff;
B = BLUE + (B - BLUE) * ALPHA / 0xff;
Gray = 0xff;
*(DWORD*)ptSourceDest = (DWORD)(Gray << 24 | R<<16 | G << 8 | B);
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}else
#endif
if(displayBpp == 16){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xf800) >> 8;
G = (nColorOverlayer & 0x07e0) >> 3;
B = (nColorOverlayer & 0x001f) << 3;
R = RED + (R - RED) * ALPHA / 0xff;
G = GREEN + (G - GREEN) * ALPHA / 0xff;
B = BLUE + (B - BLUE) * ALPHA / 0xff;
Gray = 0xff;
//Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)((R & 0xf8) << 8 | (G & 0xfc) << 3 | B >> 3);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}
lpSurface->Unlock(NULL);
lpDraw->lpBACKBUFFER->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFER,&rect,DDBLTFAST_WAIT);
return;
}
void DrawStaturated(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2;
int w = SURFACE_WIDTH,h = SURFACE_HEIGHT,dx = 0,dy = 0;
DWORD Is4Multiple;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
Is4Multiple = w % 4;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFER->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFER->Unlock(NULL);
return;
}
void *ptSourceDest,*ptOverLayerDest;
#ifdef _HI_COLOR_32
void *ptSourceDest32,*ptOverLayerDest32;
if( displayBpp == 32 ){
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest32 = (DWORD *)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest32 = (DWORD *)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}else
#endif
{
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}
{
int i,j,nColorSource,nColorOverlayer;
DWORD SR,SG,SB,OR,OG,OB;
// 565 显示模式
if(gBitRShift == 2){
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
// SR = (((SR + OR) > 0x00ff ? 0x00ff:SR+OR) << 8) & 0xf800;
// SG = (((SG + OG) > 0x00ff ? 0x00ff:SG+OG) << 3) & 0x07e0;
// SB = (((SB + OB) > 0x00ff ? 0x00ff:SB+OB) >> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) << 8) & 0xff0000;
SG = ((OG > SG ? OG:SG) << 3) & 0x00ff00;
SB = ((OB > SB ? OB:SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
}
}else
#endif
{
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xf800) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x07e0) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x001f) << 3;
OR = (nColorOverlayer & 0xf800) >> 8;
OG = (nColorOverlayer & 0x07e0) >> 3;
OB = (nColorOverlayer & 0x001f) << 3;
// SR = (((SR + OR) > 0x00ff ? 0x00ff:SR+OR) << 8) & 0xf800;
// SG = (((SG + OG) > 0x00ff ? 0x00ff:SG+OG) << 3) & 0x07e0;
// SB = (((SB + OB) > 0x00ff ? 0x00ff:SB+OB) >> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) << 8) & 0xf800;
SG = ((OG > SG ? OG:SG) << 3) & 0x07e0;
SB = ((OB > SB ? OB:SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
}
}
}
// 555 显示模式
else{
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x00ff00) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorSource & 0xff0000) >> 7;
OG = (nColorOverlayer & 0x00ff00) >> 2;
OB = (nColorOverlayer & 0x0000ff) << 3;
// SR = ((SR + OR) & 0x00ff)<< 7;
// SG = (((SG + OG) & 0x00ff)<< 2) & 0x03e0;
// SB = (((SB + OB) & 0x00ff)>> 3) & 0x001f;
SR = (((OR > SR ? OR:SR) & 0x00ff)<< 7) & 0xff0000;
SG = (((OG > SG ? OG:SG) & 0x00ff)<< 2) & 0x00ff00;
SB = (((OB > SB ? OB:SB) & 0x00ff)>> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
}
}else
#endif
{
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = nColorSource >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x03e0) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x001f) << 3;
OR = nColorOverlayer >> 7;
OG = (nColorOverlayer & 0x03e0) >> 2;
OB = (nColorOverlayer & 0x001f) << 3;
// SR = ((SR + OR) & 0x00ff)<< 7;
// SG = (((SG + OG) & 0x00ff)<< 2) & 0x03e0;
// SB = (((SB + OB) & 0x00ff)>> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) & 0x00ff)<< 7;
SG = (((OG > SG ? OG:SG) & 0x00ff)<< 2) & 0x03e0;
SB = (((OB > SB ? OB:SB) & 0x00ff)>> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
}
}
}
}
lpDraw->lpBACKBUFFER->Unlock(NULL);
lpSurface->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFER,&rect,DDBLTFAST_WAIT);
return;
}
#ifdef _READ16BITBMP
extern int gBitRShift;
void DrawAlpha(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,int Alpha,bool bLastOne){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2;
int w = SURFACE_WIDTH,h = SURFACE_HEIGHT,dx = 0,dy = 0;
DWORD Is4Multiple;
bool odd = false;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
if((w % 2) == 1) odd = true;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
if((w % 2) == 1) odd = true;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
if((w % 2) == 1) odd = true;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
Is4Multiple = w % 4;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFERSYS->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
return;
}
void *ptSourceDest,*ptOverLayerDest;
#ifdef _HI_COLOR_32
void *ptSourceDest32,*ptOverLayerDest32;
if( displayBpp == 32 ){
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest32 = (int *)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest32 = (int *)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}else
#endif
{
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}
{
int i,j,nColorSource,nColorOverlayer;
DWORD SR,SG,SB,OR,OG,OB;
w >>= 1;
// 565 显示模式
if(gBitRShift == 2){
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
if(odd){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8;
SG = (nColorSource & 0x00ff00) >> 3;
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = SB | SG | SR;
}
ptSourceDest32 = (DWORD*)ptSourceDest + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + (surfacePitch1 >> 2) - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + (surfacePitch2 >> 2) - w;
if(odd){
ptSourceDest32 = (WORD*)ptSourceDest - 1;
ptOverLayerDest32 = (WORD*)ptOverLayerDest32 - 1;
}
}
}else
#endif
{
for(j=0;j<h;j++){
if(odd){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xf800) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x07e0) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x001f) << 3;
OR = (nColorOverlayer & 0xf800) >> 8;
OG = (nColorOverlayer & 0x07e0) >> 3;
OB = (nColorOverlayer & 0x001f) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xf800;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x07e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest;
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xf800f800) >> 8;
SG = (nColorSource & 0x07e007e0) >> 3;
SB = (nColorSource & 0x001f001f) << 3;
OR = (nColorOverlayer & 0xf800f800) >> 8;
OG = (nColorOverlayer & 0x07e007e0) >> 3;
OB = (nColorOverlayer & 0x001f001f) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xf800f800;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x07e007e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f001f;
*(DWORD*)ptSourceDest = SB | SG | SR;
}
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + (surfacePitch1 >> 1) - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + (surfacePitch2 >> 1) - w;
if(odd){
ptSourceDest = (WORD*)ptSourceDest - 1;
ptOverLayerDest = (WORD*)ptOverLayerDest - 1;
}
}
}
}
// 555 显示模式
else{
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
if(odd){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x00ff00) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 7;
OG = (nColorOverlayer & 0x00ff00) >> 2;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 7) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 2) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 7;
SG = (nColorSource & 0x00ff00) >> 2;
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 7;
OG = (nColorOverlayer & 0x00ff00) >> 2;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 7) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 2) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = SB | SG | SR;
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + (surfacePitch1 >> 2) - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + (surfacePitch2 >> 2) - w;
if(odd){
ptSourceDest32 = (WORD*)ptSourceDest32 - 1;
ptOverLayerDest32 = (WORD*)ptOverLayerDest32 - 1;
}
}
}else
#endif
{
for(j=0;j<h;j++){
if(odd){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = nColorSource >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x03e0) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x001f) << 3;
OR = nColorOverlayer >> 7;
OG = (nColorOverlayer & 0x03e0) >> 2;
OB = (nColorOverlayer & 0x001f) << 3;
SR = ((((OR - SR) * Alpha) >> 5) + SR) << 7;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 2) & 0x03e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest;
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0x7c007c00) >> 7;
SG = (nColorSource & 0x03e003e0) >> 2;
SB = (nColorSource & 0x001f001f) << 3;
OR = (nColorOverlayer & 0x7c007c00) >> 7;
OG = (nColorOverlayer & 0x03e003e0) >> 2;
OB = (nColorOverlayer & 0x001f001f) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 7) & 0x7c007c00;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 2) & 0x03e003e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f001f;
*(DWORD*)ptSourceDest = SB | SG | SR;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + (surfacePitch1 >> 1) - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + (surfacePitch2 >> 1) - w;
if(odd){
ptSourceDest = (WORD*)ptSourceDest - 1;
ptOverLayerDest = (WORD*)ptOverLayerDest - 1;
}
}
}
}
}
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
lpSurface->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFERSYS,&rect,DDBLTFAST_WAIT);
return;
}
void DrawStaturated(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2;
int w = SURFACE_WIDTH,h = SURFACE_HEIGHT,dx = 0,dy = 0;
DWORD Is4Multiple;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
Is4Multiple = w % 4;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFERSYS->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
return;
}
void *ptSourceDest,*ptOverLayerDest;
#ifdef _HI_COLOR_32
void *ptSourceDest32,*ptOverLayerDest32;
if( displayBpp == 32 ){
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest32 = (DWORD *)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest32 = (DWORD *)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}else
#endif
{
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}
{
int i,j,nColorSource,nColorOverlayer;
DWORD SR,SG,SB,OR,OG,OB;
// 565 显示模式
if(gBitRShift == 2){
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
// SR = (((SR + OR) > 0x00ff ? 0x00ff:SR+OR) << 8) & 0xf800;
// SG = (((SG + OG) > 0x00ff ? 0x00ff:SG+OG) << 3) & 0x07e0;
// SB = (((SB + OB) > 0x00ff ? 0x00ff:SB+OB) >> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) << 8) & 0xff0000;
SG = ((OG > SG ? OG:SG) << 3) & 0x00ff00;
SB = ((OB > SB ? OB:SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
}
}else
#endif
{
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xf800) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x07e0) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x001f) << 3;
OR = (nColorOverlayer & 0xf800) >> 8;
OG = (nColorOverlayer & 0x07e0) >> 3;
OB = (nColorOverlayer & 0x001f) << 3;
// SR = (((SR + OR) > 0x00ff ? 0x00ff:SR+OR) << 8) & 0xf800;
// SG = (((SG + OG) > 0x00ff ? 0x00ff:SG+OG) << 3) & 0x07e0;
// SB = (((SB + OB) > 0x00ff ? 0x00ff:SB+OB) >> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) << 8) & 0xf800;
SG = ((OG > SG ? OG:SG) << 3) & 0x07e0;
SB = ((OB > SB ? OB:SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
}
}
}
// 555 显示模式
else{
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x00ff00) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorSource & 0xff0000) >> 7;
OG = (nColorOverlayer & 0x00ff00) >> 2;
OB = (nColorOverlayer & 0x0000ff) << 3;
// SR = ((SR + OR) & 0x00ff)<< 7;
// SG = (((SG + OG) & 0x00ff)<< 2) & 0x03e0;
// SB = (((SB + OB) & 0x00ff)>> 3) & 0x001f;
SR = (((OR > SR ? OR:SR) & 0x00ff)<< 7) & 0xff0000;
SG = (((OG > SG ? OG:SG) & 0x00ff)<< 2) & 0x00ff00;
SB = (((OB > SB ? OB:SB) & 0x00ff)>> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest32 + 1;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
}
}else
#endif
{
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
SR = nColorSource >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x03e0) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x001f) << 3;
OR = nColorOverlayer >> 7;
OG = (nColorOverlayer & 0x03e0) >> 2;
OB = (nColorOverlayer & 0x001f) << 3;
// SR = ((SR + OR) & 0x00ff)<< 7;
// SG = (((SG + OG) & 0x00ff)<< 2) & 0x03e0;
// SB = (((SB + OB) & 0x00ff)>> 3) & 0x001f;
SR = ((OR > SR ? OR:SR) & 0x00ff)<< 7;
SG = (((OG > SG ? OG:SG) & 0x00ff)<< 2) & 0x03e0;
SB = (((OB > SB ? OB:SB) & 0x00ff)>> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
}
}
}
}
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
lpSurface->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFERSYS,&rect,DDBLTFAST_WAIT);
return;
}
void DrawGray(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2,nColorOverlayer;
int i,j,w = SURFACE_WIDTH,h = SURFACE_HEIGHT,subx,dx = 0,dy = 0;
int R,G,B,Gray,g;
bool odd = false;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
subx = ox;
if(iGrayType == 3) g = 6;
else if(iGrayType == 4) g = 5;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFERSYS->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
return;
}
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest = (DWORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (DWORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
Gray = (R*3+G*6+B)/10;
*(DWORD*)ptSourceDest = (DWORD)(Gray << 16 | Gray << 8 | Gray);
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
// 555 显示模式
else{
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
Gray = (R*3+G*5+B)/10;
*(DWORD*)ptSourceDest = (DWORD)(Gray << 16 | Gray << 8 | Gray);
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}else
#endif
if(displayBpp == 16){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xf800) >> 11;
G = (nColorOverlayer & 0x07e0) >> 6;
B = nColorOverlayer & 0x001f;
Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)(Gray << 11 | Gray << g | Gray);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
// 555 显示模式
else{
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = nColorOverlayer >> 10;
G = (nColorOverlayer & 0x03e0) >> 5;
B = nColorOverlayer & 0x001f;
Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)(Gray << 10 | Gray << g | Gray);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}
lpSurface->Unlock(NULL);
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFERSYS,&rect,DDBLTFAST_WAIT);
return;
}
void DrawAlphaChannel(SURFACE_INFO *surface_info,BYTE *AlphaData,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2;
int w = SURFACE_WIDTH,h = SURFACE_HEIGHT,dx = 0,dy = 0;
DWORD Is4Multiple;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
Is4Multiple = w % 4;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFERSYS->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(surface_info->lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT | DDLOCK_READONLY ,NULL) != DD_OK){
lpDraw->lpBACKBUFFERSYS->Unlock(&ddsdSource);
return;
}
void *ptSourceDest,*ptOverLayerDest;
#ifdef _HI_COLOR_32
void *ptSourceDest32,*ptOverLayerDest32;
if( displayBpp == 32){
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest32 = (int *)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest32 = (int *)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}else
#endif
{
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) + dy * surfacePitch2 + dx;
}
int i,j,nColorSource,nColorOverlayer;
DWORD SR,SG,SB,OR,OG,OB,Alpha;
// 565 显示模式
if(gBitRShift == 2){
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
Alpha = (DWORD)(*AlphaData);
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
AlphaData++;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
AlphaData += SURFACE_WIDTH - w;
}
}else
#endif
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
Alpha = (WORD)(*AlphaData);
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xf800) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x07e0) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x001f) << 3;
OR = (nColorOverlayer & 0xf800) >> 8;
OG = (nColorOverlayer & 0x07e0) >> 3;
OB = (nColorOverlayer & 0x001f) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xf800;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x07e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
AlphaData++;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
AlphaData += SURFACE_WIDTH - w;
}
}
// 555 显示模式
else{
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(DWORD*)ptSourceDest32;
nColorOverlayer = *(DWORD*)ptOverLayerDest32;
Alpha = (DWORD)(*AlphaData);
if(nColorOverlayer != DEF_COLORKEY){
SR = (nColorSource & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
SG = (nColorSource & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
SB = (nColorSource & 0x0000ff) << 3;
OR = (nColorOverlayer & 0xff0000) >> 8;
OG = (nColorOverlayer & 0x00ff00) >> 3;
OB = (nColorOverlayer & 0x0000ff) << 3;
SR = (((((OR - SR) * Alpha) >> 5) + SR) << 8) & 0xff0000;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 3) & 0x00ff00;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest32 = (DWORD)(SB | SG | SR);
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + 1;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + 1;
AlphaData++;
}
ptSourceDest32 = (DWORD*)ptSourceDest32 + surfacePitch1 - w;
ptOverLayerDest32 = (DWORD*)ptOverLayerDest32 + surfacePitch2 - w;
AlphaData += SURFACE_WIDTH - w;
}
}else
#endif
{
for(j=0;j<h;j++){
for(i=0;i<w;i++){
nColorSource = *(WORD*)ptSourceDest;
nColorOverlayer = *(WORD*)ptOverLayerDest;
Alpha = (WORD)(*AlphaData);
if(nColorOverlayer != DEF_COLORKEY){
SR = nColorSource >> 7; // 原本要右移10左移3,简化成右移7
SG = (nColorSource & 0x03e0) >> 2; // 原本要右移5左移3,简化成右移2
SB = (nColorSource & 0x001f) << 3;
OR = nColorOverlayer >> 7;
OG = (nColorOverlayer & 0x03e0) >> 2;
OB = (nColorOverlayer & 0x001f) << 3;
SR = ((((OR - SR) * Alpha) >> 5) + SR) << 7;
SG = (((((OG - SG) * Alpha) >> 5) + SG) << 2) & 0x03e0;
SB = (((((OB - SB) * Alpha) >> 5) + SB) >> 3) & 0x001f;
*(WORD*)ptSourceDest = (WORD)(SB | SG | SR);
}
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
AlphaData++;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
AlphaData += SURFACE_WIDTH - w;
}
}
}
lpDraw->lpBACKBUFFERSYS->Unlock(&ddsdSource);
surface_info->lpSurface->Unlock(&ddsdOverlayer);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFERSYS,&rect,DDBLTFAST_WAIT);
return;
}
#endif
#ifdef _SFUMATO
void DrawSfumato(LPDIRECTDRAWSURFACE lpSurface,int ox,int oy,int offsetx,int offsety,int ow,int oh,bool bLastOne,int iGrayType, int sfumato){
static DDSURFACEDESC ddsdSource,ddsdOverlayer;
int surfacePitch1,surfacePitch2,nColorOverlayer;
int i,j,w = SURFACE_WIDTH,h = SURFACE_HEIGHT,subx,dx = 0,dy = 0;
int R,G,B,Gray,g;
bool odd = false;
RECT rect;
if(ox >= lpDraw->xSize || ox + w <= 0 || oy >= lpDraw->ySize || oy + h <= 0 ) return;
if(bLastOne){
w = ow - offsetx;
h = oh - offsety;
}
if(ox + w >= lpDraw->xSize){
w = lpDraw->xSize - ox;
}
if(oy + h >= lpDraw->ySize) h = lpDraw->ySize - oy;
if(ox < 0){
w = w + ox;
if(w < 0) return;
dx = ox*-1;
ox = 0;
}
if(oy < 0){
h = h + oy;
if(h < 0) return;
dy = oy*-1;
oy = 0;
}
subx = ox;
if(iGrayType == 3) g = 6;
else if(iGrayType == 4) g = 5;
ZeroMemory(&ddsdSource,sizeof(DDSURFACEDESC));
ddsdSource.dwSize = sizeof(DDSURFACEDESC);
ZeroMemory(&ddsdOverlayer,sizeof(DDSURFACEDESC));
ddsdOverlayer.dwSize = sizeof(DDSURFACEDESC);
if(lpDraw->lpBACKBUFFERSYS->Lock(NULL,&ddsdSource,DDLOCK_WAIT,NULL) != DD_OK) return;
if(lpSurface->Lock(NULL,&ddsdOverlayer,DDLOCK_WAIT,NULL) != DD_OK){
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
return;
}
#ifdef _HI_COLOR_32
if( displayBpp == 32 ){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 2;
surfacePitch2 = ddsdOverlayer.lPitch >> 2;
ptSourceDest = (DWORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (DWORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
Gray = (R*3+G*6+B)/10;
*(DWORD*)ptSourceDest = (DWORD)(Gray << 16 | Gray << 8 | Gray);
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
// 555 显示模式
else{
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(DWORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xff0000) >> 16;
G = (nColorOverlayer & 0x00ff00) >> 8;
B = (nColorOverlayer & 0x0000ff);
if(sfumato > 0){
int x = G - R;
int y = G - B;
if((R > 0x30 && G > 0x30 && B > 0x30)/* &&(R < 0xf0 && G < 0xf0 && B < 0xf0) */&& (x > -40 && x < 40) && (y > -40 && y < 40)){
R = (nColorOverlayer & 0xff0000) >> 8; // 原本要右移11左移3,简化成右移8
G = (nColorOverlayer & 0x00ff00) >> 3; // 原本要右移5左移2,简化成右移3
B = (nColorOverlayer & 0x0000ff) << 3;
int OR = (sfumato & 0xff0000) >> 8;
int OG = (sfumato & 0x00ff00) >> 3;
int OB = (sfumato & 0x0000ff) << 3;
R = (((((OR - R) * 12) >> 5) + R) << 8) & 0xff0000;
G = (((((OG - G) * 12) >> 5) + G) << 3) & 0x00ff00;
B = (((((OB - B) * 12) >> 5) + B) >> 3) & 0x0000ff;
*(DWORD*)ptSourceDest = (DWORD)(B | G | R);
}else{
*(DWORD*)ptSourceDest = nColorOverlayer;
}
}else{
*(DWORD*)ptSourceDest = nColorOverlayer;
}
}
}
else subx++;
ptSourceDest = (DWORD*)ptSourceDest + 1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + 1;
}
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (DWORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (DWORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}else
#endif
if(displayBpp == 16){
void *ptSourceDest,*ptOverLayerDest;
surfacePitch1 = ddsdSource.lPitch >> 1;
surfacePitch2 = ddsdOverlayer.lPitch >> 1;
ptSourceDest = (WORD*)(ddsdSource.lpSurface) + oy * surfacePitch1 + ox;
ptOverLayerDest = (WORD*)(ddsdOverlayer.lpSurface) +dy * surfacePitch2 + dx;
// 565 显示模式
if(gBitRShift == 2){
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = (nColorOverlayer & 0xf800) >> 11;
G = (nColorOverlayer & 0x07e0) >> 6;
B = nColorOverlayer & 0x001f;
Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)(Gray << 11 | Gray << g | Gray);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
// 555 显示模式
else{
for(j=0;j<h;j++){
if(oy >= 0){
for(i=0;i<w;i++){
if(subx >= 0){
nColorOverlayer = *(WORD*)ptOverLayerDest;
if(nColorOverlayer != DEF_COLORKEY){
R = nColorOverlayer >> 10;
G = (nColorOverlayer & 0x03e0) >> 5;
B = nColorOverlayer & 0x001f;
Gray = (R*3+G*6+B)/10;
*(WORD*)ptSourceDest = (WORD)(Gray << 10 | Gray << g | Gray);
}
}
else subx++;
ptSourceDest = (WORD*)ptSourceDest + 1;
ptOverLayerDest = (WORD*)ptOverLayerDest + 1;
}
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1 - w;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2 - w;
subx = ox;
}
else{
ptSourceDest = (WORD*)ptSourceDest + surfacePitch1;
ptOverLayerDest = (WORD*)ptOverLayerDest + surfacePitch2;
oy++;
}
}
}
}
lpSurface->Unlock(NULL);
lpDraw->lpBACKBUFFERSYS->Unlock(NULL);
rect.left = ox;
rect.top = oy;
rect.right = ox+w;
rect.bottom = oy+h;
lpDraw->lpBACKBUFFER->BltFast(ox,oy,lpDraw->lpBACKBUFFERSYS,&rect,DDBLTFAST_WAIT);
return;
}
#endif
void ablend_565(unsigned char *lpAlpha, unsigned int iAlpPitch,
unsigned char *lpSrc, unsigned int iSrcX, unsigned int iSrcY,
unsigned int iSrcPitch, unsigned char *lpDst,
unsigned int iDstX, unsigned int iDstY,
unsigned int iDstW, unsigned int iDstH,
unsigned int iDstPitch)
{
//Mask for isolating the red,green, and blue components
static __int64 MASKB = 0x001F001F001F001F;
static __int64 MASKG = 0x07E007E007E007E0;
static __int64 MASKSHIFTG = 0x03F003F003F003F0;
static __int64 MASKR = 0xF800F800F800F800;
static __int64 SIXTEEN = 0x0010001000100010;
static __int64 FIVETWELVE = 0x0200020002000200;
static __int64 SIXONES = 0x003F003F003F003F;
unsigned char *lpLinearDstBp = (iDstX << 1) + (iDstY*iDstPitch) + lpDst;
unsigned char *lpLinearSrcBp = (iSrcX << 1) + (iSrcY*iSrcPitch) + lpSrc;
unsigned char *lpLinearAlpBp = iSrcX + (iSrcY*iAlpPitch) + lpAlpha;
_asm{
mov esi, lpLinearSrcBp;
mov edi, lpLinearDstBp;
mov eax, lpLinearAlpBp;
mov ecx, iDstH;
mov ebx, iDstW;
test esi, 6;
jnz done;
primeloop:
movd mm1, [eax];
pxor mm2, mm2;
movq mm4, [esi];
punpcklbw mm1, mm2;
loopqword:
mov edx, [eax];
test ebx, 0xFFFFFFFC;
jz checkback;
cmp edx, 0xffffffff;
je copyback;
test edx, 0xffffffff;
jz leavefront;
movq mm5, [edi];
psrlw mm1, 2;
movq mm7, MASKSHIFTG;
psrlw mm4, 1;
movq mm0, mm1;
psrlw mm5, 1;
psrlw mm1, 1;
pand mm4, mm7;
movq mm2, SIXONES;
pand mm5, mm7;
movq mm3, [esi];
psubsb mm2, mm0;
movq mm7, MASKB;
pmullw mm4, mm0;
movq mm0, [edi];
pmullw mm5, mm2;
movq mm2, mm7;
pand mm3, mm7;
pmullw mm3, mm1;
pand mm0, mm7;
movq mm7, [esi];
paddw mm4, mm5;
pand mm7, MASKR;
psubsb mm2, mm1;
paddw mm4, FIVETWELVE;
pmullw mm0, mm2;
movq mm5, mm4;
psrlw mm7, 11;
psrlw mm4, 6;
paddw mm4, mm5;
paddw mm0, mm3;
movq mm5, [edi];
paddw mm0, SIXTEEN;
pand mm5, MASKR;
psrlw mm4, 5;
movq mm3, mm0;
psrlw mm0, 5;
psrlw mm5, 11;
paddw mm0, mm3;
psrlw mm0, 5;
pmullw mm7, mm1; //mm7=sr?*a?
pand mm4, MASKG; //g16: mm4=00g0 00g0 00g0 00g0 green
pmullw mm5, mm2; //r7: mm5=dr?*(31-a?)
por mm0, mm4; //mm0=00gb 00gb 00gb 00gb
add eax, 4; //move to next 4 alphas
add esi, 8; //move to next 4 pixels in src
add edi, 8; //move to next 4 pixels in dst
movd mm1, [eax]; //mm1=00 00 00 00 a3 a2 a1 a0
paddw mm5, mm7; //r8: mm5=sr?*a?+dr?*(31-a?)
paddw mm5, SIXTEEN; //r9: mm5=(mm5+16) red
pxor mm2, mm2; //mm2=0;
movq mm7, mm5; //r10: mm7=mm5 red
psrlw mm5, 5; //r11: mm5=mm5>>5 red
movq mm4, [esi]; //g1: mm4=src3 src2 src1 src0
paddw mm5, mm7; //r12: mm5=mm7+mm5 red
punpcklbw mm1, mm2; //mm1=00a3 00a2 00a1 00a0
psrlw mm5, 5; //r13: mm5=mm5>>5 red
psllw mm5, 11; //r14: mm5=mm5<<10 red
por mm0, mm5; //mm0=0rgb 0rgb 0rgb 0rgb
sub ebx, 4; //polished off 4 pixels
movq[edi - 8], mm0; //dst=0rgb 0rgb 0rgb 0rgb
jmp loopqword; //go back to start
copyback:
movq[edi], mm4; //copy source to destination
leavefront:
add edi, 8; //advance destination by 4 pixels
add eax, 4; //advance alpha by 4
add esi, 8; //advance source by 4 pixels
sub ebx, 4; //decrease pixel count by 4
jmp primeloop;
checkback:
test ebx, 0xFF; //check if 0 pixels left
jz nextline; //done with this span
//backalign: //work out back end pixels
movq mm5, [edi]; //g2: mm5=dst3 dst2 dst1 dst0
psrlw mm1, 2; //mm1=a?>>2 nuke out lower 2 bits
movq mm7, MASKSHIFTG; //g3: mm7=shift 1 bit green mask
psrlw mm4, 1; //g3a: move src green down by 1 so that we won't overflow
movq mm0, mm1; //mm0=00a3 00a2 00a1 00a0
psrlw mm5, 1; //g3b: move dst green down by 1 so that we won't overflow
psrlw mm1, 1; //mm1=a?>>1 nuke out lower 1 bits
pand mm4, mm7; //g5: mm4=sg3 sg2 sg1 sg0
movq mm2, SIXONES;//g4: mm2=63
pand mm5, mm7; //g7: mm5=dg3 dg2 dg1 dg0
movq mm3, [esi]; //b1: mm3=src3 src2 src1 src0
psubsb mm2, mm0; //g6: mm2=63-a3 63-a2 63-a1 63-a0
movq mm7, MASKB; //b2: mm7=BLUE MASK
pmullw mm4, mm0; //g8: mm4=sg?*a?
movq mm0, [edi]; //b3: mm0=dst3 dst2 dst1 dst0
pmullw mm5, mm2; //g9: mm5=dg?*(1-a?)
movq mm2, mm7; //b4: mm2=fiveones
pand mm3, mm7; //b4: mm3=sr3 sr2 sr1 sr0
pmullw mm3, mm1; //b6: mm3=sb?*a?
pand mm0, mm7; //b5: mm0=db3 db2 db1 db0
movq mm7, [esi]; //r1: mm7=src3 src2 src1 src0
paddw mm4, mm5; //g10: mm4=sg?*a?+dg?*(1-a?)
pand mm7, MASKR; //r2: mm7=sr3 sr2 sr1 sr0
psubsb mm2, mm1; //b5a: mm2=31-a3 31-a2 31-a1 31-a0
paddw mm4, FIVETWELVE; //g11: mm4=(i+512) green
pmullw mm0, mm2; //b7: mm0=db?*(1-a?)
movq mm5, mm4; //g12: mm5=(i+512) green
psrlw mm7, 11; //r4: shift src red down to position 0
psrlw mm4, 6; //g13: mm4=(i+512)>>6
paddw mm4, mm5; //g14: mm4=(i+512)+((i+512)>>6) green
paddw mm0, mm3; //b8: mm0=sb?*a?+db?*(1-a?)
movq mm5, [edi]; //r3: mm5=dst3 dst2 dst1 dst0
paddw mm0, SIXTEEN; //b9: mm0=(i+16) blue
pand mm5, MASKR; //r5: mm5=dr3 dr2 dr1 dr0
psrlw mm4, 5; //g15: mm4=0?g0 0?g0 0?g0 0?g0 green
movq mm3, mm0; //b10: mm3=(i+16) blue
psrlw mm0, 5; //b11: mm0=(i+16)>>5 blue
psrlw mm5, 11; //r6: shift dst red down to position 0
paddw mm0, mm3; //b12: mm0=(i+16)+(i+16)>>5 blue
psrlw mm0, 5; //b13: mm0=000r 000r 000r 000r blue
pmullw mm7, mm1; //mm7=sr?*a?
pand mm4, MASKG; //g16: mm4=00g0 00g0 00g0 00g0 green
pmullw mm5, mm2; //r7: mm5=dr?*(31-a?)
por mm0, mm4; //mm0=00gb 00gb 00gb 00gb
add eax, 4; //move to next 4 alphas
//stall
paddw mm5, mm7; //r8: mm5=sr?*a?+dr?*(31-a?)
paddw mm5, SIXTEEN; //r9: mm5=(i+16) red
movq mm7, mm5; //r10: mm7=(i+16) red
psrlw mm5, 5; //r11: mm5=(i+16)>>5 red
paddw mm5, mm7; //r12: mm5=(i+16)+((i+16)>>5) red
psrlw mm5, 5; //r13: mm5=(i+16)+((i+16)>>5)>>5 red
psllw mm5, 11; //r14: mm5=mm5<<10 red
por mm0, mm5; //mm0=0rgb 0rgb 0rgb 0rgb
test ebx, 2; //check if there are 2 pixels
jz oneendpixel; //goto one pixel if that's it
movd[edi], mm0; //dst=0000 0000 0rgb 0rgb
psrlq mm0, 32; //mm0>>32
add edi, 4; //edi=edi+4
sub ebx, 2; //saved 2 pixels
jz nextline; //all done goto next line
oneendpixel: //work on last pixel
movd edx, mm0; //edx=0rgb
mov[edi], dx; //dst=0rgb
nextline: //goto next line
dec ecx; //nuke one line
jz done; //all done
mov eax, lpLinearAlpBp; //alpha
mov esi, lpLinearSrcBp; //src
mov edi, lpLinearDstBp; //dst
add eax, iAlpPitch; //inc alpha ptr by 1 line
add esi, iSrcPitch; //inc src ptr by 1 line
add edi, iDstPitch; //inc dst ptr by 1 line
mov lpLinearAlpBp, eax; //save new alpha base ptr
mov ebx, iDstW; //ebx=span width to copy
mov lpLinearSrcBp, esi; //save new src base ptr
mov lpLinearDstBp, edi; //save new dst base ptr
jmp primeloop; //start the next span
done:
emms
}
}
//mmx ARGB混合
void DrawAlpha32(
unsigned long* lpDst, // 目标缓冲
unsigned long iDstX, // 目标位置
unsigned long iDstY, // 目标位置
unsigned long iDstPitch, // 目标缓冲的pitch
unsigned long* lpSrc, // 原色彩缓冲
unsigned long iSrcX, // 原色彩位置
unsigned long iSrcY, // 原色彩位置
unsigned long iSrcW, // 原缓冲的尺寸
unsigned long iSrcH, // 原缓冲的尺寸
unsigned long iSrcPitch // 原色彩pitch
)
{
unsigned long *lpLinearDstBp = (iDstX)+(iDstY*iDstPitch / sizeof(DWORD)) + lpDst; //base pointer for linear destination
unsigned long *lpLinearSrcBp = (iSrcX)+(iSrcY*iSrcPitch / sizeof(DWORD)) + lpSrc; //base pointer for linear source
_asm{
mov edx, 0xFFFFFFFF; //255-Alpha mask
pxor mm7,mm7; //MM7清0
movd mm6,edx; //MM6=FFFFFFFF
mov esi, lpLinearSrcBp; // 移入源像素缓冲地址
mov edi, lpLinearDstBp; // 移入目标像素缓冲地址
mov ecx, iSrcH; // 下面两步操作是移入原缓冲的高度和宽度
mov ebx, iSrcW;
MainLoop:
//目标0xFF585C58 源0x71000008
movd mm0,[esi]; //mm0=SRC MM0=0000 0000 7100 0008
punpcklbw mm0,mm7; //SRC:32位Bit到64位Bit MM0=0071 0000 0000 0008
movq mm2,mm0; //mm2=SRC MM2=0071 0000 0000 0008
punpckhwd mm0,mm0; //高位是ALPHA 原0071 0000 0000 0008 移 0071 0071 0000 0000
punpckhdq mm0,mm0; //双字移动到四字,现在有八个像素的Alpha了! 0071 0071 0071 0071
movd edx,mm0;
cmp edx,0x00ff00ff;
je CopySrc;
test edx, 0xffffffff; // 如果alpha为0 ,那么会影响寄存器的标志位,ZF=1
jz BeginPixel;
movq mm1,mm6; //MM1=0000 0000 FFFF FFFF
punpckhdq mm1,mm1;
movd mm3,[edi]; //mm3=DST MM3=0000 0000 FF58 5C58
punpcklbw mm3,mm7; //mm3=32位Bit到64位Bit MM3=00FF 0058 005C 0058
psubb mm1,mm0; //mm1=255-src alpha bit MM1=00FF 00FF 00FF 00FF MM0=0071 0071 0071 0071 MM1=008E 008E 008E 008E
pmullw mm2,mm0; //mm2=src*srcAlpha MM2= 0071 0000 0000 0008 MM0=0071 0071 FF71 0071 MM2= 31E1 0000 0000 0388
pmullw mm3,mm1; //mm3=dst*(255-srcAlpha) MM3= 00FF 0058 005C 0058 MM1=008F 008F FF8E FF8E MM3=8E71 3128 D708 D8D0
paddusw mm3,mm2; //mm3=src*srcAlpha+dst*(255-srcAlpha) MM3=8E71 3128 D708 D8D0 MM2=31E1 0000 0000 0388 MM3=C052 3128 D708 DC58
psrlw mm3, 8; //mm3=src*srcAlpha/256+dst*(255-srcAlpha)/256 MM3=C052 3128 D708 DC58 MM3=00C0 0031 00D7 00DC
packuswb mm3,mm7; //mm3=packed dst MM3=00C0 0031 00D7 00DC MM3=0000 0000 C031 D7DC
movd [edi],mm3;
jmp BeginPixel;
CopySrc:
packuswb mm2, mm2; // 紧缩到低
movd[edi], mm2;
BeginPixel:
add edi, 4; // 目标像素向前移动4个像素
add esi, 4; // 源像素向前移动4个像素
sub ebx, 1; // 宽度减4
test ebx, 0xffffffff; // check if only 0 pixels left
jz NextLine; // 如果只有0个像素跳转到NextLine处理
jmp MainLoop; // 跳转到开始处,重新计算
NextLine:
dec ecx;
jz Done; // 处理完成
mov esi, lpLinearSrcBp; // src
mov edi, lpLinearDstBp; // dst
add esi, iSrcPitch; // inc src ptr by 1 line
add edi, iDstPitch; // inc dst ptr by 1 line
mov ebx, iSrcW; // ebx=span width to copy
mov lpLinearSrcBp, esi; // save new src base ptr
mov lpLinearDstBp, edi; // save new dst base ptr
jmp MainLoop; // start the next span
Done:
emms;
}
}
BOOL (ACTION* a0,S2 *wx,S2* wy)
{
int chrNo = ATR_CHR_NO(a0) - SPRSTART;
if(chrNo < 0){
int BmpNo;
realGetNo( ATR_CHR_NO(a0) , (U4 *)&BmpNo );
if(realGetWH(BmpNo, wx, wy)) return TRUE;
else return FALSE;
}else{
if(chrNo >= mxSPRITE) return FALSE;
ANIMLIST * ptAnimlist = SpriteData[chrNo].ptAnimlist;
if(ptAnimlist){
FRAMELIST * ptFramelist = ptAnimlist[0].ptFramelist;
if(realGetWH(ptFramelist[0].BmpNo, wx, wy)) return TRUE;
else return FALSE;
}
}
return FALSE;
}