BASIC compiler/interpreter for PIC32MX/MZ-80K
Révision | e287cbed17237ebad4807d3a158ec2b99e0fcb9f (tree) |
---|---|
l'heure | 2019-03-11 07:53:39 |
Auteur | Katsumi <kmorimatsu@sour...> |
Commiter | Katsumi |
Class CSWTIF for showing TIFF image file(s)
@@ -0,0 +1,272 @@ | ||
1 | +REM CSWTIF.BAS ver 0.1 | |
2 | +REM Class CSWPNG for MachiKania Type M | |
3 | +REM for showing TIFF picture file | |
4 | + | |
5 | +REM FNAME: file name | |
6 | +REM BENDN: if big endian data, 1 | |
7 | +REM PX,PY: picture width and height | |
8 | +REM PD : picture depth (either 4 or 8 bit) | |
9 | +REM SADDR: Strip offset | |
10 | +REM PADDR: Pointer to palette | |
11 | +REM P16 : Start # of 16 color palette | |
12 | +FIELD PRIVATE FNAME,BENDN,PX,PY,PD | |
13 | +FIELD PRIVATE SADDR,PADDR,P16 | |
14 | + | |
15 | +REM FBUFF : file reading buffer (512 bytes) | |
16 | +REM FPNT : file reading point in buffer | |
17 | +REM FDSIZE : valid bytes in buffer | |
18 | +REM SNUM : number of strips | |
19 | +REM NEXTP16: Next 16 color palette | |
20 | +REM Txxxx : Tag information | |
21 | +STATIC PRIVATE FBUFF,FPNT,FDSIZE | |
22 | +STATIC PRIVATE SNUM,NXTP16 | |
23 | +STATIC PRIVATE TTAG,TTYPE,TNUM,TADDR,TVAL | |
24 | + | |
25 | +REM Constructor | |
26 | +METHOD INIT | |
27 | + var i,n | |
28 | + FNAME$=args$(1) | |
29 | + REM Buffer size: 512 bytes | |
30 | + if not(FBUFF) then dim FBUFF(127) | |
31 | + fclose | |
32 | + fopen FNAME$,"r" | |
33 | + FDSIZE=fget(FBUFF,512) | |
34 | + FPNT=0 | |
35 | + REM Check the header | |
36 | + if 0x002a4949=FBUFF(0) then | |
37 | + REM 49 49 2a 00: Intel type TIFF file (little endian) | |
38 | + BENDN=0 | |
39 | + elseif 0x2a004d4d=FBUFF(0) then | |
40 | + REM 4d 4d 00 2a: Motorola type TIFF file (big endian) | |
41 | + BENDN=1 | |
42 | + else | |
43 | + REM Format error | |
44 | + goto FMTERR | |
45 | + endif | |
46 | + FPNT=4 | |
47 | + REM Read Tags address | |
48 | + i=gosub(RDLONG) | |
49 | + if i!=0x00000008 then | |
50 | + fseek i | |
51 | + FDSIZE=fget(FBUFF,512) | |
52 | + FPNT=0 | |
53 | + endif | |
54 | + REM Continue to "read tags" routine | |
55 | + | |
56 | +REM Read tags | |
57 | + REM Read # of tags | |
58 | + n=gosub(RDSHRT) | |
59 | + while n | |
60 | + n=n-1 | |
61 | + gosub RDTAG | |
62 | + if 0x100=TTAG then | |
63 | + REM ImageWidth | |
64 | + PX=TVAL | |
65 | + elseif 0x101=TTAG then | |
66 | + REM ImageLength | |
67 | + PY=TVAL | |
68 | + elseif 0x102=TTAG then | |
69 | + REM BitsPerSample | |
70 | + PD=TVAL | |
71 | + if PD=8 then | |
72 | + REM 256 color mode | |
73 | + elseif PD=4 then | |
74 | + REM 16 color mode | |
75 | + NXTP16=(NXTP16+16) and 0xff | |
76 | + P16=NXTP16 | |
77 | + else | |
78 | + print "must be 256 or 16 colors" | |
79 | + goto FMTERR | |
80 | + endif | |
81 | + elseif 0x106=TTAG then | |
82 | + REM PhotometricInterpratiation | |
83 | + if TVAL!=3 then | |
84 | + print "palette required" | |
85 | + goto FMTERR | |
86 | + endif | |
87 | + elseif 0x111=TTAG then | |
88 | + REM StripOffsets | |
89 | + SNUM=TNUM | |
90 | + SADDR=TADDR | |
91 | + elseif 0x140=TTAG then | |
92 | + REM ColorMap | |
93 | + PADDR=TADDR | |
94 | + endif | |
95 | + wend | |
96 | + if 1<SNUM then | |
97 | + REM Get first strip address | |
98 | + fseek SADDR | |
99 | + FDSIZE=fget(FBUFF,4) | |
100 | + FPNT=0 | |
101 | + SADDR=gosub(RDLONG) | |
102 | + endif | |
103 | + REM all done | |
104 | + REM close file and return | |
105 | + fclose | |
106 | + return | |
107 | + | |
108 | +REM Private method RDTAG | |
109 | +REM for reading tag (total 8 bytes) | |
110 | +LABEL RDTAG | |
111 | + gosub RFSHF | |
112 | + TTAG=gosub(RDSHRT) | |
113 | + TTYPE=gosub(RDSHRT) | |
114 | + TNUM=gosub(RDLONG) | |
115 | + TADDR=gosub(RDLONG) | |
116 | + if 1=TTYPE then | |
117 | + if BENDN then TVAL=TADDR>>24 else TVAL=TADDR and 0xff | |
118 | + elseif 3=TTYPE then | |
119 | + if BENDN then TVAL=TADDR>>16 else TVAL=TADDR and 0xffff | |
120 | + elseif 4=TTYPE then | |
121 | + TVAL=TADDR | |
122 | + endif | |
123 | + return | |
124 | + | |
125 | +REM Private method FMTERR | |
126 | +LABEL FMTERR | |
127 | + print "Not a valid TIFF file" | |
128 | + end | |
129 | + | |
130 | +REM Public method SHOW | |
131 | +METHOD SHOW | |
132 | + var i,p,x,y,z | |
133 | + fclose | |
134 | + fopen FNAME$,"r" | |
135 | + REM Read palette | |
136 | + dim p(128) | |
137 | + fseek PADDR | |
138 | + if 8=PD then | |
139 | + REM 8 bit palette | |
140 | + REM red | |
141 | + FDSIZE=fget(FBUFF,512):FPNT=0 | |
142 | + for i=0 to 255 | |
143 | + poke p+i,gosub(RDSHRT)>>8 | |
144 | + next | |
145 | + REM green | |
146 | + FDSIZE=fget(FBUFF,512):FPNT=0 | |
147 | + for i=256 to 511 | |
148 | + poke p+i,gosub(RDSHRT)>>8 | |
149 | + next | |
150 | + REM blue, then palette | |
151 | + FDSIZE=fget(FBUFF,512):FPNT=0 | |
152 | + for i=0 to 255 | |
153 | + palette i,peek(p+i),peek(p+256+i),gosub(RDSHRT)>>8 | |
154 | + next | |
155 | + else | |
156 | + REM 4 bit palette | |
157 | + FDSIZE=fget(FBUFF,96):FPNT=0 | |
158 | + for i=0 to 47 | |
159 | + poke p+i,gosub(RDSHRT)>>8 | |
160 | + next | |
161 | + for i=0 to 15 | |
162 | + palette i+P16,peek(p+i),peek(p+16+i),peek(p+32+i) | |
163 | + next | |
164 | + endif | |
165 | + delete p | |
166 | + REM Read picture | |
167 | + fseek SADDR | |
168 | + if 8=PD then | |
169 | + REM 8 bit palette | |
170 | + if PX=SYSTEM(22) then | |
171 | + REM Image width is the same as graphic width | |
172 | + fget SYSTEM(105)+SYSTEM(29)*PX,PX*PY | |
173 | + else | |
174 | + REM Image width is shorter than graphic width | |
175 | + z=SYSTEM(22) :REM width of display | |
176 | + p=SYSTEM(105)+z*SYSTEM(29)+SYSTEM(28) :REM Pointer to write | |
177 | + FDSIZE=fget(FBUFF,512):FPNT=0 | |
178 | + if 256<x then | |
179 | + for y=0 to PY-1 | |
180 | + if 256<=FPNT then gosub RFSHF | |
181 | + for x=0 to 191 | |
182 | + poke p+x,peek(FBUFF+FPNT+x) | |
183 | + next | |
184 | + FPNT=FPNT+x | |
185 | + if 256<=FPNT then gosub RFSHF | |
186 | + for x=192 to PX-1 | |
187 | + poke p+x,peek(FBUFF+FPNT+x) | |
188 | + next | |
189 | + FPNT=FPNT+x | |
190 | + p=p+z | |
191 | + next | |
192 | + else | |
193 | + for y=0 to PY-1 | |
194 | + if 256<=FPNT then gosub RFSHF | |
195 | + for x=0 to PX-1 | |
196 | + poke p+x,peek(FBUFF+FPNT+x) | |
197 | + next | |
198 | + FPNT=FPNT+x | |
199 | + p=p+z | |
200 | + next | |
201 | + endif | |
202 | + endif | |
203 | + else | |
204 | + REM 4 bit palette | |
205 | + z=SYSTEM(22) :REM width of display | |
206 | + p=SYSTEM(105)+z*SYSTEM(29)+SYSTEM(28) :REM Pointer to write | |
207 | + FDSIZE=fget(FBUFF,512):FPNT=0 | |
208 | + for y=0 to PY-1 | |
209 | + if 256<=FPNT then gosub RFSHF | |
210 | + for x=0 to PX-1 | |
211 | + if x and 1 then | |
212 | + poke p+x,(peek(FBUFF+FPNT+(x>>1)) and 0x0f)+P16 | |
213 | + else | |
214 | + poke p+x,(peek(FBUFF+FPNT+(x>>1)) >> 4)+P16 | |
215 | + endif | |
216 | + next | |
217 | + p=p+z | |
218 | + FPNT=FPNT+((PX+1)>>1) | |
219 | + next | |
220 | + endif | |
221 | + fclose | |
222 | + return | |
223 | + | |
224 | +REM Private method RFSHF | |
225 | +REM Refresh file buffer to maintain more than 256 bytes data | |
226 | +REM If file is not opened, open it. | |
227 | +LABEL RFSHF | |
228 | + var i | |
229 | + if FPNT<256 then return | |
230 | + if FDSIZE<512 then return | |
231 | + REM Shift 2nd 256 bytes to 1st 256 bytes area | |
232 | + for i=0 to 63 | |
233 | + FBUFF(i)=FBUFF(i+64) | |
234 | + next | |
235 | + FPNT=FPNT-256 | |
236 | + REM Read 2nd 256 bytes from file | |
237 | + FDSIZE=FDSIZE-256+fget(FBUFF+256,256) | |
238 | + return | |
239 | + | |
240 | +REM Private method RDLONG | |
241 | +REM Read big/little endian 4 byte integer | |
242 | +LABEL RDLONG | |
243 | + var i | |
244 | + if BENDN then | |
245 | + i=peek(FBUFF+FPNT)<<24 | |
246 | + i=i or (peek(FBUFF+FPNT+1)<<16) | |
247 | + i=i or (peek(FBUFF+FPNT+2)<<8) | |
248 | + i=i or peek(FBUFF+FPNT+3) | |
249 | + else | |
250 | + i=peek(FBUFF+FPNT) | |
251 | + i=i or (peek(FBUFF+FPNT+1)<<8) | |
252 | + i=i or (peek(FBUFF+FPNT+2)<<16) | |
253 | + i=i or (peek(FBUFF+FPNT+3)<<24) | |
254 | + endif | |
255 | + FPNT=FPNT+4 | |
256 | + return i | |
257 | + | |
258 | +REM Private method RDSHRT | |
259 | +REM Read big/little endian 2 byte integer | |
260 | +LABEL RDSHRT | |
261 | + FPNT=FPNT+2 | |
262 | + if BENDN then | |
263 | + return (peek(FBUFF+FPNT-2)<<8) or peek(FBUFF+FPNT-1) | |
264 | + else | |
265 | + return (peek(FBUFF+FPNT-1)<<8) or peek(FBUFF+FPNT-2) | |
266 | + endif | |
267 | + | |
268 | +REM Private method RDBYTE | |
269 | +REM Read a byte | |
270 | +LABEL RDBYTE | |
271 | + FPNT=FPNT+1 | |
272 | + return peek(FBUFF+FPNT-1) |
@@ -0,0 +1,37 @@ | ||
1 | +<クラス名およびバージョン> | |
2 | +CSWTIF | |
3 | +ver 0.1 | |
4 | + | |
5 | +<ファイル名> | |
6 | +CSWTIF.BAS | |
7 | + | |
8 | +<概要> | |
9 | +TIFF画像表示クラス。TIFF画像は、256色もしくは16色のものに対応。16色TIFF画像は、 | |
10 | +最大で16枚まで表示可能。Type Mに対応。 | |
11 | + | |
12 | +<コンストラクター> | |
13 | +第1引数 | |
14 | + TIFF画像ファイル名。 | |
15 | + | |
16 | +<パブリックフィールド> | |
17 | +なし | |
18 | + | |
19 | +<パブリックメソッド> | |
20 | +SHOW() | |
21 | + グラフィックの現在の表示位置に、指定されたTIFF画像を表示する。 | |
22 | + | |
23 | +<使用例> | |
24 | +16色TIFF画像を3枚表示する例。144x108で16色のTIFF画像ファイルを、"T16H1.TIF", | |
25 | +"T16H2.TIF","T16H3.TIF"というファイル名で3つ用意すること。 | |
26 | + | |
27 | +USECLASS CSWTIF | |
28 | +USEGRAPHIC 5 | |
29 | +P=NEW(CSWTIF,"T16H1.TIF") | |
30 | +Q=NEW(CSWTIF,"T16H2.TIF") | |
31 | +R=NEW(CSWTIF,"T16H3.TIF") | |
32 | +POINT 0,108 | |
33 | +P.SHOW() | |
34 | +POINT 144,0 | |
35 | +Q.SHOW() | |
36 | +POINT 144,108 | |
37 | +R.SHOW() |