• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

BASIC compiler/interpreter for PIC32MX/MZ-80K


Commit MetaInfo

Revisione287cbed17237ebad4807d3a158ec2b99e0fcb9f (tree)
Time2019-03-11 07:53:39
AuthorKatsumi <kmorimatsu@sour...>
CommiterKatsumi

Log Message

Class CSWTIF for showing TIFF image file(s)

Change Summary

Incremental Difference

--- /dev/null
+++ b/mips/classes/CSWTIF/CSWTIF.BAS
@@ -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)
--- /dev/null
+++ b/mips/classes/CSWTIF/help.txt
@@ -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()