2 Copyright © 1995-2010, The AROS Development Team. All rights reserved.
5 Desc: Graphics function VideoControl()
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 #include "graphics_intern.h"
16 /*****************************************************************************
19 #include <proto/graphics.h>
21 AROS_LH2(ULONG
, VideoControl
,
24 AROS_LHA(struct ColorMap
*, cm
, A0
),
25 AROS_LHA(struct TagItem
*, tags
, A1
),
28 struct GfxBase
*, GfxBase
, 118, Graphics
)
33 cm - pointer to struct ColorMap obtained via GetColorMap()
34 tags - pointer to a table of videocontrol tagitems
37 error - 0 if no error ocurred in the control operation
38 non-0 if bad colormap pointer, no tagitems or bad tag
53 ******************************************************************************/
57 const struct TagItem
*tstate
= tags
;
59 LONG
*immediate
= NULL
;
62 while ((tag
= NextTagItem(&tstate
))) {
65 case VTAG_ATTACH_CM_SET
:
66 cm
->cm_vp
= (struct ViewPort
*)tag
->ti_Data
;
69 case VTAG_ATTACH_CM_GET
:
70 tag
->ti_Tag
= VTAG_ATTACH_CM_SET
;
71 tag
->ti_Data
= (STACKIPTR
)cm
->cm_vp
;
74 case VTAG_VIEWPORTEXTRA_SET
:
75 cm
->cm_vpe
= (struct ViewPortExtra
*)tag
->ti_Data
;
76 GfxAssociate(cm
->cm_vp
, &cm
->cm_vpe
->n
);
79 case VTAG_VIEWPORTEXTRA_GET
:
80 tag
->ti_Tag
= VTAG_VIEWPORTEXTRA_SET
;
81 tag
->ti_Data
= (STACKIPTR
)cm
->cm_vpe
;
84 case VTAG_NORMAL_DISP_SET
:
85 cm
->NormalDisplayInfo
= (APTR
)tag
->ti_Data
;
88 case VTAG_NORMAL_DISP_GET
:
89 tag
->ti_Tag
= VTAG_NORMAL_DISP_SET
;
90 tag
->ti_Data
= (STACKIPTR
)cm
->NormalDisplayInfo
;
93 case VTAG_COERCE_DISP_SET
:
94 cm
->CoerceDisplayInfo
= (APTR
)tag
->ti_Data
;
97 case VTAG_COERCE_DISP_GET
:
98 tag
->ti_Tag
= VTAG_COERCE_DISP_SET
;
99 tag
->ti_Data
= (STACKIPTR
)cm
->CoerceDisplayInfo
;
102 case VTAG_PF1_BASE_SET
:
103 cm
->Bp_0_base
= tag
->ti_Data
;
106 case VTAG_PF1_BASE_GET
:
107 tag
->ti_Tag
= VTAG_PF1_BASE_SET
;
108 tag
->ti_Data
= cm
->Bp_0_base
;
111 case VTAG_PF2_BASE_SET
:
112 cm
->Bp_1_base
= tag
->ti_Data
;
115 case VTAG_PF2_BASE_GET
:
116 tag
->ti_Tag
= VTAG_PF2_BASE_SET
;
117 tag
->ti_Data
= cm
->Bp_1_base
;
120 case VTAG_SPODD_BASE_SET
:
121 cm
->SpriteBase_Odd
= tag
->ti_Data
;
124 case VTAG_SPODD_BASE_GET
:
125 tag
->ti_Tag
= VTAG_SPODD_BASE_SET
;
126 tag
->ti_Data
= cm
->SpriteBase_Odd
;
129 case VTAG_SPEVEN_BASE_SET
:
130 cm
->SpriteBase_Even
= tag
->ti_Data
;
131 /* TODO: propagate this value to the display driver */
134 case VTAG_SPEVEN_BASE_GET
:
135 tag
->ti_Tag
= VTAG_SPEVEN_BASE_SET
;
136 tag
->ti_Data
= cm
->SpriteBase_Even
;
139 case VTAG_BORDERSPRITE_SET
:
140 cm
->Flags
|= BORDERSPRITES
;
143 case VTAG_BORDERSPRITE_CLR
:
144 cm
->Flags
&= ~BORDERSPRITES
;
147 case VTAG_BORDERSPRITE_GET
:
148 /* FIXME: Does AmigaOS do the same? */
149 if (cm
->Flags
& BORDERSPRITES
) {
150 tag
->ti_Tag
= VTAG_BORDERSPRITE_SET
;
153 tag
->ti_Tag
= VTAG_BORDERSPRITE_CLR
;
154 tag
->ti_Data
= FALSE
;
158 case VTAG_SPRITERESN_SET
:
159 cm
->SpriteResolution
= tag
->ti_Data
;
162 case VTAG_SPRITERESN_GET
:
163 tag
->ti_Tag
= VTAG_SPRITERESN_SET
;
164 tag
->ti_Data
= cm
->SpriteResolution
;
167 /* TODO: Implement these */
168 case VTAG_PF1_TO_SPRITEPRI_SET
:
171 case VTAG_PF1_TO_SPRITEPRI_GET
:
172 tag
->ti_Tag
= VTAG_PF1_TO_SPRITEPRI_SET
;
176 case VTAG_PF2_TO_SPRITEPRI_SET
:
179 case VTAG_PF2_TO_SPRITEPRI_GET
:
180 tag
->ti_Tag
= VTAG_PF2_TO_SPRITEPRI_SET
;
184 case VTAG_BORDERBLANK_SET
:
185 cm
->Flags
|= BORDER_BLANKING
;
188 case VTAG_BORDERBLANK_CLR
:
189 cm
->Flags
&= ~BORDER_BLANKING
;
192 case VTAG_BORDERBLANK_GET
:
193 if (cm
->Flags
& BORDER_BLANKING
) {
194 tag
->ti_Tag
= VTAG_BORDERBLANK_SET
;
197 tag
->ti_Tag
= VTAG_BORDERBLANK_CLR
;
198 tag
->ti_Data
= FALSE
;
202 case VTAG_BORDERNOTRANS_SET
:
203 cm
->Flags
|= BORDER_NOTRANSPARENCY
;
206 case VTAG_BORDERNOTRANS_CLR
:
207 cm
->Flags
&= ~BORDER_NOTRANSPARENCY
;
210 case VTAG_BORDERNOTRANS_GET
:
211 if (cm
->Flags
& BORDER_NOTRANSPARENCY
) {
212 tag
->ti_Tag
= VTAG_BORDERNOTRANS_SET
;
215 tag
->ti_Tag
= VTAG_BORDERNOTRANS_CLR
;
216 tag
->ti_Data
= FALSE
;
220 /* TODO: implement these */
221 case VTAG_CHROMAKEY_SET
:
224 case VTAG_CHROMAKEY_CLR
:
227 case VTAG_CHROMAKEY_GET
:
228 tag
->ti_Tag
= VTAG_CHROMAKEY_CLR
;
232 case VTAG_BITPLANEKEY_SET
:
235 case VTAG_BITPLANEKEY_CLR
:
238 case VTAG_BITPLANEKEY_GET
:
239 tag
->ti_Tag
= VTAG_BITPLANEKEY_CLR
;
243 case VTAG_CHROMA_PEN_SET
:
246 case VTAG_CHROMA_PEN_CLR
:
249 case VTAG_CHROMA_PEN_GET
:
250 tag
->ti_Tag
= VTAG_CHROMA_PEN_CLR
;
254 case VTAG_CHROMA_PLANE_SET
:
257 case VTAG_CHROMA_PLANE_GET
:
258 tag
->ti_Tag
= VTAG_CHROMA_PLANE_SET
;
263 immediate
= (LONG
*)tag
->ti_Data
;
266 case VTAG_FULLPALETTE_SET
:
267 cm
->AuxFlags
|= CMAF_FULLPALETTE
;
270 case VTAG_FULLPALETTE_CLR
:
271 cm
->AuxFlags
&= ~CMAF_FULLPALETTE
;
274 case VTAG_FULLPALETTE_GET
:
275 if (cm
->AuxFlags
& CMAF_FULLPALETTE
) {
276 tag
->ti_Tag
= VTAG_FULLPALETTE_SET
;
279 tag
->ti_Tag
= VTAG_FULLPALETTE_CLR
;
280 tag
->ti_Data
= FALSE
;
284 case VC_IntermediateCLUpdate
:
286 cm
->AuxFlags
&= ~CMAF_NO_INTERMED_UPDATE
;
288 cm
->AuxFlags
|= CMAF_NO_INTERMED_UPDATE
;
291 case VC_IntermediateCLUpdate_Query
:
292 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_NO_INTERMED_UPDATE
) ? FALSE
: TRUE
;
295 case VC_NoColorPaletteLoad
:
297 cm
->AuxFlags
|= CMAF_NO_COLOR_LOAD
;
299 cm
->AuxFlags
&= ~CMAF_NO_COLOR_LOAD
;
302 case VC_NoColorPaletteLoad_Query
:
303 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_NO_COLOR_LOAD
) ? TRUE
: FALSE
;
306 case VC_DUALPF_Disable
:
308 cm
->AuxFlags
|= CMAF_DUALPF_DISABLE
;
310 cm
->AuxFlags
&= ~CMAF_DUALPF_DISABLE
;
313 case VC_DUALPF_Disable_Query
:
314 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_DUALPF_DISABLE
) ? TRUE
: FALSE
;
317 case VTAG_USERCLIP_SET
:
318 cm
->Flags
|= USER_COPPER_CLIP
;
321 case VTAG_USERCLIP_CLR
:
322 cm
->Flags
&= ~USER_COPPER_CLIP
;
325 case VTAG_USERCLIP_GET
:
326 if (cm
->Flags
& USER_COPPER_CLIP
) {
327 tag
->ti_Tag
= VTAG_USERCLIP_SET
;
330 tag
->ti_Tag
= VTAG_USERCLIP_CLR
;
331 tag
->ti_Data
= FALSE
;
335 case VTAG_NEXTBUF_CM
:
336 tstate
= (const struct TagItem
*)tag
->ti_Data
;
339 case VTAG_BATCH_CM_SET
:
340 cm
->Flags
|= VIDEOCONTROL_BATCH
;
343 case VTAG_BATCH_CM_CLR
:
344 cm
->Flags
&= ~VIDEOCONTROL_BATCH
;
347 case VTAG_BATCH_CM_GET
:
348 if (cm
->Flags
& VIDEOCONTROL_BATCH
) {
349 tag
->ti_Tag
= VTAG_BATCH_CM_SET
;
352 tag
->ti_Tag
= VTAG_BATCH_CM_CLR
;
353 tag
->ti_Data
= FALSE
;
357 case VTAG_BATCH_ITEMS_SET
:
358 cm
->cm_batch_items
= (struct TagItem
*)tag
->ti_Data
;
361 /* TODO: implement this */
362 case VTAG_BATCH_ITEMS_ADD
:
365 case VTAG_BATCH_ITEMS_GET
:
366 tag
->ti_Tag
= VTAG_BATCH_ITEMS_SET
;
367 tag
->ti_Data
= (STACKIPTR
)cm
->cm_batch_items
;
370 case VTAG_VPMODEID_SET
:
371 cm
->VPModeID
= tag
->ti_Data
;
374 case VTAG_VPMODEID_CLR
:
375 cm
->VPModeID
= INVALID_ID
;
378 case VTAG_VPMODEID_GET
:
379 tag
->ti_Tag
= (cm
->VPModeID
== INVALID_ID
) ? VTAG_VPMODEID_CLR
: VTAG_VPMODEID_SET
;
380 tag
->ti_Data
= cm
->VPModeID
;
390 /* TODO: update SpriteBase in the graphics driver here */