codeset
[AROS.git] / rom / graphics / videocontrol.c
blob88d8c279b2777ea292b283a08cf1eb74b571b909
1 /*
2 Copyright © 1995-2010, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Graphics function VideoControl()
6 Lang: english
7 */
8 #include <aros/debug.h>
9 #include <graphics/videocontrol.h>
10 #include <graphics/view.h>
11 #include <utility/tagitem.h>
12 #include <proto/utility.h>
14 /*****************************************************************************
16 NAME */
17 #include <proto/graphics.h>
19 AROS_LH2(ULONG, VideoControl,
21 /* SYNOPSIS */
22 AROS_LHA(struct ColorMap *, cm, A0),
23 AROS_LHA(struct TagItem *, tags, A1),
25 /* LOCATION */
26 struct GfxBase *, GfxBase, 118, Graphics)
28 /* FUNCTION
30 INPUTS
31 cm - pointer to struct ColorMap obtained via GetColorMap()
32 tags - pointer to a table of videocontrol tagitems
34 RESULT
35 error - 0 if no error ocurred in the control operation
36 non-0 if bad colormap pointer, no tagitems or bad tag
37 NOTES
38 Not implemented
40 EXAMPLE
42 BUGS
44 SEE ALSO
46 INTERNALS
48 HISTORY
51 ******************************************************************************/
53 AROS_LIBFUNC_INIT
55 struct TagItem *tstate = tags;
56 struct TagItem *tag;
57 LONG *immediate = NULL;
58 ULONG res = 0;
60 while ((tag = NextTagItem(&tstate))) {
61 switch(tag->ti_Tag) {
63 case VTAG_ATTACH_CM_SET:
64 cm->cm_vp = tag->ti_Data;
65 break;
67 case VTAG_ATTACH_CM_GET:
68 tag->ti_Tag = VTAG_ATTACH_CM_SET;
69 tag->ti_Data = cm->cm_vp;
70 break;
72 case VTAG_VIEWPORTEXTRA_SET:
73 cm->cm_vpe = tag->ti_Data;
74 GfxAssociate(cm->cm_vp, cm->cm_vpe);
75 break;
77 case VTAG_VIEWPORTEXTRA_GET:
78 tag->ti_Tag = VTAG_VIEWPORTEXTRA_SET;
79 tag->ti_Data = cm->cm_vpe;
80 break;
82 case VTAG_NORMAL_DISP_SET:
83 cm->NormalDisplayInfo = tag->ti_Data;
84 break;
86 case VTAG_NORMAL_DISP_GET:
87 tag->ti_Tag = VTAG_NORMAL_DISP_SET;
88 tag->ti_Data = cm->NormalDisplayInfo;
89 break;
91 case VTAG_COERCE_DISP_SET:
92 cm->CoerceDisplayInfo = tag->ti_Data;
93 break;
95 case VTAG_COERCE_DISP_GET:
96 tag->ti_Tag = VTAG_COERCE_DISP_SET;
97 tag->ti_Data = cm->CoerceDisplayInfo;
98 break;
100 case VTAG_PF1_BASE_SET:
101 cm->Bp_0_base = tag->ti_Data;
102 break;
104 case VTAG_PF1_BASE_GET:
105 tag->ti_Tag = VTAG_PF1_BASE_SET;
106 tag->ti_Data = cm->Bp_0_base;
107 break;
109 case VTAG_PF2_BASE_SET:
110 cm->Bp_1_base = tag->ti_Data;
111 break;
113 case VTAG_PF2_BASE_GET:
114 tag->ti_Tag = VTAG_PF2_BASE_SET;
115 tag->ti_Data = cm->Bp_1_base;
116 break;
118 case VTAG_SPODD_BASE_SET:
119 cm->SpriteBase_Odd = tag->ti_Data;
120 break;
122 case VTAG_SPODD_BASE_GET:
123 tag->ti_Tag = VTAG_SPODD_BASE_SET;
124 tag->ti_Data = cm->SpriteBase_Odd;
125 break;
127 case VTAG_SPEVEN_BASE_SET:
128 cm->SpriteBase_Even = tag->ti_Data;
129 /* TODO: propagate this value to the display driver */
130 break;
132 case VTAG_SPEVEN_BASE_GET:
133 tag->ti_Tag = VTAG_SPEVEN_BASE_SET;
134 tag->ti_Data = cm->SpriteBase_Even;
135 break;
137 case VTAG_BORDERSPRITE_SET:
138 cm->Flags |= BORDERSPRITES;
139 break;
141 case VTAG_BORDERSPRITE_CLR:
142 cm->Flags &= ~BORDERSPRITES;
143 break;
145 case VTAG_BORDERSPRITE_GET:
146 /* FIXME: Does AmigaOS do the same? */
147 if (cm->Flags & BORDERSPRITES) {
148 tag->ti_Tag = VTAG_BORDERSPRITE_SET;
149 tag->ti_Data = TRUE;
150 } else {
151 tag->ti_Tag = VTAG_BORDERSPRITE_CLR;
152 tag->ti_Data = FALSE;
154 break;
156 case VTAG_SPRITERESN_SET:
157 cm->SpriteResolution = tag->ti_Data;
158 break;
160 case VTAG_SPRITERESN_GET:
161 tag->ti_Tag = VTAG_SPRITERESN_SET;
162 tag->ti_Data = cm->SpriteResolution;
163 break;
165 /* TODO: Implement these */
166 case VTAG_PF1_TO_SPRITEPRI_SET:
167 break;
169 case VTAG_PF1_TO_SPRITEPRI_GET:
170 tag->ti_Tag = VTAG_PF1_TO_SPRITEPRI_SET;
171 tag->ti_Data = 0;
172 break;
174 case VTAG_PF2_TO_SPRITEPRI_SET:
175 break;
177 case VTAG_PF2_TO_SPRITEPRI_GET:
178 tag->ti_Tag = VTAG_PF2_TO_SPRITEPRI_SET;
179 tag->ti_Data = 0;
180 break;
182 case VTAG_BORDERBLANK_SET:
183 cm->Flags |= BORDER_BLANKING;
184 break;
186 case VTAG_BORDERBLANK_CLR:
187 cm->Flags &= ~BORDER_BLANKING;
188 break;
190 case VTAG_BORDERBLANK_GET:
191 if (cm->Flags & BORDER_BLANKING) {
192 tag->ti_Tag = VTAG_BORDERBLANK_SET;
193 tag->ti_Data = TRUE;
194 } else {
195 tag->ti_Tag = VTAG_BORDERBLANK_CLR;
196 tag->ti_Data = FALSE;
198 break;
200 case VTAG_BORDERNOTRANS_SET:
201 cm->Flags |= BORDER_NOTRANSPARENCY;
202 break;
204 case VTAG_BORDERNOTRANS_CLR:
205 cm->Flags &= ~BORDER_NOTRANSPARENCY;
206 break;
208 case VTAG_BORDERNOTRANS_GET:
209 if (cm->Flags & BORDER_NOTRANSPARENCY) {
210 tag->ti_Tag = VTAG_BORDERNOTRANS_SET;
211 tag->ti_Data = TRUE;
212 } else {
213 tag->ti_Tag = VTAG_BORDERNOTRANS_CLR;
214 tag->ti_Data = FALSE;
216 break;
218 /* TODO: implement these */
219 case VTAG_CHROMAKEY_SET:
220 break;
222 case VTAG_CHROMAKEY_CLR:
223 break;
225 case VTAG_CHROMAKEY_GET:
226 tag->ti_Tag = VTAG_CHROMAKEY_CLR;
227 tag->ti_Data = 0;
228 break;
230 case VTAG_BITPLANEKEY_SET:
231 break;
233 case VTAG_BITPLANEKEY_CLR:
234 break;
236 case VTAG_BITPLANEKEY_GET:
237 tag->ti_Tag = VTAG_BITPLANEKEY_CLR;
238 tag->ti_Data = 0;
239 break;
241 case VTAG_CHROMA_PEN_SET:
242 break;
244 case VTAG_CHROMA_PEN_CLR:
245 break;
247 case VTAG_CHROMA_PEN_GET:
248 tag->ti_Tag = VTAG_CHROMA_PEN_CLR;
249 tag->ti_Data = 0;
250 break;
252 case VTAG_CHROMA_PLANE_SET:
253 break;
255 case VTAG_CHROMA_PLANE_GET:
256 tag->ti_Tag = VTAG_CHROMA_PLANE_SET;
257 tag->ti_Data = 0;
258 break;
260 case VTAG_IMMEDIATE:
261 immediate = tag->ti_Data;
262 break;
264 case VTAG_FULLPALETTE_SET:
265 cm->AuxFlags |= CMAF_FULLPALETTE;
266 break;
268 case VTAG_FULLPALETTE_CLR:
269 cm->AuxFlags &= ~CMAF_FULLPALETTE;
270 break;
272 case VTAG_FULLPALETTE_GET:
273 if (cm->AuxFlags & CMAF_FULLPALETTE) {
274 tag->ti_Tag = VTAG_FULLPALETTE_SET;
275 tag->ti_Data = TRUE;
276 } else {
277 tag->ti_Tag = VTAG_FULLPALETTE_CLR;
278 tag->ti_Data = FALSE;
280 break;
282 case VC_IntermediateCLUpdate:
283 if (tag->ti_Data)
284 cm->AuxFlags &= ~CMAF_NO_INTERMED_UPDATE;
285 else
286 cm->AuxFlags |= CMAF_NO_INTERMED_UPDATE;
287 break;
289 case VC_IntermediateCLUpdate_Query:
290 *(ULONG *)tag->ti_Data = (cm->AuxFlags & CMAF_NO_INTERMED_UPDATE) ? FALSE : TRUE;
291 break;
293 case VC_NoColorPaletteLoad:
294 if (tag->ti_Data)
295 cm->AuxFlags |= CMAF_NO_COLOR_LOAD;
296 else
297 cm->AuxFlags &= ~CMAF_NO_COLOR_LOAD;
298 break;
300 case VC_NoColorPaletteLoad_Query:
301 *(ULONG *)tag->ti_Data = (cm->AuxFlags & CMAF_NO_COLOR_LOAD) ? TRUE : FALSE;
302 break;
304 case VC_DUALPF_Disable:
305 if (tag->ti_Data)
306 cm->AuxFlags |= CMAF_DUALPF_DISABLE;
307 else
308 cm->AuxFlags &= ~CMAF_DUALPF_DISABLE;
309 break;
311 case VC_DUALPF_Disable_Query:
312 *(ULONG *)tag->ti_Data = (cm->AuxFlags & CMAF_DUALPF_DISABLE) ? TRUE : FALSE;
313 break;
315 case VTAG_USERCLIP_SET:
316 cm->Flags |= USER_COPPER_CLIP;
317 break;
319 case VTAG_USERCLIP_CLR:
320 cm->Flags &= ~USER_COPPER_CLIP;
321 break;
323 case VTAG_USERCLIP_GET:
324 if (cm->Flags & USER_COPPER_CLIP) {
325 tag->ti_Tag = VTAG_USERCLIP_SET;
326 tag->ti_Data = TRUE;
327 } else {
328 tag->ti_Tag = VTAG_USERCLIP_CLR;
329 tag->ti_Data = FALSE;
331 break;
333 case VTAG_NEXTBUF_CM:
334 tstate = tag->ti_Data;
335 break;
337 case VTAG_BATCH_CM_SET:
338 cm->Flags |= VIDEOCONTROL_BATCH;
339 break;
341 case VTAG_BATCH_CM_CLR:
342 cm->Flags &= ~VIDEOCONTROL_BATCH;
343 break;
345 case VTAG_BATCH_CM_GET:
346 if (cm->Flags & VIDEOCONTROL_BATCH) {
347 tag->ti_Tag = VTAG_BATCH_CM_SET;
348 tag->ti_Data = TRUE;
349 } else {
350 tag->ti_Tag = VTAG_BATCH_CM_CLR;
351 tag->ti_Data = FALSE;
353 break;
355 case VTAG_BATCH_ITEMS_SET:
356 cm->cm_batch_items = tag->ti_Data;
357 break;
359 /* TODO: implement this */
360 case VTAG_BATCH_ITEMS_ADD:
361 break;
363 case VTAG_BATCH_ITEMS_GET:
364 tag->ti_Tag = VTAG_BATCH_ITEMS_SET;
365 tag->ti_Data = cm->cm_batch_items;
366 break;
368 case VTAG_VPMODEID_SET:
369 cm->VPModeID = tag->ti_Data;
370 break;
372 case VTAG_VPMODEID_CLR:
373 cm->VPModeID = INVALID_ID;
374 break;
376 case VTAG_VPMODEID_GET:
377 tag->ti_Tag = (cm->VPModeID == INVALID_ID) ? VTAG_VPMODEID_CLR : VTAG_VPMODEID_SET;
378 tag->ti_Data = cm->VPModeID;
379 break;
381 default:
382 res = 1;
386 if (immediate) {
388 /* TODO: update SpriteBase in the graphics driver here */
390 *immediate = 0;
393 return res;
395 AROS_LIBFUNC_EXIT
396 } /* VideoControl */