1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/** \file
* \brief Gdk/Cairo Native Window Driver
*
* See Copyright Notice in cd.h
*/
#include <stdlib.h>
#include <stdio.h>
#include "cdgdk.h"
#include "cdnative.h"
int cdGetScreenColorPlanes(void)
{
static int first = 1;
static int bpp;
if (first)
{
GdkVisual* info = gdk_visual_get_system();
if (info != NULL)
{
bpp = info->depth;
return bpp;
}
bpp = 2;
first = 0;
}
return bpp;
}
void cdGetScreenSize(int *width, int *height, double *width_mm, double *height_mm)
{
static int first = 1;
static int dpy_width, dpy_height, dpy_width_mm, dpy_height_mm;
if (first)
{
GdkScreen* drv_screen = gdk_screen_get_default();
dpy_width = gdk_screen_get_width(drv_screen);
dpy_height = gdk_screen_get_height(drv_screen);
dpy_width_mm = gdk_screen_get_width_mm(drv_screen);
dpy_height_mm = gdk_screen_get_height_mm(drv_screen);
first = 0;
}
if (width) *width = dpy_width;
if (height) *height = dpy_height;
if (width_mm) *width_mm = dpy_width_mm;
if (height_mm) *height_mm = dpy_height_mm;
}
static void cdkillcanvas(cdCtxCanvas *ctxcanvas)
{
cdgdkKillCanvas(ctxcanvas);
}
static int cdactivate(cdCtxCanvas *ctxcanvas)
{
gdk_drawable_get_size(ctxcanvas->wnd, &ctxcanvas->canvas->w, &ctxcanvas->canvas->h);
ctxcanvas->canvas->w_mm = ((double)ctxcanvas->canvas->w) / ctxcanvas->canvas->xres;
ctxcanvas->canvas->h_mm = ((double)ctxcanvas->canvas->h) / ctxcanvas->canvas->yres;
if (ctxcanvas->canvas->use_matrix)
ctxcanvas->canvas->cxTransform(ctxcanvas, ctxcanvas->canvas->matrix);
return CD_OK;
}
static void cdcreatecanvas(cdCanvas* canvas, void *data)
{
GdkDrawable* wnd = (GdkDrawable*)data;
if (!wnd)
return;
cdgdkCreateCanvas(canvas, wnd, gdk_drawable_get_screen(wnd), gdk_drawable_get_visual(wnd));
}
static void cdinittable(cdCanvas* canvas)
{
cdgdkInitTable(canvas);
canvas->cxKillCanvas = cdkillcanvas;
canvas->cxActivate = cdactivate;
}
/******************************************************/
static cdContext cdNativeWindowContext =
{
CD_CAP_ALL & ~(CD_CAP_PLAY | CD_CAP_YAXIS | CD_CAP_FPRIMTIVES ),
1,
cdcreatecanvas,
cdinittable,
NULL,
NULL,
};
cdContext* cdContextNativeWindow(void)
{
if (cdUseContextPlus(CD_QUERY))
{
cdContext* ctx = cdGetContextPlus(CD_CTX_NATIVEWINDOW);
if (ctx != NULL)
return ctx;
}
return &cdNativeWindowContext;
}
|