2 * X-specific shortcuts to speed up WM code.
3 * No coordinate transformations except origin translation.
5 * Copyright 1993, 1994 Alexandre Julliard
12 #include <X11/Intrinsic.h>
19 #define MAX_DRAWLINES 8
22 /**********************************************************************
25 * Draw multiple unconnected lines (limited by MAX_DRAWLINES).
27 BOOL32
GRAPH_DrawLines( HDC32 hdc
, LPPOINT32 pXY
, INT32 N
, HPEN32 hPen
)
32 assert( N
<= MAX_DRAWLINES
);
33 if( (dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
)) )
37 if( hPen
) hPrevPen
= SelectObject32( hdc
, hPen
);
38 if( DC_SetupGCForPen( dc
) )
40 XSegment l
[MAX_DRAWLINES
];
43 for( i
= 0; i
< N
; i
++ )
46 l
[i
].x1
= pXY
[j
].x
+ dc
->w
.DCOrgX
;
47 l
[i
].x2
= pXY
[j
+ 1].x
+ dc
->w
.DCOrgX
;
48 l
[i
].y1
= pXY
[j
].y
+ dc
->w
.DCOrgY
;
49 l
[i
].y2
= pXY
[j
+ 1].y
+ dc
->w
.DCOrgY
;
51 TSXDrawSegments( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
, l
, N
);
54 if( hPrevPen
) SelectObject32( hdc
, hPrevPen
);
55 GDI_HEAP_UNLOCK( hdc
);
60 /**********************************************************************
64 * Short-cut function to blit a bitmap into a device.
65 * Faster than CreateCompatibleDC() + SelectBitmap() + BitBlt() + DeleteDC().
67 BOOL32
GRAPH_DrawBitmap( HDC32 hdc
, HBITMAP32 hbitmap
,
68 INT32 xdest
, INT32 ydest
, INT32 xsrc
, INT32 ysrc
,
69 INT32 width
, INT32 height
, BOOL32 bMono
)
74 X11DRV_PHYSBITMAP
*pbitmap
;
76 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return FALSE
;
77 if (!(bmp
= (BITMAPOBJ
*) GDI_GetObjPtr( hbitmap
, BITMAP_MAGIC
)))
79 GDI_HEAP_UNLOCK( hdc
);
83 pbitmap
= bmp
->DDBitmap
->physBitmap
;
85 xdest
+= dc
->w
.DCOrgX
; ydest
+= dc
->w
.DCOrgY
;
87 TSXSetFunction( display
, dc
->u
.x
.gc
, GXcopy
);
88 if (bmp
->bitmap
.bmBitsPixel
== 1)
90 TSXSetForeground( display
, dc
->u
.x
.gc
, dc
->u
.x
.backgroundPixel
);
91 TSXSetBackground( display
, dc
->u
.x
.gc
, dc
->u
.x
.textPixel
);
92 TSXCopyPlane( display
, pbitmap
->pixmap
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
93 xsrc
, ysrc
, width
, height
, xdest
, ydest
, 1 );
95 else if (bmp
->bitmap
.bmBitsPixel
== dc
->w
.bitsPerPixel
)
101 if( COLOR_GetMonoPlane(&plane
) )
103 TSXSetForeground(display
, dc
->u
.x
.gc
, dc
->u
.x
.backgroundPixel
);
104 TSXSetBackground(display
, dc
->u
.x
.gc
, dc
->u
.x
.textPixel
);
108 TSXSetForeground(display
, dc
->u
.x
.gc
, dc
->u
.x
.textPixel
);
109 TSXSetBackground(display
, dc
->u
.x
.gc
, dc
->u
.x
.backgroundPixel
);
111 TSXCopyPlane( display
, pbitmap
->pixmap
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
112 xsrc
, ysrc
, width
, height
, xdest
, ydest
, plane
);
116 TSXCopyArea( display
, pbitmap
->pixmap
, dc
->u
.x
.drawable
,
117 dc
->u
.x
.gc
, xsrc
, ysrc
, width
, height
, xdest
, ydest
);
125 GDI_HEAP_UNLOCK( hdc
);
126 GDI_HEAP_UNLOCK( hbitmap
);
131 /**********************************************************************
132 * GRAPH_DrawReliefRect
134 * Used in the standard control code for button edge drawing.
136 void GRAPH_DrawReliefRect( HDC32 hdc
, const RECT32
*rect
, INT32 highlight_size
,
137 INT32 shadow_size
, BOOL32 pressed
)
140 GRAPH_DrawGenericReliefRect(hdc
, rect
, highlight_size
, shadow_size
,
141 GetSysColorBrush32(COLOR_BTNSHADOW
),
142 GetSysColorBrush32(COLOR_BTNHIGHLIGHT
));
144 GRAPH_DrawGenericReliefRect(hdc
, rect
, highlight_size
, shadow_size
,
145 GetSysColorBrush32(COLOR_BTNHIGHLIGHT
),
146 GetSysColorBrush32(COLOR_BTNSHADOW
));
152 /******************************************************************************
153 * GRAPH_DrawGenericReliefRect
155 * Creates a rectangle with the specified highlight and shadow colors.
156 * Adapted from DrawReliefRect (which is somewhat misnamed).
158 void GRAPH_DrawGenericReliefRect(
161 INT32 highlight_size
,
171 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return;
173 OffsetRect32( &r
, dc
->w
.DCOrgX
, dc
->w
.DCOrgY
);
174 h
= rect
->bottom
- rect
->top
; w
= rect
->right
- rect
->left
;
176 hPrevBrush
= SelectObject32(hdc
, highlight
);
178 if ( DC_SetupGCForBrush( dc
) )
182 TSXSetFunction( display
, dc
->u
.x
.gc
, GXcopy
);
183 for (i
= 0; i
< highlight_size
; i
++)
185 TSXFillRectangle( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
186 r
.left
+ i
, r
.top
, 1, h
- i
);
187 TSXFillRectangle( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
188 r
.left
, r
.top
+ i
, w
- i
, 1 );
192 SelectObject32( hdc
, shadow
);
193 if ( DC_SetupGCForBrush( dc
) )
197 TSXSetFunction( display
, dc
->u
.x
.gc
, GXcopy
);
198 for (i
= 0; i
< shadow_size
; i
++)
200 TSXFillRectangle( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
201 r
.right
- i
- 1, r
.top
+ i
, 1, h
- i
);
202 TSXFillRectangle( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
203 r
.left
+ i
, r
.bottom
- i
- 1, w
- i
, 1 );
207 SelectObject32( hdc
, hPrevBrush
);
208 GDI_HEAP_UNLOCK( hdc
);
213 /**********************************************************************
214 * GRAPH_DrawRectangle
216 void GRAPH_DrawRectangle( HDC32 hdc
, INT32 x
, INT32 y
,
217 INT32 w
, INT32 h
, HPEN32 hPen
)
221 if( (dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
)) )
225 if( hPen
) hPrevPen
= SelectObject32( hdc
, hPen
);
226 if( DC_SetupGCForPen( dc
) )
227 TSXDrawRectangle( display
, dc
->u
.x
.drawable
, dc
->u
.x
.gc
,
228 x
+ dc
->w
.DCOrgX
, y
+ dc
->w
.DCOrgY
, w
- 1, h
- 1);
229 if( hPrevPen
) SelectObject32( hdc
, hPrevPen
);
230 GDI_HEAP_UNLOCK( hdc
);
234 /**********************************************************************
235 * GRAPH_SelectClipMask
237 BOOL32
GRAPH_SelectClipMask( HDC32 hdc
, HBITMAP32 hMonoBitmap
, INT32 x
, INT32 y
)
239 BITMAPOBJ
*bmp
= NULL
;
241 X11DRV_PHYSBITMAP
*pbitmap
= NULL
;
243 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return FALSE
;
246 if ( !(bmp
= (BITMAPOBJ
*) GDI_GetObjPtr( hMonoBitmap
, BITMAP_MAGIC
))
247 || bmp
->bitmap
.bmBitsPixel
!= 1 )
249 GDI_HEAP_UNLOCK( hdc
);
252 pbitmap
= bmp
->DDBitmap
->physBitmap
;
253 TSXSetClipOrigin( display
, dc
->u
.x
.gc
, dc
->w
.DCOrgX
+ x
, dc
->w
.DCOrgY
+ y
);
256 TSXSetClipMask( display
, dc
->u
.x
.gc
, (bmp
) ? pbitmap
->pixmap
: None
);
258 GDI_HEAP_UNLOCK( hdc
);
259 GDI_HEAP_UNLOCK( hMonoBitmap
);