// --------------------------------------------------------------------------- // 描画 // 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(); } }
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; }