Release 940815
[wine] / objects / pen.c
1 /*
2  * GDI pen objects
3  *
4  * Copyright 1993 Alexandre Julliard
5  */
6
7 static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
8
9 #include "gdi.h"
10 #include "metafile.h"
11
12 extern WORD COLOR_ToPhysical( DC *dc, COLORREF color );
13
14 /***********************************************************************
15  *           CreatePen    (GDI.61)
16  */
17 HPEN CreatePen( short style, short width, COLORREF color )
18 {
19     LOGPEN logpen = { style, { width, 0 }, color };
20 #ifdef DEBUG_GDI
21     printf( "CreatePen: %d %d %06x\n", style, width, color );
22 #endif
23     return CreatePenIndirect( &logpen );
24 }
25
26
27 /***********************************************************************
28  *           CreatePenIndirect    (GDI.62)
29  */
30 HPEN CreatePenIndirect( LOGPEN * pen )
31 {
32     PENOBJ * penPtr;
33     HPEN hpen;
34
35     if (pen->lopnStyle > PS_INSIDEFRAME) return 0;
36     hpen = GDI_AllocObject( sizeof(PENOBJ), PEN_MAGIC );
37     if (!hpen) return 0;
38     penPtr = (PENOBJ *) GDI_HEAP_ADDR( hpen );    
39     memcpy( &penPtr->logpen, pen, sizeof(LOGPEN) );
40     return hpen;
41 }
42
43
44 /***********************************************************************
45  *           PEN_GetObject
46  */
47 int PEN_GetObject( PENOBJ * pen, int count, LPSTR buffer )
48 {
49     if (count > sizeof(LOGPEN)) count = sizeof(LOGPEN);
50     memcpy( buffer, &pen->logpen, count );
51     return count;
52 }
53
54
55 /***********************************************************************
56  *           PEN_SelectObject
57  */
58 HPEN PEN_SelectObject( DC * dc, HPEN hpen, PENOBJ * pen )
59 {
60     static char dash_dash[]       = { 5, 3 };      /* -----   -----   -----  */
61     static char dash_dot[]        = { 2, 2 };      /* --  --  --  --  --  -- */
62     static char dash_dashdot[]    = { 4,3,2,3 };   /* ----   --   ----   --  */
63     static char dash_dashdotdot[] = { 4,2,2,2,2,2 };  /* ----  --  --  ----  */
64     HPEN prevHandle = dc->w.hPen;
65
66     if (dc->header.wMagic == METAFILE_DC_MAGIC)
67         return MF_CreatePenIndirect(dc, hpen, &(pen->logpen));
68
69     dc->w.hPen = hpen;
70
71     dc->u.x.pen.style = pen->logpen.lopnStyle;
72     dc->u.x.pen.width = pen->logpen.lopnWidth.x * dc->w.VportExtX
73                           / dc->w.WndExtX;
74     if (dc->u.x.pen.width < 0) dc->u.x.pen.width = -dc->u.x.pen.width;
75     if (dc->u.x.pen.width == 1) dc->u.x.pen.width = 0;  /* Faster */
76     dc->u.x.pen.pixel = COLOR_ToPhysical( dc, pen->logpen.lopnColor );    
77     switch(pen->logpen.lopnStyle)
78     {
79       case PS_DASH:
80         dc->u.x.pen.dashes = dash_dash;
81         dc->u.x.pen.dash_len = 2;
82         break;
83       case PS_DOT:
84         dc->u.x.pen.dashes = dash_dot;
85         dc->u.x.pen.dash_len = 2;
86         break;
87       case PS_DASHDOT:
88         dc->u.x.pen.dashes = dash_dashdot;
89         dc->u.x.pen.dash_len = 4;
90         break;
91       case PS_DASHDOTDOT:
92         dc->u.x.pen.dashes = dash_dashdotdot;
93         dc->u.x.pen.dash_len = 6;
94         break;
95     }
96     
97     return prevHandle;
98 }