OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [insight/] [libgui/] [src/] [tkWinPrintCanvas.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
 
2
#ifdef _WIN32
3
 
4
#include <windows.h>
5
 
6
#include "tkWinInt.h"
7
#include "tkCanvas.h"
8
 
9
#include <tcl.h>
10
#include <tk.h>
11
 
12
 
13
 
14
/*
15
 *--------------------------------------------------------------
16
 *
17
 * PrintCanvasCmd --
18
 *      When invoked with the correct args this will bring up a
19
 *      standard Windows print dialog box and then print the
20
 *      contence of the canvas.
21
 *
22
 * Results:
23
 *      Standard Tcl result.
24
 *
25
 *--------------------------------------------------------------
26
 */
27
 
28
 
29
int
30
PrintCanvasCmd(clientData, interp, argc, argv)
31
     ClientData clientData;
32
     Tcl_Interp *interp;
33
     int argc;
34
     char **argv;
35
{
36
    PRINTDLG pd;
37
    Tcl_CmdInfo canvCmd;
38
    TkCanvas *canvasPtr;
39
    TkWinDrawable *PrinterDrawable;
40
    Tk_Window tkwin;/* = canvasPtr->tkwin;*/
41
    Tk_Item *itemPtr;
42
    Pixmap pixmap;
43
    HDC hDCpixmap;
44
    TkWinDCState pixmapState;
45
    DEVMODE dm;
46
    float Ptr_pixX,Ptr_pixY,Ptr_mmX,Ptr_mmY;
47
    float canv_pixX,canv_pixY,canv_mmX,canv_mmY;
48
 
49
    int widget_X_size = 0;
50
    int widget_Y_size = 0;
51
    int page_Y_size, page_X_size;
52
    int tiles_wide,tiles_high;
53
    int tile_y, tile_x;
54
    int screenX1, screenX2, screenY1, screenY2, width, height;
55
    DOCINFO *lpdi = malloc(sizeof(DOCINFO));
56
 
57
    if (argc < 2) {
58
        Tcl_AppendResult(interp, "wrong # args: should be \"",
59
                         argv[0], " canvas \"",
60
                         (char *) NULL);
61
        return TCL_ERROR;
62
    }
63
 
64
    /* The second arg is the canvas widget */
65
    if (!Tcl_GetCommandInfo(interp, argv[1], &canvCmd)) {
66
        Tcl_AppendResult(interp, "couldn't get canvas information for \"",
67
                         argv[1], "\"", (char *) NULL);
68
        return TCL_ERROR;
69
    }
70
 
71
    memset(&dm,0,sizeof(DEVMODE));
72
    dm.dmSize = sizeof(DEVMODE);
73
    dm.dmScale = 500;
74
 
75
    memset(lpdi,0,sizeof(DOCINFO));
76
    lpdi->cbSize=sizeof(DOCINFO);
77
    lpdi->lpszDocName=malloc(255);
78
    sprintf((char*)lpdi->lpszDocName,"SN - Printing\0");
79
    lpdi->lpszOutput=NULL;
80
 
81
    canvasPtr = (TkCanvas *)(canvCmd.clientData);
82
  tkwin = canvasPtr->tkwin;
83
    memset(&pd,0,sizeof( PRINTDLG ));
84
    pd.lStructSize  = sizeof( PRINTDLG );
85
    pd.hwndOwner    = NULL;
86
    pd.hDevMode     = NULL;
87
    pd.hDevNames    = NULL;
88
    /* pd.hDC = */
89
    pd.Flags        = PD_RETURNDC;
90
 
91
    /* Get printer details. */
92
    if (!PrintDlg(&pd)) {
93
        goto done;
94
    }
95
 
96
    PrinterDrawable = (TkWinDrawable *) ckalloc(sizeof(TkWinDrawable));
97
    PrinterDrawable->type = TWD_WINDC;
98
    PrinterDrawable->winDC.hdc = pd.hDC;
99
 
100
    Ptr_pixX=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,HORZRES);
101
    Ptr_pixY=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,VERTRES);
102
    Ptr_mmX=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,HORZSIZE);
103
    Ptr_mmY=(float)GetDeviceCaps(PrinterDrawable->winDC.hdc,VERTSIZE);
