//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: ddsurface4obj.cpp // //-------------------------------------------------------------------------- // ddSurfaceObj.cpp : Implementation of CDirectApp and DLL registration. #include "stdafx.h" #include "stdio.h" #include "Direct.h" #include "dms.h" #include "dDraw4Obj.h" #include "ddClipperObj.h" #include "ddSurface4Obj.h" #include "ddPaletteObj.h" C_dxj_DirectDrawSurface4Object::C_dxj_DirectDrawSurface4Object(){ m__dxj_DirectDrawSurface4= NULL; parent = NULL; pinterface = NULL; nextobj = g_dxj_DirectDrawSurface4; creationid = ++g_creationcount; DPF1(1,"Constructor Creation Surface7 [%d] \n",g_creationcount); g_dxj_DirectDrawSurface4 = (void *)this; _dxj_DirectDrawSurface4Lock=NULL; m_bLocked=FALSE; m_drawStyle = 0; //solid lines are default for DDraw m_fillStyle = 1; //transparent fill is default since DDRaw has no selected Brush m_fFontTransparent = TRUE; m_fFillTransparent = TRUE; m_fFillSolid=TRUE; m_foreColor = 0; //black is the default color. m_fontBackColor=-1; //white m_drawWidth = 1; m_hPen = NULL; m_hBrush = NULL; m_hFont=NULL; m_pIFont=NULL; m_bLockedArray=FALSE; m_ppSA=NULL; setFillStyle(1); //transparent } DWORD C_dxj_DirectDrawSurface4Object::InternalAddRef(){ DWORD i; i=CComObjectRoot::InternalAddRef(); DPF2(1,"Surf7 [%d] AddRef %d \n",creationid,i); return i; } DWORD C_dxj_DirectDrawSurface4Object::InternalRelease(){ DWORD i; i=CComObjectRoot::InternalRelease(); DPF2(1,"Surf4 [%d] Release %d \n",creationid,i); return i; } C_dxj_DirectDrawSurface4Object::~C_dxj_DirectDrawSurface4Object() { C_dxj_DirectDrawSurface4Object *prev=NULL; for(C_dxj_DirectDrawSurface4Object *ptr=(C_dxj_DirectDrawSurface4Object *)g_dxj_DirectDrawSurface4; ptr; ptr=(C_dxj_DirectDrawSurface4Object *)ptr->nextobj) { if(ptr == this) { if(prev) prev->nextobj = ptr->nextobj; else g_dxj_DirectDrawSurface4 = (void*)ptr->nextobj; break; } prev = ptr; } if(m__dxj_DirectDrawSurface4){ int count = IUNK(m__dxj_DirectDrawSurface4)->Release(); DPF1(1,"DirectX IDirectDrawSurface4 Ref count [%d]",count); if(count==0) m__dxj_DirectDrawSurface4 = NULL; } if(parent) IUNK(parent)->Release(); if (m_hFont) DeleteObject (m_hFont); if (m_hPen) DeleteObject (m_hPen); if (m_hBrush) DeleteObject (m_hBrush); if (m_pIFont) m_pIFont->Release(); } GETSET_OBJECT(_dxj_DirectDrawSurface4); RETURN_NEW_ITEM_R(_dxj_DirectDrawSurface4, getPalette, GetPalette, _dxj_DirectDrawPalette) GET_DIRECT_R(_dxj_DirectDrawSurface4, isLost, IsLost, long) GET_DIRECT1_R(_dxj_DirectDrawSurface4, getBltStatus, GetBltStatus, long, long) GET_DIRECT1_R(_dxj_DirectDrawSurface4, getFlipStatus, GetFlipStatus, long, long) STDMETHODIMP C_dxj_DirectDrawSurface4Object::addAttachedSurface(I_dxj_DirectDrawSurface4 *s3) { HRESULT hr; IDirectDrawSurface4 *realsurf=NULL; if (s3) s3->InternalGetObject((IUnknown**)&realsurf); if (m__dxj_DirectDrawSurface4 == NULL) return E_FAIL; hr=m__dxj_DirectDrawSurface4->AddAttachedSurface(realsurf); return hr; } PASS_THROUGH_CAST_1_R(_dxj_DirectDrawSurface4,releaseDC,ReleaseDC,long,(HDC )) PASS_THROUGH_CAST_2_R(_dxj_DirectDrawSurface4,setColorKey,SetColorKey,long,(long),DDColorKey *,(LPDDCOLORKEY)) PASS_THROUGH_CAST_2_R(_dxj_DirectDrawSurface4,getColorKey,GetColorKey,long,(long),DDColorKey *,(LPDDCOLORKEY)) STDMETHODIMP C_dxj_DirectDrawSurface4Object::getDC(long *hdc) { return m__dxj_DirectDrawSurface4->GetDC((HDC*)hdc); } STDMETHODIMP C_dxj_DirectDrawSurface4Object::lock( Rect *r, DDSurfaceDesc2 *desc, long flags, Handle hnd) { if (m_bLocked) return E_FAIL; HRESULT hr; CopyInDDSurfaceDesc2(&m_ddsd,desc); hr = m__dxj_DirectDrawSurface4->Lock(NULL,&m_ddsd,(DWORD)flags,(void*)hnd); if FAILED(hr) return hr; CopyOutDDSurfaceDesc2(desc,&m_ddsd); m_bLocked=TRUE; m_nPixelBytes=m_ddsd.ddpfPixelFormat.dwRGBBitCount/8; return hr; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::unlock( Rect *r) { HRESULT hr; //__try { if (m_bLockedArray) { *m_ppSA=NULL; m_bLockedArray=FALSE; } //hr = m__dxj_DirectDrawSurface4->Unlock((RECT*)r); hr = m__dxj_DirectDrawSurface4->Unlock(NULL); if FAILED(hr) return hr ; m_bLocked=FALSE; return hr; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::setLockedPixel( int x, int y, long col) { if (!m_bLocked) return E_FAIL; //__try { char *pByte= (char*)((char*)m_ddsd.lpSurface+x*m_nPixelBytes+y*m_ddsd.lPitch); if (m_nPixelBytes==2){ *((WORD*)pByte)=(WORD)col; } else if (m_nPixelBytes==4){ *((DWORD*)pByte)=(DWORD)col; } else if (m_nPixelBytes==1){ *pByte=(Byte)col; } else if (m_nPixelBytes==3){ *(pByte)= (char)(col & 0xFF); pByte++; *(pByte)= (char)((col & 0xFF00)>>8); pByte++; *(pByte)= (char)((col & 0xFF0000)>>16); } else{ return E_FAIL; } //} //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::getLockedPixel( int x, int y, long *col) { //__try { char *pByte= (char*)((char*)m_ddsd.lpSurface+x*m_nPixelBytes+y*m_ddsd.lPitch); if (m_nPixelBytes==2){ *col=(long) *((WORD*)pByte); } else if (m_nPixelBytes==4){ *col=(long) *((DWORD*)pByte); } else if (m_nPixelBytes==3){ *col=(long) (*((DWORD*)pByte))& 0x00FFFFFF; } else if (m_nPixelBytes==1){ *col=(long) *((long*)pByte); } else{ return E_FAIL; } //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::getClipper( I_dxj_DirectDrawClipper **val) { LPDIRECTDRAWCLIPPER ddc; HRESULT hr=DD_OK; if( (hr=m__dxj_DirectDrawSurface4->GetClipper( &ddc)) != DD_OK ) return hr; INTERNAL_CREATE(_dxj_DirectDrawClipper, ddc, val); return S_OK; } ///////////////////////////////////////////////////////////////////////////// // this is NOT the normal Blt, that is BltFx in our interface // STDMETHODIMP C_dxj_DirectDrawSurface4Object::blt( Rect *pDest, I_dxj_DirectDrawSurface4 *ddS, Rect *pSrc, long flags, long *status) { LPDIRECTDRAWSURFACE4 lpdds = NULL; LPRECT prcDest=(LPRECT)pDest; LPRECT prcSrc =(LPRECT)pSrc; if (!ddS ) return E_INVALIDARG; ddS->InternalGetObject((IUnknown **)(&lpdds)); //allow user to pass uninitialed structure down to represent bitting to the whole surface if ((prcDest) && (!prcDest->left) && (!prcDest->right) && (!prcDest->bottom) && (!prcDest->top)) prcDest=NULL; //allow user to pass uninitialed structure down to represent bitting from the whole surface if ((prcSrc) && (!prcSrc->left) && (!prcSrc->right) && (!prcSrc->bottom) && (!prcSrc->top)) prcSrc=NULL; //__try { *status = m__dxj_DirectDrawSurface4->Blt(prcDest, lpdds, prcSrc, flags, NULL); //} //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::bltFx(Rect *pDest, I_dxj_DirectDrawSurface4 *ddS, Rect *pSrc, long flags, DDBltFx *bltfx, long *status ) { LPRECT prcDest=(LPRECT)pDest; LPRECT prcSrc= (LPRECT)pSrc; LPDIRECTDRAWSURFACE4 lpdds = NULL; if ( !ddS ) return E_INVALIDARG; ddS->InternalGetObject((IUnknown **)(&lpdds)); if(bltfx) bltfx->lSize = sizeof(DDBLTFX); //allow user to pass uninitialed structure down to represent bitting to the whole surface if ((prcDest) && (!prcDest->left) && (!prcDest->right) && (!prcDest->bottom) && (!prcDest->top)) prcDest=NULL; //allow user to pass uninitialed structure down to represent bitting from the whole surface if ((prcSrc) && (!prcSrc->left) && (!prcSrc->right) && (!prcSrc->bottom) && (!prcSrc->top)) prcSrc=NULL; //__try { *status = m__dxj_DirectDrawSurface4->Blt(prcDest, lpdds, prcSrc, flags, (struct _DDBLTFX *)bltfx); //} //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::bltColorFill( Rect *pDest, long fillvalue, long *status ) { HWnd hWnd = NULL; DDBLTFX bltfx; memset(&bltfx,0,sizeof(DDBLTFX)); bltfx.dwSize = sizeof(DDBLTFX); bltfx.dwFillColor = (DWORD)fillvalue; LPRECT prcDest=(LPRECT)pDest; //allow user to pass uninitialed structure down to represent bitting to the whole surface if ((prcDest) && (!prcDest->left) && (!prcDest->right) && (!prcDest->bottom) && (!prcDest->top)) prcDest=NULL; //__try { *status = m__dxj_DirectDrawSurface4->Blt(prcDest, NULL, NULL, DDBLT_WAIT | DDBLT_COLORFILL, &bltfx); //} //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::bltFast( long dx, long dy, I_dxj_DirectDrawSurface4 *dds, Rect *src, long trans, long *status) { if (!dds) return E_INVALIDARG; DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE4,lpdds,dds) LPRECT prcSrc=(LPRECT)src; if (!src) return E_INVALIDARG; //allow user to pass uninitialed structure down to represent bitting from the whole surface if ((prcSrc) && (!prcSrc->left) && (!prcSrc->right) && (!prcSrc->bottom) && (!prcSrc->top)) prcSrc=NULL; //__try { *status = m__dxj_DirectDrawSurface4->BltFast(dx, dy, lpdds, prcSrc, trans); //} //__except(1,1){ // return E_INVALIDARG; //} return S_OK; } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::deleteAttachedSurface( I_dxj_DirectDrawSurface4 *dds) { DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE4, lpdds, dds) return m__dxj_DirectDrawSurface4->DeleteAttachedSurface(0, lpdds); } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::flip( I_dxj_DirectDrawSurface4 *dds, long flags) { DO_GETOBJECT_NOTNULL(LPDIRECTDRAWSURFACE4,lpdds,dds) return m__dxj_DirectDrawSurface4->Flip(lpdds, flags); } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::getAttachedSurface( DDSCaps2 *caps, I_dxj_DirectDrawSurface4 **dds) { LPDIRECTDRAWSURFACE4 lpdds; HRESULT hr=DD_OK; if( (hr=m__dxj_DirectDrawSurface4->GetAttachedSurface( (DDSCAPS2*)caps, &lpdds)) != S_OK ) return hr; INTERNAL_CREATE(_dxj_DirectDrawSurface4, lpdds, dds); return S_OK; } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::getCaps( DDSCaps2 *caps) { HRESULT hr=DD_OK; if( (hr=m__dxj_DirectDrawSurface4->GetCaps((DDSCAPS2*)caps)) != S_OK) return hr; return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::getPixelFormat( DDPixelFormat *pf) { HRESULT hr=DD_OK; DDPIXELFORMAT ddpf; ddpf.dwSize = sizeof(DDPIXELFORMAT); if( (hr=m__dxj_DirectDrawSurface4->GetPixelFormat(&ddpf)) != S_OK) return hr; CopyOutDDPixelFormat(pf,&ddpf); return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::getSurfaceDesc( DDSurfaceDesc2 *desc) { desc->lpSurface = NULL; HRESULT hr=DD_OK; DDSURFACEDESC2 ddsd; ddsd.dwSize=sizeof(DDSURFACEDESC2); ddsd.ddpfPixelFormat.dwSize=sizeof(DDPIXELFORMAT); ddsd.lpSurface=NULL; if( (hr=m__dxj_DirectDrawSurface4->GetSurfaceDesc( &ddsd )) != S_OK ) return hr; CopyOutDDSurfaceDesc2(desc,&ddsd); return S_OK; } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::restore() { return m__dxj_DirectDrawSurface4->Restore(); } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::setPalette( I_dxj_DirectDrawPalette *ddp) { // // ignore the return value here. Will only work on 256 colours anyway! // DO_GETOBJECT_NOTNULL(LPDIRECTDRAWPALETTE,lpddp,ddp) return m__dxj_DirectDrawSurface4->SetPalette(lpddp); } ///////////////////////////////////////////////////////////////////////////// // STDMETHODIMP C_dxj_DirectDrawSurface4Object::getDirectDraw( I_dxj_DirectDraw4 **val) { IUnknown *pUnk=NULL; LPDIRECTDRAW4 lpdd; HRESULT hr=DD_OK; if( (hr=m__dxj_DirectDrawSurface4->GetDDInterface((void **)&pUnk)) != S_OK) return hr; hr=pUnk->QueryInterface(IID_IDirectDraw4,(void**)&lpdd); if FAILED(hr) { if (pUnk) pUnk->Release(); return hr; } INTERNAL_CREATE(_dxj_DirectDraw4, lpdd, val); return S_OK; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::setClipper(I_dxj_DirectDrawClipper *val) { DO_GETOBJECT_NOTNULL(LPDIRECTDRAWCLIPPER, lpc, val); HRESULT hr=DD_OK; hr=m__dxj_DirectDrawSurface4->SetClipper( lpc); return hr; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::changeUniquenessValue() { HRESULT hr=DD_OK; hr=m__dxj_DirectDrawSurface4->ChangeUniquenessValue(); return hr; } ///////////////////////////////////////////////////////////////////////////// STDMETHODIMP C_dxj_DirectDrawSurface4Object::getUniquenessValue(long *ret) { HRESULT hr=DD_OK; hr=m__dxj_DirectDrawSurface4->GetUniquenessValue((DWORD*)ret); return hr; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::setFont( /* [in] */ IFont __RPC_FAR *font) { HRESULT hr; if (!font) return E_INVALIDARG; if (m_pIFont) m_pIFont->Release(); m_pIFont=NULL; hr=font->Clone(&m_pIFont); return hr; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setFontTransparency(VARIANT_BOOL b) { m_fFontTransparent=(b!=VARIANT_FALSE); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getFontTransparency(VARIANT_BOOL *b) { if (m_fFontTransparent) *b= VARIANT_TRUE; else *b= VARIANT_FALSE; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setDrawWidth( long drawWidth) { HPEN hNewPen=NULL; if (drawWidth < 1) return E_INVALIDARG; m_drawWidth=drawWidth; hNewPen = CreatePen(m_drawStyle, m_drawWidth, m_foreColor); if (!hNewPen) return E_INVALIDARG; DeleteObject(m_hPen); m_hPen=hNewPen; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getDrawWidth(long *val) { *val=m_drawWidth; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setDrawStyle(long drawStyle) { HPEN hNewPen=NULL; m_drawStyle=drawStyle; hNewPen = CreatePen(m_drawStyle, m_drawWidth, m_foreColor); if (!hNewPen) return E_INVALIDARG; DeleteObject(m_hPen); m_hPen=hNewPen; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getDrawStyle(long __RPC_FAR *val) { *val=m_drawStyle; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setFillStyle(long fillStyle) { HBRUSH hNewBrush=NULL; BOOL fillTransparent =m_fFillTransparent; BOOL fillSolid=m_fFillSolid; long fillStyle2=fillStyle; m_fillStyle = fillStyle; m_fFillTransparent = FALSE; m_fFillSolid = FALSE; switch(fillStyle){ case 6: //vbCross: m_fillStyleHS = HS_CROSS; break; case 7: //vbDiagonalCross: m_fillStyleHS = HS_DIAGCROSS; break; case 5: //vbxDownwardDiagonal: m_fillStyleHS = HS_BDIAGONAL; break; case 2: //vbHorizontalLine: m_fillStyleHS = HS_HORIZONTAL; break; case 4: //vbUpwardDiagonal: m_fillStyleHS = HS_FDIAGONAL; break; case 3: //vbVerticalLine: m_fillStyleHS = HS_VERTICAL; break; case 0: ///vbFSSolid: m_fFillSolid = TRUE; break; case 1: //vbFSTransparent: m_fFillTransparent = TRUE; m_fFillSolid = TRUE; break; default: m_fFillTransparent = fillTransparent; m_fFillSolid = fillSolid; m_fillStyle=fillStyle2; return E_INVALIDARG; } if (m_fFillTransparent) { LOGBRUSH logb; logb.lbStyle = BS_NULL; hNewBrush = CreateBrushIndirect(&logb); } else if (m_fFillSolid) { hNewBrush = CreateSolidBrush(m_fillColor); } else { hNewBrush = CreateHatchBrush(m_fillStyleHS, m_fillColor); } if (!hNewBrush) return E_FAIL; if (m_hBrush) DeleteObject(m_hBrush); m_hBrush=hNewBrush; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getFillStyle(long *val) { *val=m_fillStyle; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setFillColor(long c) { m_fillColor = c; HBRUSH hNewBrush; if (m_fFillSolid){ hNewBrush= CreateSolidBrush(m_fillColor); } else { hNewBrush= CreateHatchBrush(m_fillStyleHS, m_fillColor); } if (!hNewBrush) return E_INVALIDARG; if (m_hBrush) DeleteObject(m_hBrush); m_hBrush=hNewBrush; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getFillColor(long *val) { *val=m_fillColor; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setForeColor( long color) { m_foreColor=color; HPEN hNewPen=NULL; hNewPen = CreatePen(m_drawStyle, m_drawWidth, m_foreColor); if (!hNewPen) return E_INVALIDARG; if (m_hPen) DeleteObject (m_hPen); m_hPen=hNewPen; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getForeColor(long *val) { *val=m_foreColor; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawLine( /* [in] */ long x1, /* [in] */ long y1, /* [in] */ long x2, /* [in] */ long y2) { HDC hdc; HBRUSH oldbrush; HPEN oldpen; POINT points[2]; HRESULT hr; hr =m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; points[0].x = x1; points[0].y = y1; points[1].x = x2; points[1].y = y2; //CONSIDER: doing this when dc is set if (m_hPen) oldpen = (HPEN)SelectObject(hdc,m_hPen); if (m_hBrush) oldbrush = (HBRUSH)SelectObject(hdc,m_hBrush); Polyline(hdc, points, 2); //why do this.. //if (oldpen) SelectObject(hdc, oldpen); //if (oldbrush) SelectObject(hdc, oldbrush); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawBox( /* [in] */ long x1, /* [in] */ long y1, /* [in] */ long x2, /* [in] */ long y2) { HDC hdc; HBRUSH oldbrush; HPEN oldpen; HRESULT hr; hr= m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; //CONSIDER: doing this when dc is set if (m_hPen) oldpen = (HPEN)SelectObject(hdc,m_hPen); if (m_hBrush) oldbrush = (HBRUSH)SelectObject(hdc,m_hBrush); if (m_fFontTransparent){ SetBkMode (hdc, TRANSPARENT); } else { SetBkMode (hdc, OPAQUE); SetBkColor (hdc,(COLORREF)m_fontBackColor); } Rectangle(hdc, x1,y1,x2,y2); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawRoundedBox( /* [in] */ long x1, /* [in] */ long y1, /* [in] */ long x2, /* [in] */ long y2, /* [in] */ long rw, /* [in] */ long rh) { HDC hdc; HBRUSH oldbrush; HPEN oldpen; HRESULT hr; hr= m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; //CONSIDER: doing this when dc is set if (m_hPen) oldpen = (HPEN)SelectObject(hdc,m_hPen); if (m_hBrush) oldbrush = (HBRUSH)SelectObject(hdc,m_hBrush); if (m_fFontTransparent){ SetBkMode (hdc, TRANSPARENT); } else { SetBkMode (hdc, OPAQUE); SetBkColor (hdc,(COLORREF)m_fontBackColor); } RoundRect(hdc, x1,y1,x2,y2,rw,rh); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawEllipse( /* [in] */ long x1, /* [in] */ long y1, /* [in] */ long x2, /* [in] */ long y2) { HDC hdc; HBRUSH oldbrush; HPEN oldpen; HRESULT hr; hr=m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; //CONSIDER: doing this when dc is set if (m_hPen) oldpen = (HPEN)SelectObject(hdc,m_hPen); if (m_hBrush) oldbrush = (HBRUSH)SelectObject(hdc,m_hBrush); if (m_fFontTransparent){ SetBkMode (hdc, TRANSPARENT); } else { SetBkMode (hdc, OPAQUE); SetBkColor (hdc,(COLORREF)m_fontBackColor); } Ellipse(hdc, x1, y1, x2, y2); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawCircle( /* [in] */ long x, /* [in] */ long y, /* [in] */ long r) { HDC hdc; HBRUSH oldbrush; HPEN oldpen; HRESULT hr; long x1,y1,x2,y2; hr= m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; //CONSIDER: doing this when dc is set if (m_hPen) oldpen = (HPEN)SelectObject(hdc,m_hPen); if (m_hBrush) oldbrush = (HBRUSH)SelectObject(hdc,m_hBrush); if (m_fFontTransparent){ SetBkMode (hdc, TRANSPARENT); } else { SetBkMode (hdc, OPAQUE); SetBkColor (hdc,(COLORREF)m_fontBackColor); } x1 = x - r; x2 = x + r; y1 = y - r; y2 = y + r; Ellipse(hdc, x1, y1, x2, y2); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::drawText( /* [in] */ long x, /* [in] */ long y, /* [in] */ BSTR str, /* [in] */ VARIANT_BOOL b) { HDC hdc=NULL; HRESULT hr; DWORD len=0; UINT txtA; if (!str) return E_INVALIDARG; len = ((DWORD*)str)[-1]/2; hr=m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; if (m_fFontTransparent){ SetBkMode (hdc, TRANSPARENT); } else { SetBkMode (hdc, OPAQUE); SetBkColor (hdc,(COLORREF)m_fontBackColor); } SetTextColor(hdc, m_foreColor); txtA=GetTextAlign(hdc); if (b!=VARIANT_FALSE){ if (!(txtA & TA_UPDATECP)) SetTextAlign(hdc,txtA | TA_UPDATECP); } else { if (txtA & TA_UPDATECP) SetTextAlign(hdc,txtA-TA_UPDATECP); } if (m_pIFont) { HFONT hFont=NULL; m_pIFont->SetHdc(hdc); m_pIFont->get_hFont(&hFont); SelectObject (hdc, hFont); } ExtTextOutW(hdc, (int)x, (int)y, 0, 0, str, len, 0); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::bltToDC( /* [in] */ long hdcDest, /* [in] */ Rect __RPC_FAR *srcRect, /* [in] */ Rect __RPC_FAR *destRect) { HRESULT hr; BOOL b; HDC hdc=NULL; if (!srcRect) return E_INVALIDARG; if (!destRect) return E_INVALIDARG; hr=m__dxj_DirectDrawSurface4->GetDC(&hdc); if FAILED(hr) return hr; int nWidthDest= destRect->right-destRect->left; int nHeightDest=destRect->bottom-destRect->top; int nWidthSrc= srcRect->right-srcRect->left; int nHeightSrc=srcRect->bottom-srcRect->top; if ((0==srcRect->top) && (0==srcRect->left ) && (0==srcRect->top) &&(0==srcRect->bottom )) { DDSURFACEDESC2 desc; desc.dwSize=sizeof(DDSURFACEDESC2); m__dxj_DirectDrawSurface4->GetSurfaceDesc(&desc); nWidthSrc=desc.dwWidth; nHeightSrc=desc.dwHeight; } b=StretchBlt((HDC)hdcDest, destRect->left,destRect->top, nWidthDest, nHeightDest, hdc, srcRect->left,srcRect->top, nWidthSrc, nHeightSrc, SRCCOPY); m__dxj_DirectDrawSurface4->ReleaseDC(hdc); //CONSIDER: are we being presumptious that if blt fails its due to arg probs? if (!b) return E_INVALIDARG; return S_OK; } STDMETHODIMP C_dxj_DirectDrawSurface4Object::getLockedArray(SAFEARRAY **pArray) { if (!m_bLocked) return E_FAIL; if (!pArray) return E_INVALIDARG; if (*pArray) return E_INVALIDARG; m_ppSA=pArray; m_bLockedArray=TRUE; ZeroMemory(&m_saLockedArray,sizeof(SAFEARRAY)); m_saLockedArray.cbElements =1; m_saLockedArray.cDims =2; m_saLockedArray.rgsabound[0].lLbound =0; m_saLockedArray.rgsabound[0].cElements =m_ddsd.dwHeight; m_saLockedArray.rgsabound[1].lLbound =0; m_saLockedArray.rgsabound[1].cElements =m_ddsd.lPitch; m_saLockedArray.pvData =m_ddsd.lpSurface; *pArray=&m_saLockedArray; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::setFontBackColor( /* [in] */ long color) { m_fontBackColor=(DWORD)color; return S_OK; } HRESULT STDMETHODCALLTYPE C_dxj_DirectDrawSurface4Object::getFontBackColor( /* [in] */ long *color) { if (!color) return E_INVALIDARG; *color=(DWORD)m_fontBackColor; return S_OK; }