Пример #1
0
// ---------------------------------------------------------------------------
//	描画
//	flip は Flip() で行うのが筋だとおもうけど,DrawScreen とメイン処理は
//	別スレッドなのでこっちで flip する
//
void WinDrawDDS::DrawScreen(const RECT& _rect, bool refresh)
{
	RECT rect = _rect;

	// パレット変更されていたら全画面更新
	if (palchanged) {
		refresh = true;
		palchanged = false;
	}

	if (refresh)
	{
		rect.left = 0, rect.right = width;
		rect.top = 0, rect.bottom = height;
		FillBlankArea();
	}

	// 作業領域を更新
	HRESULT r = ddsscrn->IsLost();
	if (r == DD_OK)
	{
		if (!guimode)
		{
			Update(ddsscrn, rect);
		}
		else
		{
			if (Update(ddsback, rect))
			{
				RECT rectdest;
				rectdest.left	= ltc.x + rect.left;
				rectdest.right	= ltc.x + rect.right;
				rectdest.top	= ltc.y + rect.top;
				rectdest.bottom = ltc.y + rect.bottom;
				r = ddsscrn->Blt(&rectdest, ddsback, &rectdest, 0, 0);
				LOGDDERR("ddsscrn->Blt", r);
			}
		}
	}
	if (r == DDERR_SURFACELOST)
	{
		RestoreSurface();
	}
}
Пример #2
0
WSERR WSurface::Blit2Screen(int x,int y)
{
	int i,j,s;
	Canvas->SleepFrame();
	Canvas->Update();
	if (data->LeftBuffer==0) {
		Canvas->NextFrame();
		return WS_CREARTSURFACEFAIL;
	}

	POINT point={0,0};
	::ClientToScreen(m_hWnd,&point);
	x+=point.x,y+=point.y;

	LPDIRECTDRAWSURFACE lpDDSBackLeft=data->LeftBuffer;
	LPDIRECTDRAWSURFACE lpDDSBackRight=data->RightBuffer;
	LPDIRECTDRAWSURFACE lpDDSPrimary=data->screen;

	int left_col=Canvas->col/2,right_col=Canvas->col-Canvas->col/2;
	BYTE *blit_ptr;
	bool bError;
	HRESULT hr=DD_OK;
	
	for (bError=true;bError;bError=false) {
		hr=lpDDSBackLeft->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);

		if (hr!=DD_OK) break;
		_set_blit_pitch(ddsd.lPitch-WCANVASBLOCKW*data->depth);
		blit_ptr=(BYTE *)ddsd.lpSurface;
		for (s=0,i=0;i<Canvas->row;i++,blit_ptr+=ddsd.lPitch*WCANVASBLOCKH-left_col*WCANVASBLOCKW*data->depth,s+=right_col)
			for (j=0;j<left_col;j++,blit_ptr+=WCANVASBLOCKW*data->depth,++s) {
				if (Canvas->block[s].last!=Canvas->block[s].obj || Canvas->block[s].change!=0)
					blit_surface(Canvas->block[s].GetBmpStruct(),(void*)blit_ptr);
			}

		hr=lpDDSBackLeft->Unlock(&ddsd);
		if (hr!=DD_OK) break;

		hr=lpDDSBackRight->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
		if (hr!=DD_OK) break;
		_set_blit_pitch(ddsd.lPitch-WCANVASBLOCKW*data->depth);
		blit_ptr=(BYTE *)ddsd.lpSurface;
		for (s=left_col,i=0;i<Canvas->row;i++,blit_ptr+=ddsd.lPitch*WCANVASBLOCKH-right_col*WCANVASBLOCKW*data->depth,s+=left_col)
			for (j=0;j<right_col;j++,blit_ptr+=WCANVASBLOCKW*data->depth,++s) {
				if (Canvas->block[s].last!=Canvas->block[s].obj || Canvas->block[s].change!=0)
					blit_surface(Canvas->block[s].GetBmpStruct(),(void*)blit_ptr);
			}
		hr=lpDDSBackRight->Unlock(&ddsd);
		if (hr!=DD_OK) break;

		WPoint offset_pos=Canvas->data->offset;
		int width=MIN((Canvas->col-Canvas->block_x)*WCANVASBLOCKW-offset_pos.x,Canvas->GetW());
		int height=MIN(((Canvas->row-Canvas->block_y)*WCANVASBLOCKH-offset_pos.y),Canvas->GetH());
		int split_x=Canvas->block_x*WCANVASBLOCKW+offset_pos.x;
		int split_y=Canvas->block_y*WCANVASBLOCKH+offset_pos.y;
		RECT rect;
		RECT drect;
		int skip;

		if (height>0) {
			if (width>0) {
				rect.top=split_y,rect.bottom=split_y+height;
				rect.left=split_x,rect.right=MIN(split_x+width,left_col*WCANVASBLOCKW);
				drect.left=x,drect.top=y;
				drect.right=x+rect.right-rect.left;
				drect.bottom=y+rect.bottom-rect.top;
				if (rect.left<rect.right) {
					skip=rect.right-rect.left;
//					lpDDSPrimary->BltFast(x,y,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				}
				else skip=0;
				rect.left=MAX(0,split_x-left_col*WCANVASBLOCKW),rect.right=split_x+width-left_col*WCANVASBLOCKW;
				if (rect.left<rect.right)
					drect.left=skip+x,drect.right=skip+x+rect.right-rect.left;
//					lpDDSPrimary->BltFast(skip+x,y,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				}
			if (Canvas->GetW()>width) {
				rect.top=split_y,rect.bottom=split_y+height;
				rect.left=0,rect.right=MIN(Canvas->GetW()-width,left_col*WCANVASBLOCKW);
				skip=rect.right-rect.left;

				drect.top=y,drect.left=Canvas->WBitmap::GetW()-split_x+x;
				drect.bottom=y+rect.bottom-rect.top;
				drect.right=drect.left+rect.right-rect.left;

//				lpDDSPrimary->BltFast(Canvas->WBitmap::GetW()-split_x+x,y,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
				lpDDSPrimary->Blt(&drect,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				if (rect.right<Canvas->GetW()-width) {
					rect.right=Canvas->GetW()-width-left_col*WCANVASBLOCKW;
					drect.left+=skip;
					drect.right=drect.left+rect.right-rect.left;
//					lpDDSPrimary->BltFast(Canvas->WBitmap::GetW()-split_x+skip+x,y,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				}
			}
		}
		if (Canvas->GetH()>height) {
			if (width>0) {
				rect.top=0,rect.bottom=Canvas->GetH()-height;
				rect.left=split_x,rect.right=MIN(split_x+width,left_col*WCANVASBLOCKW);
				drect.top=y+Canvas->WBitmap::GetH()-split_y;
				drect.left=x;
				drect.bottom=drect.top+rect.bottom-rect.top;
				drect.right=x+rect.right-rect.left;
				if (rect.left<rect.right) {
					skip=rect.right-rect.left;
//					lpDDSPrimary->BltFast(x,y+Canvas->WBitmap::GetH()-split_y,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				}
				else skip=0;
				rect.left=MAX(0,split_x-left_col*WCANVASBLOCKW),rect.right=split_x+width-left_col*WCANVASBLOCKW;
				if (rect.left<rect.right) {
					drect.left+=skip;
					drect.right=drect.left+rect.right-rect.left;
//					lpDDSPrimary->BltFast(skip+x,y+Canvas->WBitmap::GetH()-split_y,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);
				}
			}
			if (Canvas->GetW()>width) {
				rect.top=0,rect.bottom=Canvas->GetH()-height;
				rect.left=0,rect.right=MIN(Canvas->GetW()-width,left_col*WCANVASBLOCKW);
				skip=rect.right-rect.left;
				drect.left=x+Canvas->WBitmap::GetW()-split_x;
				drect.right=drect.left+rect.right-rect.left;
				drect.top=y+Canvas->WBitmap::GetH()-split_y;
				drect.bottom=drect.top+rect.bottom-rect.top;

//				lpDDSPrimary->BltFast(x+Canvas->WBitmap::GetW()-split_x,y+Canvas->WBitmap::GetH()-split_y,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
				lpDDSPrimary->Blt(&drect,lpDDSBackLeft,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);

				if (rect.right<Canvas->GetW()-width) {
					rect.right=Canvas->GetW()-width-left_col*WCANVASBLOCKW;
					drect.left+=skip;
					drect.right=drect.left+rect.right-rect.left;
//					lpDDSPrimary->BltFast(x+Canvas->WBitmap::GetW()-split_x+skip,y+Canvas->WBitmap::GetH()-split_y,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLTFAST_WAIT);
					lpDDSPrimary->Blt(&drect,lpDDSBackRight,&rect,DDBLTFAST_NOCOLORKEY|DDBLT_WAIT,0);

				}
			}
		}
	}

	WSERR r=WS_OK;
	if (bError && hr==DDERR_SURFACELOST) {
		r=RestoreSurface();
	}
	Canvas->NextFrame();
	return r;
}