ugBASIC 1.18
An isomorphic BASIC language compiler for retrocomputers
Loading...
Searching...
No Matches
put_image.c
Go to the documentation of this file.
1/*****************************************************************************
2 * ugBASIC - an isomorphic BASIC language compiler for retrocomputers *
3 *****************************************************************************
4 * Copyright 2021-2026 Marco Spedaletti (asimov@mclink.it)
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *----------------------------------------------------------------------------
18 * Concesso in licenza secondo i termini della Licenza Apache, versione 2.0
19 * (la "Licenza"); è proibito usare questo file se non in conformità alla
20 * Licenza. Una copia della Licenza è disponibile all'indirizzo:
21 *
22 * http://www.apache.org/licenses/LICENSE-2.0
23 *
24 * Se non richiesto dalla legislazione vigente o concordato per iscritto,
25 * il software distribuito nei termini della Licenza è distribuito
26 * "COSÌ COM'È", SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o
27 * implicite. Consultare la Licenza per il testo specifico che regola le
28 * autorizzazioni e le limitazioni previste dalla medesima.
29 ****************************************************************************/
30
31/****************************************************************************
32 * INCLUDE SECTION
33 ****************************************************************************/
34
35#include "../../ugbc.h"
36
37/****************************************************************************
38 * CODE SECTION
39 ****************************************************************************/
40
41extern char DATATYPE_AS_STRING[][16];
42
53/* <usermanual>
54@keyword PUT IMAGE
55
56@english
57This function draws an image at a specific position on the screen.
58The programmer can draw on the screen a single image (''IMAGE''), a
59frame of a series of images (''IMAGES'') or a frame of a pose of a
60sequence of images (''SEQUENCES''). In all cases the syntax changes
61slightly.
62
63@italian
64Questa funzione disegna una immagine in una specifica posizione dello schermo.
65Il programmatore può disegnare sullo schermo una singola immagine
66(''IMAGE''), un frame di una serie di immagini (''IMAGES'') oppure
67un frame di una posa di una sequenza di immagini (''SEQUENCES'').
68In tutti i casi la sintassi cambia leggermente.
69
70@syntax PUT IMAGE resource AT [x],[y]
71@syntax PUT IMAGE resource FRAME frame AT [x],[y]
72@syntax PUT IMAGE resource STRIP sequence FRAME frame AT [x],[y]
73
74@example PUT IMAGE airplane AT 10,10
75
76@usedInExample contrib_themill.bas
77@usedInExample defines_screen_01.bas
78@usedInExample images_load_05.bas
79
80@target all
81</usermanual> */
82void put_image_vars_original( Environment * _environment, char * _image, char * _x1, char * _y1, char * _x2, char * _y2, char * _frame, char * _sequence, char * _flags ) {
83
84 if ( _environment->emptyProcedure ) {
85 return;
86 }
87
89
90 Variable * image = variable_retrieve( _environment, _image );
91
92 Resource * resource = build_resource_for_sequence( _environment, _image, _frame, _sequence );
93
94 Variable * x1 = variable_retrieve_or_define( _environment, _x1, VT_POSITION, 0 );
95 Variable * y1 = variable_retrieve_or_define( _environment, _y1, VT_POSITION, 0 );
96 Variable * realFrame = NULL;
97 Variable * frame = NULL;
98 if ( _frame) {
99 frame = variable_retrieve_or_define( _environment, _frame, VT_BYTE, 0 );
100 realFrame = frame;
101 }
102 Variable * sequence = NULL;
103 if ( _sequence) {
104 sequence = variable_retrieve_or_define( _environment, _sequence, VT_BYTE, 0 );
105 realFrame = frame;
106 }
107
108 switch( resource->type ) {
109 case VT_SEQUENCE:
110 if ( image->bankAssigned != -1 ) {
111
112 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
113 sprintf(alreadyLoadedLabel, "%salready", label );
114
115 char bankWindowId[MAX_TEMPORARY_STORAGE];
116 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
117
118 char bankWindowName[MAX_TEMPORARY_STORAGE];
119 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
120
121 // cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
122 // if ( image->uncompressedSize ) {
123 // bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
124 // } else {
125 // bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
126 // }
127 // cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
128 // cpu_label( _environment, alreadyLoadedLabel );
129
130 Variable * frameSize = variable_temporary( _environment, VT_WORD, "(temporary)");
131 variable_store( _environment, frameSize->name, image->frameSize );
132 Variable * bank = variable_temporary( _environment, VT_BYTE, "(temporary)");
133 variable_store( _environment, bank->name, image->bankAssigned );
134 Variable * offset = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
135
136 if ( !sequence ) {
137 if ( !frame ) {
138 vic1_calculate_sequence_frame_offset(_environment, offset->realName, "", "", image->frameSize, image->frameCount );
139 } else {
140 vic1_calculate_sequence_frame_offset(_environment, offset->realName, "", frame->realName, image->frameSize, image->frameCount );
141 }
142 } else {
143 if ( !frame ) {
144 vic1_calculate_sequence_frame_offset(_environment, offset->realName, sequence->realName, "", image->frameSize, image->frameCount );
145 } else {
146 vic1_calculate_sequence_frame_offset(_environment, offset->realName, sequence->realName, frame->realName, image->frameSize, image->frameCount );
147 }
148 }
149
150 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
151 variable_store( _environment, address->name, image->absoluteAddress );
152 variable_add_inplace_vars( _environment, address->name, offset->name );
153 bank_read_vars_direct( _environment, bank->name, address->name, bankWindowName, frameSize->name );
154
155 Resource resource;
156 resource.realName = strdup( bankWindowName );
157 resource.isAddress = 0;
158
159 vic1_put_image( _environment, &resource, x1->realName, y1->realName, NULL, NULL, image->frameSize, 0, _flags );
160
161 } else {
162 if ( !sequence ) {
163 if ( !frame ) {
164 vic1_put_image( _environment, resource, x1->realName, y1->realName, "", "", image->frameSize, image->frameCount, _flags );
165 } else {
166 vic1_put_image( _environment, resource, x1->realName, y1->realName, frame->realName, "", image->frameSize, image->frameCount, _flags );
167 }
168 } else {
169 if ( !frame ) {
170 vic1_put_image( _environment, resource, x1->realName, y1->realName, "", sequence->realName, image->frameSize, image->frameCount, _flags );
171 } else {
172 vic1_put_image( _environment, resource, x1->realName, y1->realName, frame->realName, sequence->realName, image->frameSize, image->frameCount, _flags );
173 }
174 }
175 }
176 break;
177 case VT_IMAGES:
178 if ( image->bankAssigned != -1 ) {
179
180 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
181 sprintf(alreadyLoadedLabel, "%salready", label );
182
183 char bankWindowId[MAX_TEMPORARY_STORAGE];
184 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
185
186 char bankWindowName[MAX_TEMPORARY_STORAGE];
187 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
188
189 // cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
190 // if ( image->uncompressedSize ) {
191 // bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
192 // } else {
193 // bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
194 // }
195 // cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
196 // cpu_label( _environment, alreadyLoadedLabel );
197
198 Variable * frameSize = variable_temporary( _environment, VT_WORD, "(temporary)");
199 variable_store( _environment, frameSize->name, image->frameSize );
200 Variable * bank = variable_temporary( _environment, VT_BYTE, "(temporary)");
201 variable_store( _environment, bank->name, image->bankAssigned );
202 Variable * offset = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
203
204 if ( sequence ) {
205 if ( image->strips ) {
206 realFrame = variable_temporary( _environment, VT_BYTE, "(real frame)" );
207 outline1("LDA %s", sequence->realName);
208 outline0("ASL");
209 outline0("TAY");
210 outline1("LDA #<%sstrip", image->realName);
211 outline0("STA TMPPTR");
212 outline1("LDA #>%sstrip", image->realName);
213 outline0("STA TMPPTR+1");
214 outline0("LDA (TMPPTR),Y" );
215 outline0("STA TMPPTR2");
216 outline0("INY" );
217 outline0("LDA (TMPPTR),Y" );
218 outline0("STA TMPPTR2+1");
219 outline1("LDA %s", frame->realName );
220 outline0("TAY" );
221 outline0("LDA (TMPPTR2),Y" );
222 outline1("STA %s", realFrame->realName );
223 } else {
225 }
226 }
227
228 if ( !frame ) {
229 vic1_calculate_sequence_frame_offset(_environment, offset->realName, NULL, "", image->frameSize, 0 );
230 } else {
231 vic1_calculate_sequence_frame_offset(_environment, offset->realName, NULL, realFrame->realName, image->frameSize, 0 );
232 }
233
234 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
235 variable_store( _environment, address->name, image->absoluteAddress );
236 variable_add_inplace_vars( _environment, address->name, offset->name );
237 bank_read_vars_direct( _environment, bank->name, address->name, bankWindowName, frameSize->name );
238
239 Resource resource;
240 resource.realName = strdup( bankWindowName );
241 resource.isAddress = 0;
242
243 vic1_put_image( _environment, &resource, x1->realName, y1->realName, NULL, NULL, image->frameSize, 0, _flags );
244
245 } else {
246
247 if ( sequence ) {
248 if ( image->strips ) {
249 realFrame = variable_temporary( _environment, VT_BYTE, "(real frame)" );
250 outline1("LDA %s", sequence->realName);
251 outline0("ASL");
252 outline0("TAY");
253 outline1("LDA #<%sstrip", image->realName);
254 outline0("STA TMPPTR");
255 outline1("LDA #>%sstrip", image->realName);
256 outline0("STA TMPPTR+1");
257 outline0("LDA (TMPPTR),Y" );
258 outline0("STA TMPPTR2");
259 outline0("INY" );
260 outline0("LDA (TMPPTR),Y" );
261 outline0("STA TMPPTR2+1");
262 outline1("LDA %s", frame->realName );
263 outline0("TAY" );
264 outline0("LDA (TMPPTR2),Y" );
265 outline1("STA %s", realFrame->realName );
266 } else {
268 }
269 }
270
271 if ( !frame ) {
272 vic1_put_image( _environment, resource, x1->realName, y1->realName, "", NULL, image->frameSize, 0, _flags );
273 } else {
274 vic1_put_image( _environment, resource, x1->realName, y1->realName, realFrame->realName, NULL, image->frameSize, 0, _flags );
275 }
276 }
277 break;
278 case VT_IMAGE:
279 case VT_TARRAY:
280 if ( image->residentAssigned ) {
281
282 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
283 sprintf(alreadyLoadedLabel, "%salready", label );
284
285 char bankWindowId[MAX_TEMPORARY_STORAGE];
286 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
287
288 char bankWindowName[MAX_TEMPORARY_STORAGE];
289 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
290
291 cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
292 if ( image->uncompressedSize ) {
293 bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
294 } else {
295 bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
296 }
297 cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
298 cpu_label( _environment, alreadyLoadedLabel );
299
300 Resource resource;
301 resource.realName = strdup( bankWindowName );
302 resource.isAddress = 0;
303
304 vic1_put_image( _environment, &resource, x1->realName, y1->realName, NULL, NULL, 1, 0, _flags );
305 } else {
306 vic1_put_image( _environment, resource, x1->realName, y1->realName, NULL, NULL, 1, 0, _flags );
307 }
308 break;
309 default:
311 }
312
313
314}
315
316void put_image_vars_imageref( Environment * _environment, char * _image, char * _x1, char * _y1, char * _x2, char * _y2, char * _frame, char * _sequence, char * _flags ) {
317
318
320
321 Variable * image = variable_retrieve( _environment, _image );
322
323 Variable * x1 = variable_retrieve_or_define( _environment, _x1, VT_POSITION, 0 );
324 Variable * y1 = variable_retrieve_or_define( _environment, _y1, VT_POSITION, 0 );
325 Variable * frame = NULL;
326 if ( _frame) {
327 frame = variable_retrieve_or_define( _environment, _frame, VT_BYTE, 0 );
328 }
329 Variable * sequence = NULL;
330 if ( _sequence) {
331 sequence = variable_retrieve_or_define( _environment, _sequence, VT_BYTE, 0 );
332 }
333
334 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(stub)" );
335
336 if ( !_environment->putImageRefUnsafe ) {
337 outline1("LDA %s", address_displacement( _environment, image->realName, "5") );
338 outline1("BNE %sskipx", label );
339 outline1("JMP %sskip", label );
340 outhead1("%sskipx:", label );
341 }
342
343 // Y = OFFSET
344
345 if ( _sequence ) {
346
347 outline1("LDA %s", image->realName );
348 outline0("STA TMPPTR" );
349 outline1("LDA %s", address_displacement( _environment, image->realName, "1") );
350 outline0("STA TMPPTR+1" );
351
352 outline0("CLC" );
353 outline0("LDA TMPPTR" );
354 outline0("ADC #3" );
355 outline0("STA TMPPTR" );
356 outline0("LDA TMPPTR+1" );
357 outline0("ADC #0" );
358 outline0("STA TMPPTR+1" );
359
360 if ( strlen(_sequence) == 0 ) {
361
362 } else {
363 outline1("LDA %s", sequence->realName );
364 outline0("STA MATHPTR0" );
365 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "10") );
366 }
367 if ( _frame ) {
368 if ( strlen(_frame) == 0 ) {
369
370 } else {
371 outline1("LDA %s", frame->realName );
372 outline0("STA MATHPTR0" );
373 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "8") );
374 }
375 }
376
377 outline0("LDA TMPPTR" );
378 outline1("STA %s", address->realName );
379 outline0("LDA TMPPTR+1" );
380 outline1("STA %s", address_displacement(_environment, address->realName, "1") );
381
382 } else {
383
384 if ( _frame ) {
385
386 outline1("LDA %s", image->realName );
387 outline0("STA TMPPTR" );
388 outline1("LDA %s", address_displacement( _environment, image->realName, "1") );
389 outline0("STA TMPPTR+1" );
390
391 outline0("CLC" );
392 outline0("LDA TMPPTR" );
393 outline0("ADC #3" );
394 outline0("STA TMPPTR" );
395 outline0("LDA TMPPTR+1" );
396 outline0("ADC #0" );
397 outline0("STA TMPPTR+1" );
398 if ( strlen(_frame) == 0 ) {
399
400 } else {
401 outline1("LDA %s", frame->realName );
402 outline0("STA MATHPTR0" );
403 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "8") );
404 }
405
406 outline0("LDA TMPPTR" );
407 outline1("STA %s", address->realName );
408 outline0("LDA TMPPTR+1" );
409 outline1("STA %s", address_displacement(_environment, address->realName, "1") );
410
411 } else {
412
413 outline1("LDA %s", image->realName );
414 outline1("STA %s", address->realName );
415 outline1("LDA %s", address_displacement( _environment, image->realName, "1") );
416 outline0("STA TMPPTR+1" );
417 outline1("STA %s", address_displacement(_environment, address->realName, "1") );
418
419 }
420
421 }
422
423 Resource resource;
424 resource.realName = strdup( address->realName );
425 resource.isAddress = 1;
426
427 vic1_put_image( _environment, &resource, x1->realName, y1->realName, NULL, NULL, 0, 0, _flags );
428
429 if ( !_environment->putImageRefUnsafe ) {
430 outhead1("%sskip", label );
431 }
432
433}
434
435void put_image_vars( Environment * _environment, char * _image, char * _x1, char * _y1, char * _x2, char * _y2, char * _frame, char * _sequence, char * _flags ) {
436
437 if ( _environment->emptyProcedure ) {
438 return;
439 }
440
441 Variable * image = variable_retrieve( _environment, _image );
442
443 switch( image->type ) {
444 case VT_IMAGE:
445 case VT_IMAGES:
446 case VT_SEQUENCE:
447 case VT_ADDRESS:
448 put_image_vars_original( _environment, _image, _x1, _y1, _x2, _y2, _frame, _sequence, _flags );
449 break;
450 case VT_IMAGEREF:
451 put_image_vars_imageref( _environment, _image, _x1, _y1, _x2, _y2, _frame, _sequence, _flags );
452 break;
453 default:
455 }
456
457}
458
459void put_image_vars_flags( Environment * _environment, char * _image, char * _x1, char * _y1, char * _x2, char * _y2, char * _frame, char * _sequence, int _flags ) {
460
461 char flagsConstantName[MAX_TEMPORARY_STORAGE]; sprintf( flagsConstantName, "PUTIMAGEFLAGS%4.4x", _flags );
462 char flagsConstantParameter[MAX_TEMPORARY_STORAGE]; sprintf( flagsConstantParameter, "#PUTIMAGEFLAGS%4.4x", _flags );
463
464 Constant * flagsConstant = constant_find( _environment, flagsConstantName );
465
466 if ( !flagsConstant ) {
467 flagsConstant = malloc( sizeof( Constant ) );
468 memset( flagsConstant, 0, sizeof( Constant ) );
469 flagsConstant->name = strdup( flagsConstantName );
470 flagsConstant->realName = strdup( flagsConstantName );
471 flagsConstant->value = _flags;
472 flagsConstant->type = CT_INTEGER;
473 flagsConstant->next = _environment->constants;
474 _environment->constants = flagsConstant;
475 }
476
477 put_image_vars( _environment, _image, _x1, _y1, _x2, _y2, _frame, _sequence, flagsConstantParameter );
478}
void cpu_store_16bit(Environment *_environment, char *_destination, int _value)
CPU 6309: emit code to store 16 bit
Definition 6309.c:1503
void cpu_compare_and_branch_16bit_const(Environment *_environment, char *_source, int _destination, char *_label, int _positive)
CPU 6309: emit code to compare two 8 bit values and jump if they are equal/different
Definition 6309.c:1578
void cpu_label(Environment *_environment, char *_label)
Definition 6309.c:356
void cpu_call_indirect(Environment *_environment, char *_value)
Definition 6309.c:3765
Variable * variable_retrieve(Environment *_environment, char *_name)
Variable * variable_retrieve_or_define(Environment *_environment, char *_name, VariableType _type, int _value)
Resource * build_resource_for_sequence(Environment *_environment, char *_image, char *_frame, char *_sequence)
void variable_add_inplace_vars(Environment *_environment, char *_source, char *_destination)
Add two variable and return the sum of them on the first.
Variable * variable_temporary(Environment *_environment, VariableType _type, char *_meaning)
Define a temporary variable.
Variable * variable_store(Environment *_environment, char *_destination, unsigned int _value)
Store a direct value to a variable.
char * address_displacement(Environment *_environment, char *_address, char *_displacement)
Constant * constant_find(Environment *_environment, char *_name)
int offset
Definition _optimizer.c:681
void put_image_vars_original(Environment *_environment, char *_image, char *_x1, char *_y1, char *_x2, char *_y2, char *_frame, char *_sequence, char *_flags)
Emit ASM code for PUT IMAGE [image] AT [int],[int].
Definition put_image.c:53
void put_image_vars_imageref(Environment *_environment, char *_image, char *_x1, char *_y1, char *_x2, char *_y2, char *_frame, char *_sequence, char *_flags)
Definition put_image.c:289
void put_image_vars_flags(Environment *_environment, char *_image, char *_x1, char *_y1, char *_x2, char *_y2, char *_frame, char *_sequence, int _flags)
Definition put_image.c:430
void put_image_vars(Environment *_environment, char *_image, char *_x1, char *_y1, char *_x2, char *_y2, char *_frame, char *_sequence, char *_flags)
Definition put_image.c:406
void bank_read_semi_var(Environment *_environment, int _bank, int _address1, char *_address2, int _size)
Emit ASM code for instruction BANK READ ....
Definition bank_read.c:50
void bank_read_vars_direct(Environment *_environment, char *_bank, char *_address1, char *_address2, char *_size)
Definition bank_read.c:138
void bank_uncompress_semi_var(Environment *_environment, int _bank, int _address1, char *_address2)
Emit ASM code for instruction BANK UNCOMPRESS ....
char * name
Definition ugbc.h:800
int value
Definition ugbc.h:815
ConstantType type
Definition ugbc.h:805
struct _Constant * next
Definition ugbc.h:832
char * realName
Definition ugbc.h:803
int putImageRefUnsafe
Definition ugbc.h:3271
Constant * constants
Definition ugbc.h:2611
int emptyProcedure
Definition ugbc.h:2932
int isAddress
Definition ugbc.h:557
VariableType type
Definition ugbc.h:559
char * realName
Definition ugbc.h:555
char * name
Definition ugbc.h:979
VariableType type
Definition ugbc.h:988
char * realName
Definition ugbc.h:982
void * malloc(YYSIZE_T)
struct _Resource Resource
#define MAX_TEMPORARY_STORAGE
Definition ugbc.h:563
@ CT_INTEGER
Definition ugbc.h:788
struct _Variable Variable
Structure of a single variable.
struct _Environment Environment
Structure of compilation environment.
@ VT_TARRAY
Definition ugbc.h:480
@ VT_WORD
Definition ugbc.h:455
@ VT_POSITION
Definition ugbc.h:468
@ VT_BYTE
Definition ugbc.h:450
@ VT_IMAGEREF
Definition ugbc.h:537
@ VT_IMAGES
Definition ugbc.h:495
@ VT_ADDRESS
Definition ugbc.h:465
@ VT_IMAGE
Definition ugbc.h:489
@ VT_SEQUENCE
Definition ugbc.h:513
struct _Constant Constant
Structure of a single constant.
#define CRITICAL_CANNOT_PUT_IMAGE_WITHOUT_STRIP(s)
Definition ugbc.h:3855
#define outline0(s)
Definition ugbc.h:4252
#define CRITICAL_PUT_IMAGE_UNSUPPORTED(v, t)
Definition ugbc.h:3532
#define outline1(s, a)
Definition ugbc.h:4253
#define MAKE_LABEL
Definition ugbc.h:3351
#define outhead1(s, a)
Definition ugbc.h:4247
char DATATYPE_AS_STRING[][16]
void vic1_calculate_sequence_frame_offset(Environment *_environment, char *_offset, char *_sequence, char *_frame, int _frame_size, int _frame_count)
Definition vic1.c:1697
void vic1_put_image(Environment *_environment, Resource *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_flags)
Definition vic1.c:1790