104
 
105
        screenX1=0; screenY1=0;
106
    screenX2=canvasPtr->width; screenY2=canvasPtr->height;
107
        canvasPtr->drawableXOrigin = screenX1 - 30;
108
        canvasPtr->drawableYOrigin = screenY1 - 30;
109
        pixmap = Tk_GetPixmap(Tk_Display(tkwin), Tk_WindowId(tkwin),
110
            (screenX2 + 30 - canvasPtr->drawableXOrigin),
111
            (screenY2 + 30 - canvasPtr->drawableYOrigin),
112
            Tk_Depth(tkwin));
113
        width = screenX2 - screenX1;
114
        height = screenY2 - screenY1;
115
 
116
    hDCpixmap = TkWinGetDrawableDC(Tk_Display(tkwin), pixmap, &pixmapState);
117
    canv_pixX=(float)GetDeviceCaps(hDCpixmap,HORZRES);
118
    canv_pixY=(float)GetDeviceCaps(hDCpixmap,VERTRES);
119
    canv_mmX=(float)GetDeviceCaps(hDCpixmap,HORZSIZE);
120
    canv_mmY=(float)GetDeviceCaps(hDCpixmap,VERTSIZE);
121
 
122
 
123
    SetMapMode(PrinterDrawable->winDC.hdc,MM_ISOTROPIC);
124
    SetWindowExtEx(PrinterDrawable->winDC.hdc,(int)((float)canv_pixX),(int)((float)canv_pixY),NULL);
125
    SetViewportExtEx(PrinterDrawable->winDC.hdc,(int)((float)Ptr_pixX),
126
                            (int)((float)Ptr_pixY),
127
                            NULL);
128
 
129
    /* max X and Y for canvas  */
130
    for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
131
            itemPtr = itemPtr->nextPtr) {
132
        if (itemPtr->x1 > widget_X_size) {
133
            widget_X_size = itemPtr->x1;
134
        }
135
        if (itemPtr->y1 > widget_Y_size) {
136
            widget_Y_size = itemPtr->y1;
137
        }
138
    }
139
 
140
    /* Calculate the number of tiles high */
141
    page_Y_size = GetDeviceCaps(hDCpixmap,LOGPIXELSY)*(Ptr_mmY/22);
142
    page_X_size = GetDeviceCaps(hDCpixmap,LOGPIXELSX)*(Ptr_mmX/22);
143
 
144
    tiles_high = ( widget_Y_size / page_Y_size ); /* start at zero */
145
    tiles_wide = ( widget_X_size / page_X_size ); /* start at zero */
146
 
147
    StartDoc(pd.hDC,lpdi);
148
 
149
    for (tile_x = 0; tile_x <= tiles_wide;tile_x++) {
150
    for (tile_y = 0; tile_y <= tiles_high;tile_y++) {
151
        SetViewportOrgEx(pd.hDC,-(tile_x*Ptr_pixX),-(tile_y*Ptr_pixY),NULL);
152
        StartPage(pd.hDC);
153
 
154
        for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL;
155
                itemPtr = itemPtr->nextPtr) {
156
            (*itemPtr->typePtr->displayProc)((Tk_Canvas) canvasPtr, itemPtr,
157
                    canvasPtr->display, (unsigned long) PrinterDrawable/*pixmap*/, screenX1, screenY1, width,
158
                    height);
159
        }
160
 
161
    EndPage(pd.hDC);
162
    }
163
    }
164
    EndDoc(pd.hDC);
165
 
166
done:
167
    return TCL_OK;
168
 error:
169
    return TCL_ERROR;
170
}
171
 
172
 
173
 
174
static void
175
ide_delete_print_canvas_command(ClientData clientData)
176
{
177
  /* destructor code here.*/
178
}
179
 
180
int
181
ide_create_printcanvas_command (Tcl_Interp *interp)
182
{
183
 
184
  /* initialization code here */
185
 
186
        if (Tcl_CreateCommand(interp, "ide_print_canvas", PrintCanvasCmd,
187
                          NULL, ide_delete_print_canvas_command) == NULL)
188
        return TCL_ERROR;
189
 
190
            return TCL_OK;
191
}
192
 
193
#endif /* _WIN32 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.