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 /*****************************************************************************
17 #include <proto/graphics.h>
19 AROS_LH2(ULONG
, VideoControl
,
22 AROS_LHA(struct ColorMap
*, cm
, A0
),
23 AROS_LHA(struct TagItem
*, tags
, A1
),
26 struct GfxBase
*, GfxBase
, 118, Graphics
)
31 cm - pointer to struct ColorMap obtained via GetColorMap()
32 tags - pointer to a table of videocontrol tagitems
35 error - 0 if no error ocurred in the control operation
36 non-0 if bad colormap pointer, no tagitems or bad tag
51 ******************************************************************************/
55 struct TagItem
*tstate
= tags
;
57 LONG
*immediate
= NULL
;
60 while ((tag
= NextTagItem(&tstate
))) {
63 case VTAG_ATTACH_CM_SET
:
64 cm
->cm_vp
= tag
->ti_Data
;
67 case VTAG_ATTACH_CM_GET
:
68 tag
->ti_Tag
= VTAG_ATTACH_CM_SET
;
69 tag
->ti_Data
= cm
->cm_vp
;
72 case VTAG_VIEWPORTEXTRA_SET
:
73 cm
->cm_vpe
= tag
->ti_Data
;
74 GfxAssociate(cm
->cm_vp
, cm
->cm_vpe
);
77 case VTAG_VIEWPORTEXTRA_GET
:
78 tag
->ti_Tag
= VTAG_VIEWPORTEXTRA_SET
;
79 tag
->ti_Data
= cm
->cm_vpe
;
82 case VTAG_NORMAL_DISP_SET
:
83 cm
->NormalDisplayInfo
= tag
->ti_Data
;
86 case VTAG_NORMAL_DISP_GET
:
87 tag
->ti_Tag
= VTAG_NORMAL_DISP_SET
;
88 tag
->ti_Data
= cm
->NormalDisplayInfo
;
91 case VTAG_COERCE_DISP_SET
:
92 cm
->CoerceDisplayInfo
= tag
->ti_Data
;
95 case VTAG_COERCE_DISP_GET
:
96 tag
->ti_Tag
= VTAG_COERCE_DISP_SET
;
97 tag
->ti_Data
= cm
->CoerceDisplayInfo
;
100 case VTAG_PF1_BASE_SET
:
101 cm
->Bp_0_base
= tag
->ti_Data
;
104 case VTAG_PF1_BASE_GET
:
105 tag
->ti_Tag
= VTAG_PF1_BASE_SET
;
106 tag
->ti_Data
= cm
->Bp_0_base
;
109 case VTAG_PF2_BASE_SET
:
110 cm
->Bp_1_base
= tag
->ti_Data
;
113 case VTAG_PF2_BASE_GET
:
114 tag
->ti_Tag
= VTAG_PF2_BASE_SET
;
115 tag
->ti_Data
= cm
->Bp_1_base
;
118 case VTAG_SPODD_BASE_SET
:
119 cm
->SpriteBase_Odd
= tag
->ti_Data
;
122 case VTAG_SPODD_BASE_GET
:
123 tag
->ti_Tag
= VTAG_SPODD_BASE_SET
;
124 tag
->ti_Data
= cm
->SpriteBase_Odd
;
127 case VTAG_SPEVEN_BASE_SET
:
128 cm
->SpriteBase_Even
= tag
->ti_Data
;
129 /* TODO: propagate this value to the display driver */
132 case VTAG_SPEVEN_BASE_GET
:
133 tag
->ti_Tag
= VTAG_SPEVEN_BASE_SET
;
134 tag
->ti_Data
= cm
->SpriteBase_Even
;
137 case VTAG_BORDERSPRITE_SET
:
138 cm
->Flags
|= BORDERSPRITES
;
141 case VTAG_BORDERSPRITE_CLR
:
142 cm
->Flags
&= ~BORDERSPRITES
;
145 case VTAG_BORDERSPRITE_GET
:
146 /* FIXME: Does AmigaOS do the same? */
147 if (cm
->Flags
& BORDERSPRITES
) {
148 tag
->ti_Tag
= VTAG_BORDERSPRITE_SET
;
151 tag
->ti_Tag
= VTAG_BORDERSPRITE_CLR
;
152 tag
->ti_Data
= FALSE
;
156 case VTAG_SPRITERESN_SET
:
157 cm
->SpriteResolution
= tag
->ti_Data
;
160 case VTAG_SPRITERESN_GET
:
161 tag
->ti_Tag
= VTAG_SPRITERESN_SET
;
162 tag
->ti_Data
= cm
->SpriteResolution
;
165 /* TODO: Implement these */
166 case VTAG_PF1_TO_SPRITEPRI_SET
:
169 case VTAG_PF1_TO_SPRITEPRI_GET
:
170 tag
->ti_Tag
= VTAG_PF1_TO_SPRITEPRI_SET
;
174 case VTAG_PF2_TO_SPRITEPRI_SET
:
177 case VTAG_PF2_TO_SPRITEPRI_GET
:
178 tag
->ti_Tag
= VTAG_PF2_TO_SPRITEPRI_SET
;
182 case VTAG_BORDERBLANK_SET
:
183 cm
->Flags
|= BORDER_BLANKING
;
186 case VTAG_BORDERBLANK_CLR
:
187 cm
->Flags
&= ~BORDER_BLANKING
;
190 case VTAG_BORDERBLANK_GET
:
191 if (cm
->Flags
& BORDER_BLANKING
) {
192 tag
->ti_Tag
= VTAG_BORDERBLANK_SET
;
195 tag
->ti_Tag
= VTAG_BORDERBLANK_CLR
;
196 tag
->ti_Data
= FALSE
;
200 case VTAG_BORDERNOTRANS_SET
:
201 cm
->Flags
|= BORDER_NOTRANSPARENCY
;
204 case VTAG_BORDERNOTRANS_CLR
:
205 cm
->Flags
&= ~BORDER_NOTRANSPARENCY
;
208 case VTAG_BORDERNOTRANS_GET
:
209 if (cm
->Flags
& BORDER_NOTRANSPARENCY
) {
210 tag
->ti_Tag
= VTAG_BORDERNOTRANS_SET
;
213 tag
->ti_Tag
= VTAG_BORDERNOTRANS_CLR
;
214 tag
->ti_Data
= FALSE
;
218 /* TODO: implement these */
219 case VTAG_CHROMAKEY_SET
:
222 case VTAG_CHROMAKEY_CLR
:
225 case VTAG_CHROMAKEY_GET
:
226 tag
->ti_Tag
= VTAG_CHROMAKEY_CLR
;
230 case VTAG_BITPLANEKEY_SET
:
233 case VTAG_BITPLANEKEY_CLR
:
236 case VTAG_BITPLANEKEY_GET
:
237 tag
->ti_Tag
= VTAG_BITPLANEKEY_CLR
;
241 case VTAG_CHROMA_PEN_SET
:
244 case VTAG_CHROMA_PEN_CLR
:
247 case VTAG_CHROMA_PEN_GET
:
248 tag
->ti_Tag
= VTAG_CHROMA_PEN_CLR
;
252 case VTAG_CHROMA_PLANE_SET
:
255 case VTAG_CHROMA_PLANE_GET
:
256 tag
->ti_Tag
= VTAG_CHROMA_PLANE_SET
;
261 immediate
= tag
->ti_Data
;
264 case VTAG_FULLPALETTE_SET
:
265 cm
->AuxFlags
|= CMAF_FULLPALETTE
;
268 case VTAG_FULLPALETTE_CLR
:
269 cm
->AuxFlags
&= ~CMAF_FULLPALETTE
;
272 case VTAG_FULLPALETTE_GET
:
273 if (cm
->AuxFlags
& CMAF_FULLPALETTE
) {
274 tag
->ti_Tag
= VTAG_FULLPALETTE_SET
;
277 tag
->ti_Tag
= VTAG_FULLPALETTE_CLR
;
278 tag
->ti_Data
= FALSE
;
282 case VC_IntermediateCLUpdate
:
284 cm
->AuxFlags
&= ~CMAF_NO_INTERMED_UPDATE
;
286 cm
->AuxFlags
|= CMAF_NO_INTERMED_UPDATE
;
289 case VC_IntermediateCLUpdate_Query
:
290 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_NO_INTERMED_UPDATE
) ? FALSE
: TRUE
;
293 case VC_NoColorPaletteLoad
:
295 cm
->AuxFlags
|= CMAF_NO_COLOR_LOAD
;
297 cm
->AuxFlags
&= ~CMAF_NO_COLOR_LOAD
;
300 case VC_NoColorPaletteLoad_Query
:
301 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_NO_COLOR_LOAD
) ? TRUE
: FALSE
;
304 case VC_DUALPF_Disable
:
306 cm
->AuxFlags
|= CMAF_DUALPF_DISABLE
;
308 cm
->AuxFlags
&= ~CMAF_DUALPF_DISABLE
;
311 case VC_DUALPF_Disable_Query
:
312 *(ULONG
*)tag
->ti_Data
= (cm
->AuxFlags
& CMAF_DUALPF_DISABLE
) ? TRUE
: FALSE
;
315 case VTAG_USERCLIP_SET
:
316 cm
->Flags
|= USER_COPPER_CLIP
;
319 case VTAG_USERCLIP_CLR
:
320 cm
->Flags
&= ~USER_COPPER_CLIP
;
323 case VTAG_USERCLIP_GET
:
324 if (cm
->Flags
& USER_COPPER_CLIP
) {
325 tag
->ti_Tag
= VTAG_USERCLIP_SET
;
328 tag
->ti_Tag
= VTAG_USERCLIP_CLR
;
329 tag
->ti_Data
= FALSE
;
333 case VTAG_NEXTBUF_CM
:
334 tstate
= tag
->ti_Data
;
337 case VTAG_BATCH_CM_SET
:
338 cm
->Flags
|= VIDEOCONTROL_BATCH
;
341 case VTAG_BATCH_CM_CLR
:
342 cm
->Flags
&= ~VIDEOCONTROL_BATCH
;
345 case VTAG_BATCH_CM_GET
:
346 if (cm
->Flags
& VIDEOCONTROL_BATCH
) {
347 tag
->ti_Tag
= VTAG_BATCH_CM_SET
;
350 tag
->ti_Tag
= VTAG_BATCH_CM_CLR
;
351 tag
->ti_Data
= FALSE
;
355 case VTAG_BATCH_ITEMS_SET
:
356 cm
->cm_batch_items
= tag
->ti_Data
;
359 /* TODO: implement this */
360 case VTAG_BATCH_ITEMS_ADD
:
363 case VTAG_BATCH_ITEMS_GET
:
364 tag
->ti_Tag
= VTAG_BATCH_ITEMS_SET
;
365 tag
->ti_Data
= cm
->cm_batch_items
;
368 case VTAG_VPMODEID_SET
:
369 cm
->VPModeID
= tag
->ti_Data
;
372 case VTAG_VPMODEID_CLR
:
373 cm
->VPModeID
= INVALID_ID
;
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
;
388 /* TODO: update SpriteBase in the graphics driver here */