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
118
119
120
121
122
|
/* Copyright (c) Nate Robins, 1997. */
/* portions Copyright (c) Mark Kilgard, 1997, 1998. */
/* This program is freely distributable without licensing fees
and is provided without guarantee or warrantee expressed or
implied. This program is -not- in the public domain. */
#include "glutint.h"
#include "glutstroke.h"
#include "glutbitmap.h"
#if defined(__CYGWIN32__)
typedef MINMAXINFO* LPMINMAXINFO;
#else
#include <sys/timeb.h>
#endif
/* The following added by Paul Garceau <pgarceau@teleport.com> */
#if defined(__MINGW32__)
#include <time.h>
#include <windows.h>
struct timeval;
#endif
extern StrokeFontRec glutStrokeRoman, glutStrokeMonoRoman;
extern BitmapFontRec glutBitmap8By13, glutBitmap9By15, glutBitmapTimesRoman10, glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12, glutBitmapHelvetica18;
int
gettimeofday(struct timeval* tp, void* tzp)
{
struct timeb tb;
ftime(&tb);
tp->tv_sec = tb.time;
tp->tv_usec = tb.millitm * 1000;
/* 0 indicates that the call succeeded. */
return 0;
}
/* To get around the fact that Microsoft DLLs only allow functions
to be exported and now data addresses (as Unix DSOs support), the
GLUT API constants such as GLUT_STROKE_ROMAN have to get passed
through a case statement to get mapped to the actual data structure
address. */
void*
__glutFont(void *font)
{
switch((int)font) {
case (int)GLUT_STROKE_ROMAN:
return &glutStrokeRoman;
case (int)GLUT_STROKE_MONO_ROMAN:
return &glutStrokeMonoRoman;
case (int)GLUT_BITMAP_9_BY_15:
return &glutBitmap9By15;
case (int)GLUT_BITMAP_8_BY_13:
return &glutBitmap8By13;
case (int)GLUT_BITMAP_TIMES_ROMAN_10:
return &glutBitmapTimesRoman10;
case (int)GLUT_BITMAP_TIMES_ROMAN_24:
return &glutBitmapTimesRoman24;
case (int)GLUT_BITMAP_HELVETICA_10:
return &glutBitmapHelvetica10;
case (int)GLUT_BITMAP_HELVETICA_12:
return &glutBitmapHelvetica12;
case (int)GLUT_BITMAP_HELVETICA_18:
return &glutBitmapHelvetica18;
}
__glutFatalError("out of memory.");
/* NOTREACHED */
return NULL; /* MSVC compiler complains if there is no return at all */
}
int
__glutGetTransparentPixel(Display * dpy, XVisualInfo * vinfo)
{
/* the transparent pixel on Win32 is always index number 0. So if
we put this routine in this file, we can avoid compiling the
whole of layerutil.c which is where this routine normally comes
from. */
return 0;
}
void
__glutAdjustCoords(Window parent, int* x, int* y, int* width, int* height)
{
RECT rect;
/* adjust the window rectangle because Win32 thinks that the x, y,
width & height are the WHOLE window (including decorations),
whereas GLUT treats the x, y, width & height as only the CLIENT
area of the window. */
rect.left = *x; rect.top = *y;
rect.right = *x + *width; rect.bottom = *y + *height;
/* must adjust the coordinates according to the correct style
because depending on the style, there may or may not be
borders. */
AdjustWindowRect(&rect, WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
(parent ? WS_CHILD : WS_OVERLAPPEDWINDOW),
FALSE);
/* FALSE in the third parameter = window has no menu bar */
/* readjust if the x and y are offscreen */
if(rect.left < 0) {
*x = 0;
} else {
*x = rect.left;
}
if(rect.top < 0) {
*y = 0;
} else {
*y = rect.top;
}
*width = rect.right - rect.left; /* adjusted width */
*height = rect.bottom - rect.top; /* adjusted height */
}
|