1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
**
** $Id: GetViewModes.S,v 21.1 92/05/15 03:22:48 chris Exp $
** $Revision: 21.1 $
**
** $Filename: GetViewModes.S $
** $Author: chris $
** $Release: 19.1 $
** $Date: 92/05/15 03:22:48 $
**
** iff.library/IFFL_GetViewModes
**
** COPYRIGHT (C) 1987-1992 BY CHRISTIAN A. WEBER, BRUGGERWEG 2,
** CH-8037 ZUERICH, SWITZERLAND. ALL RIGHTS RESERVED. NO PART
** OF THIS SOFTWARE MAY BE COPIED, REPRODUCED, OR TRANSMITTED
** IN ANY FORM OR BY ANY MEANS, WITHOUT THE PRIOR WRITTEN PER-
** MISSION OF THE AUTHOR. USE AT YOUR OWN RISK.
**
IDNT IFFL_GetViewModes
SECTION text,CODE
INCLUDE "IffLib.i"
XREF FindChunkFunc,GetBMHDFunc
XDEF CalcViewModes ; für SaveClip.S
XDEF GetViewModesFunc
******* iff.library/IFFL_GetViewModes ***************************************
*
* NAME
* IFFL_GetViewModes() -- Get Amiga-specific ViewModes
*
* SYNOPSIS
* viewmodes = IFFL_GetViewModes( iff )
* D0 A1
*
* ULONG IFFL_GetViewModes( IFFL_HANDLE )
*
* FUNCTION
* Searches the IFF file for a 'CAMG' chunk which holds the view modes
* information. If there is no CAMG chunk, the view modes are calcu-
* lated using the information in the BitMapHeader structure.
* You can directly put the low WORD of the result of a call to
* IFFL_ GetViewModes() into the ns_ViewModes field of a NewScreen
* structure, or you can use the whole ULONG for the SA_DisplayID tag
* under OS 2.x.
*
* INPUTS
* iff - IFF file handle, from OpenIFF()
*
* RESULT
* viewmodes - ULONG containing the view modes (HAM, LACE, HIRES ...)
* All forbidden bits are masked out, as suggested by CBM.
* Under Kickstart V1.3, only the lower WORD is used.
*
* BUGS
* If the IFF file has no CAMG chunk and 6 bitplanes, the HAM bit
* will be set. This is not always correct since the picture could
* be in the Extra Halfbrite mode. You can load such Halfbrite
* pictures into DPaint III and save them again, DPaint will generate
* the correct CAMG chunk.
*
* SEE ALSO
* <graphics/displayinfo.h>
*
*****************************************************************************
*** Flags, die nur in graphics/view.h aber nicht .i sind (!)
HAM: EQU $0800
SPRITES: EQU $4000
VP_HIDE: EQU $2000
GENLOCK_AUDIO: EQU $0100
GENLOCK_VIDEO: EQU $0002
EXTRA_HALFBRITE: EQU $0080
MODESMASK: EQU ~(SPRITES|VP_HIDE|GENLOCK_AUDIO|GENLOCK_VIDEO)
GetViewModesFunc:
move.l a2,-(SP)
movea.l a1,a2 ; A2 : IFFFile
move.l #'CAMG',d0
bsr FindChunkFunc ; setzt Z-Flag wenn not found
beq.s CalcEm ; not found ---> Berechnen
movea.l d0,a0 ; Zeiger auf CAMG....
move.l 8(a0),d0 ; ViewModes
andi.l #MODESMASK,d0 ; Verbotene Bits ausmaskieren
bra.s Ende ; --->
*** ViewModes aus BMHD berechnen, 0 falls kein CAMG
CalcEm: movea.l a2,a1 ; IFFFile
bsr GetBMHDFunc ; BitMapHeader suchen
;; tst.l d0 ; nicht gefunden?
beq.s Ende ; dann 0 zurückgeben
movea.l d0,a0 ; A0 : BMHD-Struktur
bsr.s CalcViewModes ; ViewModes nach D0
cmpi.b #6,bmh_nPlanes(a0) ; 6 Bitplanes ?
blt.s Ende ; nein --->
bset #11,d0 ; ViewModes |= HAM
Ende:
movea.l (SP)+,a2
rts
*****i* iff.library/CalcViewModes *******************************************
*
* NAME
* CalcViewModes() -- Calculate Amiga-specific ViewModes from a BMHD
*
* SYNOPSIS
* viewmodes = CalcViewModes( bmhd )
* D0 A0
*
* ULONG CalcViewModes( struct IFFL_BMHD )
*
* FUNCTION
* Tries to calculate the viewmodes for a CAMG chunk by looking at
* the bmh_Width, bmh_Height and bmh_Depth entries of a bmhd.
* This is not always satisfactory, but we're stuck with it.
*
* INPUTS
* bmhd - BitMapHeader describing the picture's dimensions
*
* RESULT
* viewmodes - ULONG containing the view modes (LACE, HIRES)
*
* BUGS
* too many to mention
*
* SEE ALSO
* IFFL_GetViewModes(), IFFL_SaveClip()
*
*****************************************************************************
CalcViewModes: moveq.l #0,d0 ; D0 : ViewModes
cmpi.b #4,bmh_nPlanes(a0) ; mehr als 4 Planes ?
bgt.s NotHiRes ; ja ---> nicht HiRes
cmpi.w #400,bmh_Width(a0) ; Bildbreite > 400 ?
ble.s NotHiRes ; nein --->
bset #15,d0 ; ViewModes |= HiRes
NotHiRes:
cmpi.w #320,bmh_Height(a0) ; Bildhöhe > 320 ?
blt.s NotInterlace ; nein --->
bset #2,d0 ; ViewModes |= Interlace
NotInterlace:
rts
END
|