ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/include/video.h
Revision: 1.11
Committed: 2001-07-01T21:09:30Z (23 years, 5 months ago) by cebix
Content type: text/plain
Branch: MAIN
Changes since 1.10: +1 -1 lines
Log Message:
- video_set_palette() gets passed the number of used palette entries
- video_x.cpp supports 2- and 4-bit modes on truecolor screens

File Contents

# Content
1 /*
2 * video.h - Video/graphics emulation
3 *
4 * Basilisk II (C) 1997-2001 Christian Bauer
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #ifndef VIDEO_H
22 #define VIDEO_H
23
24 #include <vector>
25
26 #ifndef NO_STD_NAMESPACE
27 using std::vector;
28 #endif
29
30 /*
31 Some of the terminology here is completely frelled. In Basilisk II, a
32 "video mode" refers to a combination of resolution and color depth, and
33 this information is stored in a video_mode structure. In Apple
34 documentation, a "mode" historically refers to the color depth only
35 (because old Macs had fixed-frequency monitors and could not change the
36 resolution). These "modes" are assigned a number (0x80, 0x81, etc.),
37 which we here call "Apple mode". When Macs learned how to deal with
38 multiscan monitors, Apple introduced another type of "mode", also having
39 numbers starting from 0x80 but refrerring to the resolution and/or video
40 timing of the display (it's possible to have two modes with the same
41 dimension but different refresh rates). We call this a "resolution ID".
42 The combination of "Apple mode" and "ID" corresponds to a Basilisk II
43 "video mode". To make the confusion worse, the video driver control call
44 that sets the color depth is called "SetMode" while the one that sets
45 both depth and resolution is "SwitchMode"...
46 */
47
48 // Color depth codes
49 enum video_depth {
50 VDEPTH_1BIT, // 2 colors
51 VDEPTH_2BIT, // 4 colors
52 VDEPTH_4BIT, // 16 colors
53 VDEPTH_8BIT, // 256 colors
54 VDEPTH_16BIT, // "Thousands"
55 VDEPTH_32BIT // "Millions"
56 };
57
58 inline uint16 DepthToAppleMode(video_depth depth)
59 {
60 return depth + 0x80;
61 }
62
63 inline video_depth AppleModeToDepth(uint16 mode)
64 {
65 return video_depth(mode - 0x80);
66 }
67
68 inline bool IsDirectMode(video_depth depth)
69 {
70 return depth == VDEPTH_16BIT || depth == VDEPTH_32BIT;
71 }
72
73 inline bool IsDirectMode(uint16 mode)
74 {
75 return IsDirectMode(AppleModeToDepth(mode));
76 }
77
78 // Return the depth code that corresponds to the specified bits-per-pixel value
79 inline video_depth DepthModeForPixelDepth(int depth)
80 {
81 switch (depth) {
82 case 1: return VDEPTH_1BIT;
83 case 2: return VDEPTH_2BIT;
84 case 4: return VDEPTH_4BIT;
85 case 8: return VDEPTH_8BIT;
86 case 15: case 16: return VDEPTH_16BIT;
87 case 24: case 32: return VDEPTH_32BIT;
88 default: return VDEPTH_1BIT;
89 }
90 }
91
92 // Return a bytes-per-row value (assuming no padding) for the specified depth and pixel width
93 inline uint32 TrivialBytesPerRow(uint32 width, video_depth depth)
94 {
95 switch (depth) {
96 case VDEPTH_1BIT: return width / 8;
97 case VDEPTH_2BIT: return width / 4;
98 case VDEPTH_4BIT: return width / 2;
99 case VDEPTH_8BIT: return width;
100 case VDEPTH_16BIT: return width * 2;
101 case VDEPTH_32BIT: return width * 4;
102 default: return width;
103 }
104 }
105
106 /*
107 You are not completely free in your selection of depth/resolution
108 combinations:
109 1) the lowest supported color depth must be available in all
110 resolutions
111 2) if one resolution provides a certain color depth, it must also
112 provide all lower supported depths
113
114 For example, it is possible to have this set of modes:
115 640x480 @ 8 bit
116 640x480 @ 32 bit
117 800x600 @ 8 bit
118 800x600 @ 32 bit
119 1024x768 @ 8 bit
120
121 But this is not possible (violates rule 1):
122 640x480 @ 8 bit
123 800x600 @ 8 bit
124 1024x768 @ 1 bit
125
126 And neither is this (violates rule 2, 640x480 @ 16 bit is missing):
127 640x480 @ 8 bit
128 640x480 @ 32 bit
129 800x600 @ 8 bit
130 800x600 @ 16 bit
131 1024x768 @ 8 bit
132 */
133
134 // Description of a video mode
135 struct video_mode {
136 uint32 x; // X size of screen (pixels)
137 uint32 y; // Y size of screen (pixels)
138 uint32 resolution_id; // Resolution ID (should be >= 0x80 and uniquely identify the sets of modes with the same X/Y size)
139 uint32 bytes_per_row; // Bytes per row of frame buffer
140 video_depth depth; // Color depth (see definitions above)
141 };
142
143 inline bool IsDirectMode(const video_mode &mode)
144 {
145 return IsDirectMode(mode.depth);
146 }
147
148 // List of all supported video modes
149 extern vector<video_mode> VideoModes;
150
151 // Description for one (possibly virtual) monitor
152 struct monitor_desc {
153 uint32 mac_frame_base; // Mac frame buffer address
154 video_mode mode; // Currently selected video mode description
155 };
156
157 // Description of the main (and currently the only) monitor, set by VideoInit()
158 extern monitor_desc VideoMonitor;
159
160 extern int16 VideoDriverOpen(uint32 pb, uint32 dce);
161 extern int16 VideoDriverControl(uint32 pb, uint32 dce);
162 extern int16 VideoDriverStatus(uint32 pb, uint32 dce);
163
164 // System specific and internal functions/data
165 extern bool VideoInit(bool classic);
166 extern void VideoExit(void);
167
168 extern void VideoQuitFullScreen(void);
169
170 extern void VideoInterrupt(void);
171 extern void VideoRefresh(void);
172
173 // Called by the video driver to switch the video mode
174 extern void video_switch_to_mode(const video_mode &mode);
175
176 // Called by the video driver to set the color palette (in indexed modes)
177 // or gamma table (in direct modes)
178 extern void video_set_palette(uint8 *pal, int num);
179
180 #endif