Removed some direct accesses to the DC structure.

This commit is contained in:
Alexandre Julliard 2002-05-02 01:39:48 +00:00
parent acd1c14835
commit dec2cee2fb
17 changed files with 128 additions and 111 deletions

View File

@ -202,12 +202,3 @@ INT TTYDRV_GetDeviceCaps( TTYDRV_PDEVICE *physDev, INT cap )
return 0; return 0;
} }
} }
/***********************************************************************
* TTYDRV_DC_SetDeviceClipping
*/
void TTYDRV_DC_SetDeviceClipping(TTYDRV_PDEVICE *physDev)
{
TRACE("(%x)\n", physDev->hdc);
}

View File

@ -107,7 +107,6 @@ extern BOOL TTYDRV_DC_PolyPolygon(TTYDRV_PDEVICE *physDev, const POINT* pt, cons
extern BOOL TTYDRV_DC_PolyPolyline(TTYDRV_PDEVICE *physDev, const POINT* pt, const DWORD* counts, DWORD polylines); extern BOOL TTYDRV_DC_PolyPolyline(TTYDRV_PDEVICE *physDev, const POINT* pt, const DWORD* counts, DWORD polylines);
extern BOOL TTYDRV_DC_Rectangle(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom); extern BOOL TTYDRV_DC_Rectangle(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom);
extern BOOL TTYDRV_DC_RoundRect(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height); extern BOOL TTYDRV_DC_RoundRect(TTYDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom, INT ell_width, INT ell_height);
extern void TTYDRV_DC_SetDeviceClipping(TTYDRV_PDEVICE *physDev);
extern COLORREF TTYDRV_DC_SetPixel(TTYDRV_PDEVICE *physDev, INT x, INT y, COLORREF color); extern COLORREF TTYDRV_DC_SetPixel(TTYDRV_PDEVICE *physDev, INT x, INT y, COLORREF color);
extern BOOL TTYDRV_DC_StretchBlt(TTYDRV_PDEVICE *physDevDst, INT xDst, INT yDst, INT widthDst, INT heightDst, TTYDRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop); extern BOOL TTYDRV_DC_StretchBlt(TTYDRV_PDEVICE *physDevDst, INT xDst, INT yDst, INT widthDst, INT heightDst, TTYDRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc, DWORD rop);
INT TTYDRV_DC_SetDIBitsToDevice(TTYDRV_PDEVICE *physDev, INT xDest, INT yDest, DWORD cx, DWORD cy, INT xSrc, INT ySrc, UINT startscan, UINT lines, LPCVOID bits, const BITMAPINFO *info, UINT coloruse); INT TTYDRV_DC_SetDIBitsToDevice(TTYDRV_PDEVICE *physDev, INT xDest, INT yDest, DWORD cx, DWORD cy, INT xSrc, INT ySrc, UINT startscan, UINT lines, LPCVOID bits, const BITMAPINFO *info, UINT coloruse);

View File

@ -40,7 +40,6 @@ debug_channels (ttydrv)
@ cdecl SelectBitmap(ptr long) TTYDRV_SelectBitmap @ cdecl SelectBitmap(ptr long) TTYDRV_SelectBitmap
@ cdecl SelectFont(ptr long) TTYDRV_SelectFont @ cdecl SelectFont(ptr long) TTYDRV_SelectFont
@ cdecl SetDIBitsToDevice(ptr long long long long long long long long ptr ptr long) TTYDRV_DC_SetDIBitsToDevice @ cdecl SetDIBitsToDevice(ptr long long long long long long long long ptr ptr long) TTYDRV_DC_SetDIBitsToDevice
@ cdecl SetDeviceClipping(ptr) TTYDRV_DC_SetDeviceClipping
@ cdecl SetPixel(ptr long long long) TTYDRV_DC_SetPixel @ cdecl SetPixel(ptr long long long) TTYDRV_DC_SetPixel
@ cdecl StretchBlt(ptr long long long long ptr long long long long long) TTYDRV_DC_StretchBlt @ cdecl StretchBlt(ptr long long long long ptr long long long long long) TTYDRV_DC_StretchBlt

View File

@ -18,7 +18,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "gdi.h"
#include "psdrv.h" #include "psdrv.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "winbase.h" #include "winbase.h"
@ -32,13 +31,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
*/ */
BOOL PSDRV_PatBlt(PSDRV_PDEVICE *physDev, INT x, INT y, INT width, INT height, DWORD dwRop) BOOL PSDRV_PatBlt(PSDRV_PDEVICE *physDev, INT x, INT y, INT width, INT height, DWORD dwRop)
{ {
DC *dc = physDev->dc; POINT pt[2];
pt[0].x = x;
pt[0].y = y;
pt[1].x = x + width;
pt[1].y = y + height;
LPtoDP( physDev->hdc, pt, 2 );
switch(dwRop) { switch(dwRop) {
case PATCOPY: case PATCOPY:
PSDRV_WriteGSave(physDev); PSDRV_WriteGSave(physDev);
PSDRV_WriteRectangle(physDev, XLPTODP(dc, x), YLPTODP(dc, y), PSDRV_WriteRectangle(physDev, pt[0].x, pt[0].y, pt[1].x - pt[0].x, pt[1].y - pt[0].y );
XLSTODS(dc, width), YLSTODS(dc, height));
PSDRV_Brush(physDev, FALSE); PSDRV_Brush(physDev, FALSE);
PSDRV_WriteGRestore(physDev); PSDRV_WriteGRestore(physDev);
return TRUE; return TRUE;
@ -49,8 +53,7 @@ BOOL PSDRV_PatBlt(PSDRV_PDEVICE *physDev, INT x, INT y, INT width, INT height, D
PSCOLOR pscol; PSCOLOR pscol;
PSDRV_WriteGSave(physDev); PSDRV_WriteGSave(physDev);
PSDRV_WriteRectangle(physDev, XLPTODP(dc, x), YLPTODP(dc, y), PSDRV_WriteRectangle(physDev, pt[0].x, pt[0].y, pt[1].x - pt[0].x, pt[1].y - pt[0].y );
XLSTODS(dc, width), YLSTODS(dc, height));
PSDRV_CreateColor( physDev, &pscol, (dwRop == BLACKNESS) ? PSDRV_CreateColor( physDev, &pscol, (dwRop == BLACKNESS) ?
RGB(0,0,0) : RGB(0xff,0xff,0xff) ); RGB(0,0,0) : RGB(0xff,0xff,0xff) );
PSDRV_WriteSetColor(physDev, &pscol); PSDRV_WriteSetColor(physDev, &pscol);

View File

@ -171,7 +171,7 @@ INT PSDRV_StretchDIBits( PSDRV_PDEVICE *physDev, INT xDst, INT yDst, INT widthDs
WORD bpp, compression; WORD bpp, compression;
const char *ptr; const char *ptr;
INT line; INT line;
DC *dc = physDev->dc; POINT pt[2];
TRACE("%08x (%d,%d %dx%d) -> (%d,%d %dx%d)\n", physDev->hdc, TRACE("%08x (%d,%d %dx%d) -> (%d,%d %dx%d)\n", physDev->hdc,
xSrc, ySrc, widthSrc, heightSrc, xDst, yDst, widthDst, heightDst); xSrc, ySrc, widthSrc, heightSrc, xDst, yDst, widthDst, heightDst);
@ -189,10 +189,15 @@ INT PSDRV_StretchDIBits( PSDRV_PDEVICE *physDev, INT xDst, INT yDst, INT widthDs
return FALSE; return FALSE;
} }
xDst = XLPTODP(dc, xDst); pt[0].x = xDst;
yDst = YLPTODP(dc, yDst); pt[0].y = yDst;
widthDst = XLSTODS(dc, widthDst); pt[1].x = xDst + widthDst;
heightDst = YLSTODS(dc, heightDst); pt[1].y = yDst + heightDst;
LPtoDP( physDev->hdc, pt, 2 );
xDst = pt[0].x;
yDst = pt[0].y;
widthDst = pt[1].x - pt[0].x;
heightDst = pt[1].y - pt[0].y;
switch(bpp) { switch(bpp) {

View File

@ -18,7 +18,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "gdi.h"
#include "psdrv.h" #include "psdrv.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "winbase.h" #include "winbase.h"
@ -28,21 +27,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
/*********************************************************************** /***********************************************************************
* PSDRV_SetDeviceClipping * PSDRV_SetDeviceClipping
*/ */
VOID PSDRV_SetDeviceClipping( PSDRV_PDEVICE *physDev ) VOID PSDRV_SetDeviceClipping( PSDRV_PDEVICE *physDev, HRGN hrgn )
{ {
CHAR szArrayName[] = "clippath"; CHAR szArrayName[] = "clippath";
DWORD size; DWORD size;
RGNDATA *rgndata; RGNDATA *rgndata;
DC *dc = physDev->dc;
TRACE("hdc=%04x\n", physDev->hdc); TRACE("hdc=%04x\n", physDev->hdc);
if (dc->hGCClipRgn == 0) { size = GetRegionData(hrgn, 0, NULL);
ERR("Rgn is 0. Please report this.\n");
return;
}
size = GetRegionData(dc->hGCClipRgn, 0, NULL);
if(!size) { if(!size) {
ERR("Invalid region\n"); ERR("Invalid region\n");
return; return;
@ -54,7 +47,7 @@ VOID PSDRV_SetDeviceClipping( PSDRV_PDEVICE *physDev )
return; return;
} }
GetRegionData(dc->hGCClipRgn, size, rgndata); GetRegionData(hrgn, size, rgndata);
PSDRV_WriteInitClip(physDev); PSDRV_WriteInitClip(physDev);

View File

@ -20,6 +20,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> /* for bsearch() */ #include <stdlib.h> /* for bsearch() */
#include "winspool.h" #include "winspool.h"
#include "gdi.h"
#include "psdrv.h" #include "psdrv.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "winerror.h" #include "winerror.h"

View File

@ -40,15 +40,18 @@ WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
*/ */
BOOL PSDRV_LineTo(PSDRV_PDEVICE *physDev, INT x, INT y) BOOL PSDRV_LineTo(PSDRV_PDEVICE *physDev, INT x, INT y)
{ {
DC *dc = physDev->dc; POINT pt[2];
TRACE("%d %d\n", x, y); TRACE("%d %d\n", x, y);
GetCurrentPositionEx( physDev->hdc, pt );
pt[1].x = x;
pt[1].y = y;
LPtoDP( physDev->hdc, pt, 2 );
PSDRV_SetPen(physDev); PSDRV_SetPen(physDev);
PSDRV_WriteMoveTo(physDev, INTERNAL_XWPTODP(dc, dc->CursPosX, dc->CursPosY), PSDRV_WriteMoveTo(physDev, pt[0].x, pt[0].y );
INTERNAL_YWPTODP(dc, dc->CursPosX, dc->CursPosY)); PSDRV_WriteLineTo(physDev, pt[1].x, pt[1].y );
PSDRV_WriteLineTo(physDev, INTERNAL_XWPTODP(dc, x, y),
INTERNAL_YWPTODP(dc, x, y));
PSDRV_DrawLine(physDev); PSDRV_DrawLine(physDev);
return TRUE; return TRUE;
@ -60,15 +63,18 @@ BOOL PSDRV_LineTo(PSDRV_PDEVICE *physDev, INT x, INT y)
*/ */
BOOL PSDRV_Rectangle( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom ) BOOL PSDRV_Rectangle( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom )
{ {
INT width; RECT rect;
INT height;
DC *dc = physDev->dc;
TRACE("%d %d - %d %d\n", left, top, right, bottom); TRACE("%d %d - %d %d\n", left, top, right, bottom);
width = INTERNAL_XWSTODS(dc, right - left);
height = INTERNAL_YWSTODS(dc, bottom - top); rect.left = left;
PSDRV_WriteRectangle(physDev, INTERNAL_XWPTODP(dc, left, top), rect.top = top;
INTERNAL_YWPTODP(dc, left, top), width, height); rect.right = right;
rect.bottom = bottom;
LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
PSDRV_WriteRectangle(physDev, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top );
PSDRV_Brush(physDev,0); PSDRV_Brush(physDev,0);
PSDRV_SetPen(physDev); PSDRV_SetPen(physDev);
PSDRV_DrawLine(physDev); PSDRV_DrawLine(physDev);
@ -82,20 +88,29 @@ BOOL PSDRV_Rectangle( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT
BOOL PSDRV_RoundRect( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, BOOL PSDRV_RoundRect( PSDRV_PDEVICE *physDev, INT left, INT top, INT right,
INT bottom, INT ell_width, INT ell_height ) INT bottom, INT ell_width, INT ell_height )
{ {
DC *dc = physDev->dc; RECT rect[2];
left = XLPTODP( dc, left ); rect[0].left = left;
right = XLPTODP( dc, right ); rect[0].top = top;
top = YLPTODP( dc, top ); rect[0].right = right;
bottom = YLPTODP( dc, bottom ); rect[0].bottom = bottom;
ell_width = XLSTODS( dc, ell_width ); rect[1].left = 0;
ell_height = YLSTODS( dc, ell_height ); rect[1].top = 0;
rect[1].right = ell_width;
rect[1].bottom = ell_height;
LPtoDP( physDev->hdc, (POINT *)rect, 4 );
if( left > right ) { INT tmp = left; left = right; right = tmp; } left = rect[0].left;
if( top > bottom ) { INT tmp = top; top = bottom; bottom = tmp; } top = rect[0].top;
right = rect[0].right;
bottom = rect[0].bottom;
if (left > right) { INT tmp = left; left = right; right = tmp; }
if (top > bottom) { INT tmp = top; top = bottom; bottom = tmp; }
if(ell_width > right - left) ell_width = right - left; ell_width = rect[1].right - rect[1].left;
if(ell_height > bottom - top) ell_height = bottom - top; ell_height = rect[1].bottom - rect[1].top;
if (ell_width > right - left) ell_width = right - left;
if (ell_height > bottom - top) ell_height = bottom - top;
PSDRV_WriteMoveTo( physDev, left, top + ell_height/2 ); PSDRV_WriteMoveTo( physDev, left, top + ell_height/2 );
PSDRV_WriteArc( physDev, left + ell_width/2, top + ell_height/2, ell_width, PSDRV_WriteArc( physDev, left + ell_width/2, top + ell_height/2, ell_width,
@ -126,15 +141,20 @@ static BOOL PSDRV_DrawArc( PSDRV_PDEVICE *physDev, INT left, INT top,
INT right, INT bottom, INT xstart, INT ystart, INT right, INT bottom, INT xstart, INT ystart,
INT xend, INT yend, int lines ) INT xend, INT yend, int lines )
{ {
DC *dc = physDev->dc;
INT x, y, h, w; INT x, y, h, w;
double start_angle, end_angle, ratio; double start_angle, end_angle, ratio;
RECT rect;
x = XLPTODP(dc, (left + right)/2); rect.left = left;
y = YLPTODP(dc, (top + bottom)/2); rect.top = top;
rect.right = right;
rect.bottom = bottom;
LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
w = XLSTODS(dc, (right - left)); x = (rect.left + rect.right) / 2;
h = YLSTODS(dc, (bottom - top)); y = (rect.top + rect.bottom) / 2;
w = rect.right - rect.left;
h = rect.bottom - rect.top;
if(w < 0) w = -w; if(w < 0) w = -w;
if(h < 0) h = -h; if(h < 0) h = -h;
@ -200,15 +220,20 @@ BOOL PSDRV_Pie( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom
BOOL PSDRV_Ellipse( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom) BOOL PSDRV_Ellipse( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bottom)
{ {
INT x, y, w, h; INT x, y, w, h;
DC *dc = physDev->dc; RECT rect;
TRACE("%d %d - %d %d\n", left, top, right, bottom); TRACE("%d %d - %d %d\n", left, top, right, bottom);
x = XLPTODP(dc, (left + right)/2); rect.left = left;
y = YLPTODP(dc, (top + bottom)/2); rect.top = top;
rect.right = right;
rect.bottom = bottom;
LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
w = XLSTODS(dc, (right - left)); x = (rect.left + rect.right) / 2;
h = YLSTODS(dc, (bottom - top)); y = (rect.top + rect.bottom) / 2;
w = rect.right - rect.left;
h = rect.bottom - rect.top;
PSDRV_WriteNewPath(physDev); PSDRV_WriteNewPath(physDev);
PSDRV_WriteArc(physDev, x, y, w, h, 0.0, 360.0); PSDRV_WriteArc(physDev, x, y, w, h, 0.0, 360.0);
@ -224,27 +249,30 @@ BOOL PSDRV_Ellipse( PSDRV_PDEVICE *physDev, INT left, INT top, INT right, INT bo
* PSDRV_PolyPolyline * PSDRV_PolyPolyline
*/ */
BOOL PSDRV_PolyPolyline( PSDRV_PDEVICE *physDev, const POINT* pts, const DWORD* counts, BOOL PSDRV_PolyPolyline( PSDRV_PDEVICE *physDev, const POINT* pts, const DWORD* counts,
DWORD polylines ) DWORD polylines )
{ {
DWORD polyline, line; DWORD polyline, line, total;
const POINT* pt; POINT *dev_pts, *pt;
DC *dc = physDev->dc;
TRACE("\n"); TRACE("\n");
pt = pts; for (polyline = total = 0; polyline < polylines; polyline++) total += counts[polyline];
if (!(dev_pts = HeapAlloc( GetProcessHeap(), 0, total * sizeof(*dev_pts) ))) return FALSE;
memcpy( dev_pts, pts, total * sizeof(*dev_pts) );
LPtoDP( physDev->hdc, dev_pts, total );
pt = dev_pts;
for(polyline = 0; polyline < polylines; polyline++) { for(polyline = 0; polyline < polylines; polyline++) {
PSDRV_WriteMoveTo(physDev, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y)); PSDRV_WriteMoveTo(physDev, pt->x, pt->y);
pt++; pt++;
for(line = 1; line < counts[polyline]; line++) { for(line = 1; line < counts[polyline]; line++, pt++)
PSDRV_WriteLineTo(physDev, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y)); PSDRV_WriteLineTo(physDev, pt->x, pt->y);
pt++;
}
} }
HeapFree( GetProcessHeap(), 0, dev_pts );
PSDRV_SetPen(physDev); PSDRV_SetPen(physDev);
PSDRV_DrawLine(physDev); PSDRV_DrawLine(physDev);
return TRUE; return TRUE;
} }
/*********************************************************************** /***********************************************************************
@ -260,24 +288,27 @@ BOOL PSDRV_Polyline( PSDRV_PDEVICE *physDev, const POINT* pt, INT count )
* PSDRV_PolyPolygon * PSDRV_PolyPolygon
*/ */
BOOL PSDRV_PolyPolygon( PSDRV_PDEVICE *physDev, const POINT* pts, const INT* counts, BOOL PSDRV_PolyPolygon( PSDRV_PDEVICE *physDev, const POINT* pts, const INT* counts,
UINT polygons ) UINT polygons )
{ {
DWORD polygon, line; DWORD polygon, line, total;
const POINT* pt; POINT *dev_pts, *pt;
DC *dc = physDev->dc;
TRACE("\n"); TRACE("\n");
pt = pts; for (polygon = total = 0; polygon < polygons; polygon++) total += counts[polygon];
if (!(dev_pts = HeapAlloc( GetProcessHeap(), 0, total * sizeof(*dev_pts) ))) return FALSE;
memcpy( dev_pts, pts, total * sizeof(*dev_pts) );
LPtoDP( physDev->hdc, dev_pts, total );
pt = dev_pts;
for(polygon = 0; polygon < polygons; polygon++) { for(polygon = 0; polygon < polygons; polygon++) {
PSDRV_WriteMoveTo(physDev, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y)); PSDRV_WriteMoveTo(physDev, pt->x, pt->y);
pt++; pt++;
for(line = 1; line < counts[polygon]; line++) { for(line = 1; line < counts[polygon]; line++, pt++)
PSDRV_WriteLineTo(physDev, INTERNAL_XWPTODP(dc, pt->x, pt->y), INTERNAL_YWPTODP(dc, pt->x, pt->y)); PSDRV_WriteLineTo(physDev, pt->x, pt->y);
pt++;
}
PSDRV_WriteClosePath(physDev); PSDRV_WriteClosePath(physDev);
} }
HeapFree( GetProcessHeap(), 0, dev_pts );
if(GetPolyFillMode( physDev->hdc ) == ALTERNATE) if(GetPolyFillMode( physDev->hdc ) == ALTERNATE)
PSDRV_Brush(physDev, 1); PSDRV_Brush(physDev, 1);
@ -304,12 +335,13 @@ BOOL PSDRV_Polygon( PSDRV_PDEVICE *physDev, const POINT* pt, INT count )
COLORREF PSDRV_SetPixel( PSDRV_PDEVICE *physDev, INT x, INT y, COLORREF color ) COLORREF PSDRV_SetPixel( PSDRV_PDEVICE *physDev, INT x, INT y, COLORREF color )
{ {
PSCOLOR pscolor; PSCOLOR pscolor;
DC *dc = physDev->dc; POINT pt;
x = INTERNAL_XWPTODP(dc, x, y); pt.x = x;
y = INTERNAL_YWPTODP(dc, x, y); pt.y = y;
LPtoDP( physDev->hdc, &pt, 1 );
PSDRV_WriteRectangle( physDev, x, y, 0, 0 ); PSDRV_WriteRectangle( physDev, pt.x, pt.y, 0, 0 );
PSDRV_CreateColor( physDev, &pscolor, color ); PSDRV_CreateColor( physDev, &pscolor, color );
PSDRV_WriteSetColor( physDev, &pscolor ); PSDRV_WriteSetColor( physDev, &pscolor );
PSDRV_WriteFill( physDev ); PSDRV_WriteFill( physDev );

View File

@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "gdi.h"
#include "psdrv.h" #include "psdrv.h"
#include "wine/debug.h" #include "wine/debug.h"

View File

@ -23,7 +23,6 @@
#include "windef.h" #include "windef.h"
#include "wingdi.h" #include "wingdi.h"
#include "gdi.h"
#include "wine/wingdi16.h" #include "wine/wingdi16.h"
#include "winspool.h" #include "winspool.h"
@ -268,7 +267,7 @@ typedef struct {
typedef struct { typedef struct {
HDC hdc; HDC hdc;
DC *dc; struct tagDC *dc;
PSFONT font; /* Current PS font */ PSFONT font; /* Current PS font */
PSPEN pen; PSPEN pen;
PSBRUSH brush; PSBRUSH brush;
@ -401,8 +400,6 @@ extern BOOL PSDRV_Ellipse( PSDRV_PDEVICE *physDev, INT left, INT top, INT right,
INT bottom ); INT bottom );
extern INT PSDRV_EndDoc( PSDRV_PDEVICE *physDev ); extern INT PSDRV_EndDoc( PSDRV_PDEVICE *physDev );
extern INT PSDRV_EndPage( PSDRV_PDEVICE *physDev ); extern INT PSDRV_EndPage( PSDRV_PDEVICE *physDev );
extern BOOL PSDRV_EnumDeviceFonts( PSDRV_PDEVICE *physDev, LPLOGFONTW plf,
DEVICEFONTENUMPROC proc, LPARAM lp );
extern BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags, extern BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR str, UINT count, const RECT *lprect, LPCWSTR str, UINT count,
const INT *lpDx ); const INT *lpDx );
@ -428,7 +425,6 @@ extern BOOL PSDRV_Rectangle( PSDRV_PDEVICE *physDev, INT left, INT top, INT righ
extern BOOL PSDRV_RoundRect(PSDRV_PDEVICE *physDev, INT left, INT top, INT right, extern BOOL PSDRV_RoundRect(PSDRV_PDEVICE *physDev, INT left, INT top, INT right,
INT bottom, INT ell_width, INT ell_height); INT bottom, INT ell_width, INT ell_height);
extern COLORREF PSDRV_SetBkColor( PSDRV_PDEVICE *physDev, COLORREF color ); extern COLORREF PSDRV_SetBkColor( PSDRV_PDEVICE *physDev, COLORREF color );
extern VOID PSDRV_SetDeviceClipping( PSDRV_PDEVICE *physDev );
extern COLORREF PSDRV_SetPixel( PSDRV_PDEVICE *physDev, INT x, INT y, COLORREF color ); extern COLORREF PSDRV_SetPixel( PSDRV_PDEVICE *physDev, INT x, INT y, COLORREF color );
extern COLORREF PSDRV_SetTextColor( PSDRV_PDEVICE *physDev, COLORREF color ); extern COLORREF PSDRV_SetTextColor( PSDRV_PDEVICE *physDev, COLORREF color );
extern INT PSDRV_StartDoc( PSDRV_PDEVICE *physDev, const DOCINFOA *doc ); extern INT PSDRV_StartDoc( PSDRV_PDEVICE *physDev, const DOCINFOA *doc );

View File

@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <string.h> #include <string.h>
#include "gdi.h"
#include "psdrv.h" #include "psdrv.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "winspool.h" #include "winspool.h"
@ -38,7 +39,6 @@ BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
BOOL bClipped = FALSE; BOOL bClipped = FALSE;
BOOL bOpaque = FALSE; BOOL bOpaque = FALSE;
RECT rect; RECT rect;
DC *dc = physDev->dc;
TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x, y, TRACE("(x=%d, y=%d, flags=0x%08x, str=%s, count=%d, lpDx=%p)\n", x, y,
flags, debugstr_wn(str, count), count, lpDx); flags, debugstr_wn(str, count), count, lpDx);
@ -49,11 +49,8 @@ BOOL PSDRV_ExtTextOut( PSDRV_PDEVICE *physDev, INT x, INT y, UINT flags,
/* set clipping and/or draw background */ /* set clipping and/or draw background */
if ((flags & (ETO_CLIPPED | ETO_OPAQUE)) && (lprect != NULL)) if ((flags & (ETO_CLIPPED | ETO_OPAQUE)) && (lprect != NULL))
{ {
rect.left = INTERNAL_XWPTODP(dc, lprect->left, lprect->top); rect = *lprect;
rect.right = INTERNAL_XWPTODP(dc, lprect->right, lprect->bottom); LPtoDP( physDev->hdc, (POINT *)&rect, 2 );
rect.top = INTERNAL_YWPTODP(dc, lprect->left, lprect->top);
rect.bottom = INTERNAL_YWPTODP(dc, lprect->right, lprect->bottom);
PSDRV_WriteGSave(physDev); PSDRV_WriteGSave(physDev);
PSDRV_WriteRectangle(physDev, rect.left, rect.top, rect.right - rect.left, PSDRV_WriteRectangle(physDev, rect.left, rect.top, rect.right - rect.left,
rect.bottom - rect.top); rect.bottom - rect.top);

View File

@ -45,7 +45,7 @@ debug_channels (psdrv)
@ cdecl SelectFont(ptr long) PSDRV_SelectFont @ cdecl SelectFont(ptr long) PSDRV_SelectFont
@ cdecl SelectPen(ptr long) PSDRV_SelectPen @ cdecl SelectPen(ptr long) PSDRV_SelectPen
@ cdecl SetBkColor(ptr long) PSDRV_SetBkColor @ cdecl SetBkColor(ptr long) PSDRV_SetBkColor
@ cdecl SetDeviceClipping(ptr) PSDRV_SetDeviceClipping @ cdecl SetDeviceClipping(ptr long) PSDRV_SetDeviceClipping
@ cdecl SetPixel(ptr long long long) PSDRV_SetPixel @ cdecl SetPixel(ptr long long long) PSDRV_SetPixel
@ cdecl SetTextColor(ptr long) PSDRV_SetTextColor @ cdecl SetTextColor(ptr long) PSDRV_SetTextColor
@ cdecl StartDoc(ptr ptr) PSDRV_StartDoc @ cdecl StartDoc(ptr ptr) PSDRV_StartDoc

View File

@ -57,7 +57,7 @@ debug_channels (bitblt bitmap clipboard cursor dinput event font gdi graphics
@ cdecl SetDIBColorTable(ptr long long ptr) X11DRV_SetDIBColorTable @ cdecl SetDIBColorTable(ptr long long ptr) X11DRV_SetDIBColorTable
@ cdecl SetDIBits(ptr long long long ptr ptr long) X11DRV_SetDIBits @ cdecl SetDIBits(ptr long long long ptr ptr long) X11DRV_SetDIBits
@ cdecl SetDIBitsToDevice(ptr long long long long long long long long ptr ptr long) X11DRV_SetDIBitsToDevice @ cdecl SetDIBitsToDevice(ptr long long long long long long long long ptr ptr long) X11DRV_SetDIBitsToDevice
@ cdecl SetDeviceClipping(ptr) X11DRV_SetDeviceClipping @ cdecl SetDeviceClipping(ptr long) X11DRV_SetDeviceClipping
@ cdecl SetDeviceGammaRamp(ptr ptr) X11DRV_SetDeviceGammaRamp @ cdecl SetDeviceGammaRamp(ptr ptr) X11DRV_SetDeviceGammaRamp
@ cdecl SetPixel(ptr long long long) X11DRV_SetPixel @ cdecl SetPixel(ptr long long long) X11DRV_SetPixel
@ cdecl SetPixelFormat(ptr long ptr) X11DRV_SetPixelFormat @ cdecl SetPixelFormat(ptr long ptr) X11DRV_SetPixelFormat

View File

@ -38,12 +38,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(x11drv);
* *
* Could write using GetRegionData but this would be slower. * Could write using GetRegionData but this would be slower.
*/ */
void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev ) void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev, HRGN hrgn )
{ {
XRectangle *pXrect; XRectangle *pXrect;
DC *dc = physDev->dc;
RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(dc->hGCClipRgn, REGION_MAGIC); RGNOBJ *obj = (RGNOBJ *) GDI_GetObjPtr(hrgn, REGION_MAGIC);
if (!obj) if (!obj)
{ {
ERR("Rgn is 0. Please report this.\n"); ERR("Rgn is 0. Please report this.\n");
@ -61,7 +60,7 @@ void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev )
if(!pXrect) if(!pXrect)
{ {
WARN("Can't alloc buffer\n"); WARN("Can't alloc buffer\n");
GDI_ReleaseObj( dc->hGCClipRgn ); GDI_ReleaseObj( hrgn );
return; return;
} }
@ -82,7 +81,7 @@ void X11DRV_SetDeviceClipping( X11DRV_PDEVICE *physDev )
if(pXrect) if(pXrect)
HeapFree( GetProcessHeap(), 0, pXrect ); HeapFree( GetProcessHeap(), 0, pXrect );
GDI_ReleaseObj( dc->hGCClipRgn ); GDI_ReleaseObj( hrgn );
} }

View File

@ -221,7 +221,7 @@ typedef struct tagDC_FUNCS
INT (*pSetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT); INT (*pSetDIBits)(PHYSDEV,HBITMAP,UINT,UINT,LPCVOID,const BITMAPINFO*,UINT);
INT (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID, INT (*pSetDIBitsToDevice)(PHYSDEV,INT,INT,DWORD,DWORD,INT,INT,UINT,UINT,LPCVOID,
const BITMAPINFO*,UINT); const BITMAPINFO*,UINT);
VOID (*pSetDeviceClipping)(PHYSDEV); VOID (*pSetDeviceClipping)(PHYSDEV,HRGN);
BOOL (*pSetDeviceGammaRamp)(PHYSDEV,LPVOID); BOOL (*pSetDeviceGammaRamp)(PHYSDEV,LPVOID);
INT (*pSetMapMode)(PHYSDEV,INT); INT (*pSetMapMode)(PHYSDEV,INT);
DWORD (*pSetMapperFlags)(PHYSDEV,DWORD); DWORD (*pSetMapperFlags)(PHYSDEV,DWORD);

View File

@ -118,7 +118,6 @@ extern BOOL X11DRV_GetTextExtentPoint( X11DRV_PDEVICE *physDev, LPCWSTR str,
extern BOOL X11DRV_GetTextMetrics(X11DRV_PDEVICE *physDev, TEXTMETRICW *metrics); extern BOOL X11DRV_GetTextMetrics(X11DRV_PDEVICE *physDev, TEXTMETRICW *metrics);
extern BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top, extern BOOL X11DRV_PatBlt( X11DRV_PDEVICE *physDev, INT left, INT top,
INT width, INT height, DWORD rop ); INT width, INT height, DWORD rop );
extern VOID X11DRV_SetDeviceClipping(X11DRV_PDEVICE *physDev);
extern BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst, extern BOOL X11DRV_StretchBlt( X11DRV_PDEVICE *physDevDst, INT xDst, INT yDst,
INT widthDst, INT heightDst, INT widthDst, INT heightDst,
X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc, X11DRV_PDEVICE *physDevSrc, INT xSrc, INT ySrc,
@ -303,6 +302,7 @@ extern int X11DRV_PALETTE_mapEGAPixel[16];
extern int X11DRV_PALETTE_Init(void); extern int X11DRV_PALETTE_Init(void);
extern void X11DRV_PALETTE_Cleanup(void); extern void X11DRV_PALETTE_Cleanup(void);
extern BOOL X11DRV_IsSolidColor(COLORREF color);
extern COLORREF X11DRV_PALETTE_ToLogical(int pixel); extern COLORREF X11DRV_PALETTE_ToLogical(int pixel);
extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color); extern int X11DRV_PALETTE_ToPhysical(X11DRV_PDEVICE *physDev, COLORREF color);

View File

@ -50,7 +50,8 @@ void CLIPPING_UpdateGCRegion( DC * dc )
CombineRgn( dc->hGCClipRgn, dc->hVisRgn, 0, RGN_COPY ); CombineRgn( dc->hGCClipRgn, dc->hVisRgn, 0, RGN_COPY );
else else
CombineRgn(dc->hGCClipRgn, dc->hClipRgn, dc->hVisRgn, RGN_AND); CombineRgn(dc->hGCClipRgn, dc->hClipRgn, dc->hVisRgn, RGN_AND);
if (dc->funcs->pSetDeviceClipping) dc->funcs->pSetDeviceClipping( dc->physDev ); if (dc->funcs->pSetDeviceClipping)
dc->funcs->pSetDeviceClipping( dc->physDev, dc->hGCClipRgn );
} }