21 |
|
#ifndef VIDEO_H |
22 |
|
#define VIDEO_H |
23 |
|
|
24 |
< |
// Description for one (possibly virtual) monitor |
25 |
< |
enum { |
26 |
< |
VMODE_1BIT, |
27 |
< |
VMODE_2BIT, |
28 |
< |
VMODE_4BIT, |
29 |
< |
VMODE_8BIT, |
30 |
< |
VMODE_16BIT, |
31 |
< |
VMODE_32BIT |
24 |
> |
#include <vector> |
25 |
> |
|
26 |
> |
/* |
27 |
> |
Some of the terminology here is completely frelled. In Basilisk II, a |
28 |
> |
"video mode" refers to a combination of resolution and color depth, and |
29 |
> |
this information is stored in a video_mode structure. In Apple |
30 |
> |
documentation, a "mode" historically refers to the color depth only |
31 |
> |
(because old Macs had fixed-frequency monitors and could not change the |
32 |
> |
resolution). These "modes" are assigned a number (0x80, 0x81, etc.), |
33 |
> |
which we here call "Apple mode". When Macs learned how to deal with |
34 |
> |
multiscan monitors, Apple introduced another type of "mode", also having |
35 |
> |
numbers starting from 0x80 but refrerring to the resolution and/or video |
36 |
> |
timing of the display (it's possible to have two modes with the same |
37 |
> |
dimension but different refresh rates). We call this a "resolution ID". |
38 |
> |
The combination of "Apple mode" and "ID" corresponds to a Basilisk II |
39 |
> |
"video mode". To make the confusion worse, the video driver control call |
40 |
> |
that sets the color depth is called "SetMode" while the one that sets |
41 |
> |
both depth and resolution is "SwitchMode"... |
42 |
> |
*/ |
43 |
> |
|
44 |
> |
// Color depth codes |
45 |
> |
enum video_depth { |
46 |
> |
VDEPTH_1BIT, // 2 colors |
47 |
> |
VDEPTH_2BIT, // 4 colors |
48 |
> |
VDEPTH_4BIT, // 16 colors |
49 |
> |
VDEPTH_8BIT, // 256 colors |
50 |
> |
VDEPTH_16BIT, // "Thousands" |
51 |
> |
VDEPTH_32BIT // "Millions" |
52 |
|
}; |
53 |
|
|
54 |
< |
#define IsDirectMode(x) ((x) == VMODE_16BIT || (x) == VMODE_32BIT) |
54 |
> |
inline uint16 DepthToAppleMode(video_depth depth) |
55 |
> |
{ |
56 |
> |
return depth + 0x80; |
57 |
> |
} |
58 |
> |
|
59 |
> |
inline video_depth AppleModeToDepth(uint16 mode) |
60 |
> |
{ |
61 |
> |
return video_depth(mode - 0x80); |
62 |
> |
} |
63 |
> |
|
64 |
> |
inline bool IsDirectMode(video_depth depth) |
65 |
> |
{ |
66 |
> |
return depth == VDEPTH_16BIT || depth == VDEPTH_32BIT; |
67 |
> |
} |
68 |
> |
|
69 |
> |
inline bool IsDirectMode(uint16 mode) |
70 |
> |
{ |
71 |
> |
return IsDirectMode(AppleModeToDepth(mode)); |
72 |
> |
} |
73 |
> |
|
74 |
> |
// Return the depth code that corresponds to the specified bits-per-pixel value |
75 |
> |
inline video_depth DepthModeForPixelDepth(int depth) |
76 |
> |
{ |
77 |
> |
switch (depth) { |
78 |
> |
case 1: return VDEPTH_1BIT; |
79 |
> |
case 2: return VDEPTH_2BIT; |
80 |
> |
case 4: return VDEPTH_4BIT; |
81 |
> |
case 8: return VDEPTH_8BIT; |
82 |
> |
case 15: case 16: return VDEPTH_16BIT; |
83 |
> |
case 24: case 32: return VDEPTH_32BIT; |
84 |
> |
default: return VDEPTH_1BIT; |
85 |
> |
} |
86 |
> |
} |
87 |
> |
|
88 |
> |
// Return a bytes-per-row value (assuming no padding) for the specified depth and pixel width |
89 |
> |
inline uint32 TrivialBytesPerRow(uint32 width, video_depth depth) |
90 |
> |
{ |
91 |
> |
switch (depth) { |
92 |
> |
case VDEPTH_1BIT: return width / 8; |
93 |
> |
case VDEPTH_2BIT: return width / 4; |
94 |
> |
case VDEPTH_4BIT: return width / 2; |
95 |
> |
case VDEPTH_8BIT: return width; |
96 |
> |
case VDEPTH_16BIT: return width * 2; |
97 |
> |
case VDEPTH_32BIT: return width * 4; |
98 |
> |
} |
99 |
> |
} |
100 |
> |
|
101 |
> |
/* |
102 |
> |
You are not completely free in your selection of depth/resolution |
103 |
> |
combinations: |
104 |
> |
1) the lowest supported color depth must be available in all |
105 |
> |
resolutions |
106 |
> |
2) if one resolution provides a certain color depth, it must also |
107 |
> |
provide all lower supported depths |
108 |
> |
|
109 |
> |
For example, it is possible to have this set of modes: |
110 |
> |
640x480 @ 8 bit |
111 |
> |
640x480 @ 32 bit |
112 |
> |
800x600 @ 8 bit |
113 |
> |
800x600 @ 32 bit |
114 |
> |
1024x768 @ 8 bit |
115 |
> |
|
116 |
> |
But this is not possible (violates rule 1): |
117 |
> |
640x480 @ 8 bit |
118 |
> |
800x600 @ 8 bit |
119 |
> |
1024x768 @ 1 bit |
120 |
> |
|
121 |
> |
And neither is this (violates rule 2, 640x480 @ 16 bit is missing): |
122 |
> |
640x480 @ 8 bit |
123 |
> |
640x480 @ 32 bit |
124 |
> |
800x600 @ 8 bit |
125 |
> |
800x600 @ 16 bit |
126 |
> |
1024x768 @ 8 bit |
127 |
> |
*/ |
128 |
|
|
129 |
< |
struct video_desc { |
130 |
< |
uint32 mac_frame_base; // Mac frame buffer address |
38 |
< |
uint32 bytes_per_row; // Bytes per row |
129 |
> |
// Description of a video mode |
130 |
> |
struct video_mode { |
131 |
|
uint32 x; // X size of screen (pixels) |
132 |
|
uint32 y; // Y size of screen (pixels) |
133 |
< |
int mode; // Video mode |
133 |
> |
uint32 resolution_id; // Resolution ID (should be >= 0x80 and uniquely identify the sets of modes with the same X/Y size) |
134 |
> |
uint32 bytes_per_row; // Bytes per row of frame buffer |
135 |
> |
video_depth depth; // Color depth (see definitions above) |
136 |
> |
}; |
137 |
> |
|
138 |
> |
inline bool IsDirectMode(const video_mode &mode) |
139 |
> |
{ |
140 |
> |
return IsDirectMode(mode.depth); |
141 |
> |
} |
142 |
> |
|
143 |
> |
// List of all supported video modes |
144 |
> |
extern std::vector<video_mode> VideoModes; |
145 |
> |
|
146 |
> |
// Description for one (possibly virtual) monitor |
147 |
> |
struct monitor_desc { |
148 |
> |
uint32 mac_frame_base; // Mac frame buffer address |
149 |
> |
video_mode mode; // Currently selected video mode description |
150 |
|
}; |
151 |
|
|
152 |
< |
extern struct video_desc VideoMonitor; // Description of the main monitor, set by VideoInit() |
152 |
> |
// Description of the main (and currently the only) monitor, set by VideoInit() |
153 |
> |
extern monitor_desc VideoMonitor; |
154 |
|
|
155 |
|
extern int16 VideoDriverOpen(uint32 pb, uint32 dce); |
156 |
|
extern int16 VideoDriverControl(uint32 pb, uint32 dce); |
165 |
|
extern void VideoInterrupt(void); |
166 |
|
extern void VideoRefresh(void); |
167 |
|
|
168 |
+ |
// Called by the video driver to switch the video mode |
169 |
+ |
extern void video_switch_to_mode(const video_mode &mode); |
170 |
+ |
|
171 |
+ |
// Called by the video driver to set the color palette (in indexed modes) |
172 |
+ |
// or gamma table (in direct modes) |
173 |
|
extern void video_set_palette(uint8 *pal); |
174 |
|
|
175 |
|
#endif |