Informations sur: Sauvegarde et recuperation d'ecran SCREEN12 en QBasic

Publié par Antoni le 19/05/2006

Description

Sauvegarde et recuperation d'ecran SCREEN12 en QBasic

Code source (langage qbasic)

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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
DECLARE FUNCTION SAVEBMP% (bmpfilename$)
DECLARE FUNCTION loadbmp% (bmpfilename$)
 
TYPE BMPFileHeader
	FileType AS STRING * 2
	Size AS LONG
	Reserved1 AS INTEGER
	Reserved2 AS INTEGER
	OffBits AS LONG
END TYPE
 
TYPE BMPInfoHeader
	Size AS LONG
	Imagewidth AS LONG
	Imageheight AS LONG
	Planes AS INTEGER
	bitcount AS INTEGER
	Compression AS LONG
	SizeImage AS LONG
	XPelsPerMeter AS LONG
	YPelsPerMeter AS LONG
	ClrUsed AS LONG
	ClrImportant AS LONG
END TYPE
'
 
SCREEN 12
 
'draw something
RANDOMIZE TIMER
FOR i% = 0 TO 15
 READ c&
 PALETTE i%, c&
NEXT
DATA &h5,&h10,&h20,&h30
DATA &h500,&h1000,&h2000,&h3000
DATA &h50000,&h100000,&h200000,&h300000
DATA &h50505,&h101010,&h202020,&h303030 
FOR k% = 1 TO 20
	x% = RND * 640 + 1
	y% = RND * 480
	r% = RND * 80 + (80 \\ 8)
	clr% = INT(RND * 4) * 3
	a = RND * 3.141592
	b = RND * 3.141592 / 1.5
	x1% = CINT(COS(a) * SIN(b) * 100)
	y1% = CINT(SIN(a) * SIN(b) * 100)
	z1% = CINT(COS(b) * 100)
	FOR i% = -r% TO r%
		i1% = i% * 100 / CSNG(r%)
		FOR j% = -SQR(r% * r% - i% * i%) TO SQR(r% * r% - i% * i%)
			j1% = j% * 100 / CSNG(r%)
			k1% = SQR(11000 - i1% * i1% - j1% * j1%)
			c! = 3 * (x1% * i1% + j1% * y1% + k1% * z1%) / 10000
			ccc% = 1 + clr% + INT(c!) + (RND > (c! - INT(c!)))
			PSET (x% + i%, y% + j%), ccc%
	 NEXT j%, i%
NEXT
 
PRINT "Saving.."
t! = TIMER
dummy = SAVEBMP("balls.bmp")
PRINT dummy, TIMER - t!
SLEEP 5
CLS
 
PRINT "Loading..."
dummy = loadbmp("balls.bmp")
PRINT dummy
 
 
SLEEP
 
'
'------------------------------------------------------------------
FUNCTION loadbmp% (bmpfilename$)
'returns 0 for success, 1 for file does not exist, 2 for file is not a saved Screen 12
	DIM fh AS BMPFileHeader
	DIM ih AS BMPInfoHeader
	
	f = FREEFILE
	OPEN bmpfilename$ FOR BINARY AS f
	IF LOF(f) = 0 THEN CLOSE #1: KILL bmpfilename$: loadbmp% = 1: EXIT FUNCTION
			 
	GET #f, , fh
	GET #f, , ih
 
IF (ih.Imagewidth <> 640) OR (ih.Imageheight <> 480) OR (ih.bitcount) <> 4 THEN
	loadbmp% = 2: CLOSE f: EXIT FUNCTION
END IF
 
	Buffer$ = SPACE$(64)
 
	GET #f, , Buffer$
	DEF SEG = VARSEG(Buffer$)
	offs& = SADD(Buffer$)
	OUT &H3C8, 0
	FOR i% = 0 TO 15
		OUT &H3C9, PEEK(offs& + 2) \\ 4
		OUT &H3C9, PEEK(offs& + 1) \\ 4
		OUT &H3C9, PEEK(offs&) \\ 4
		offs& = offs& + 4
	NEXT
	
	'Get image
	Buffer$ = SPACE$(320 * 48)
	DEF SEG = VARSEG(Buffer$)
	FOR k% = 9 TO 0 STEP -1
	 GET #f, , Buffer$
	 offs& = SADD(Buffer$)
	FOR i% = 48 * (k% + 1) - 1 TO 48 * k% STEP -1
		FOR j% = 0 TO 639 STEP 2
			PSET (j%, i%), PEEK(offs&) \\ 16
			PSET (j% + 1, i%), PEEK(offs&) AND 15
			offs& = offs& + 1
		NEXT j%, i%
	NEXT k%
	CLOSE f
END FUNCTION
 
'
'------------------------------------------------------------------
FUNCTION SAVEBMP% (bmpfilename$)
'returns 0 for success, 1 for file already exists
	DIM FileHeader AS BMPFileHeader
	DIM InfoHeader AS BMPInfoHeader
	
	' BITMAPFILEHEADER
	FileHeader.FileType = "BM"'BMP format marker
	FileHeader.Size = 640& * 480 \\ 2 + 118
	FileHeader.OffBits = 118
	InfoHeader.Size = 40
	InfoHeader.Imagewidth = 640
	InfoHeader.Imageheight = 480
	InfoHeader.Planes = 1
	InfoHeader.bitcount = 4
	InfoHeader.SizeImage = 640& * 480 \\ 2' Image size in bytes
	InfoHeader.ClrUsed = 16' Colors used in picture
	
		f = FREEFILE
	OPEN bmpfilename$ FOR BINARY AS f
	IF LOF(f) <> 0 THEN CLOSE f: KILL bmpfilename$: SAVEBMP = 1: EXIT FUNCTION
	
	PUT #f, , FileHeader
	PUT #f, , InfoHeader
	
	'Save palette data
	Buffer$ = SPACE$(64)
		OUT &H3C7, 0
		FOR i% = 0 TO 15
		Red% = INP(&H3C9)
		Green% = INP(&H3C9)
		blue% = INP(&H3C9)
		MID$(Buffer$, 4 * i% + 1) = CHR$(blue% * 4) + CHR$(Green% * 4) + CHR$(Red% * 4) + CHR$(0)
	NEXT i%
	PUT #f, , Buffer$
	
	'Save image data-use poke for speed
	Buffer$ = SPACE$(320 * 48)
	DEF SEG = VARSEG(Buffer$)
	FOR k% = 9 TO 0 STEP -1
	offs& = SADD(Buffer$)
	FOR i% = 48 * (k% + 1) - 1 TO 48 * k% STEP -1
		FOR j% = 0 TO 639 STEP 2
			POKE offs&, 16 * POINT(j%, i%) + POINT(j% + 1, i%)
			offs& = offs& + 1
		NEXT j%, i%
		PUT #f, , Buffer$
	NEXT k%
	CLOSE f
END FUNCTION
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,043 s - Crédits - Stats
1 connecté