Windows2003-3790/multimedia/directx/dxvb/dx7vb/ddsurface4obj.cpp
2020-09-30 16:53:55 +02:00

1085 lines
30 KiB
C++

//+-------------------------------------------------------------------------
//
// 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;
}