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 image->usedImage = 1;
93
94 Resource * resource = build_resource_for_sequence( _environment, _image, _frame, _sequence );
95
96 Variable * x1 = variable_retrieve_or_define( _environment, _x1, VT_POSITION, 0 );
97 Variable * y1 = variable_retrieve_or_define( _environment, _y1, VT_POSITION, 0 );
98
99 Variable * realFrame = NULL;
100 Variable * frame = NULL;
101 if ( _frame) {
102 frame = variable_retrieve_or_define( _environment, _frame, VT_BYTE, 0 );
103 realFrame = frame;
104 }
105 Variable * sequence = NULL;
106 if ( _sequence) {
107 sequence = variable_retrieve_or_define( _environment, _sequence, VT_BYTE, 0 );
108 realFrame = frame;
109 }
110
111 switch( resource->type ) {
112 case VT_SEQUENCE:
113 if ( image->bankAssigned != -1 ) {
114
115 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
116 sprintf(alreadyLoadedLabel, "%salready", label );
117
118 char bankWindowId[MAX_TEMPORARY_STORAGE];
119 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
120
121 char bankWindowName[MAX_TEMPORARY_STORAGE];
122 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
123
124 // cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
125 // if ( image->uncompressedSize ) {
126 // bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
127 // } else {
128 // bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
129 // }
130 // cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
131 // cpu_label( _environment, alreadyLoadedLabel );
132
133 Variable * frameSize = variable_temporary( _environment, VT_WORD, "(temporary)");
134 variable_store( _environment, frameSize->name, image->frameSize );
135 Variable * bank = variable_temporary( _environment, VT_BYTE, "(temporary)");
136 variable_store( _environment, bank->name, image->bankAssigned );
137 Variable * offset = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
138
139 if ( !sequence ) {
140 if ( !frame ) {
141 vic2_calculate_sequence_frame_offset(_environment, offset->realName, "", "", image->frameSize, image->frameCount );
142 } else {
143 vic2_calculate_sequence_frame_offset(_environment, offset->realName, "", frame->realName, image->frameSize, image->frameCount );
144 }
145 } else {
146 if ( !frame ) {
147 vic2_calculate_sequence_frame_offset(_environment, offset->realName, sequence->realName, "", image->frameSize, image->frameCount );
148 } else {
149 vic2_calculate_sequence_frame_offset(_environment, offset->realName, sequence->realName, frame->realName, image->frameSize, image->frameCount );
150 }
151 }
152
153 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
154 variable_store( _environment, address->name, image->absoluteAddress );
155 variable_add_inplace_vars( _environment, address->name, offset->name );
156 bank_read_vars_direct( _environment, bank->name, address->name, bankWindowName, frameSize->name );
157
158 Resource resource;
159 resource.realName = strdup( bankWindowName );
160 resource.isAddress = 0;
161
162 vic2_put_image( _environment, &resource, x1->name, y1->name, NULL, NULL, image->frameSize, 0, _flags );
163
164 } else {
165 if ( !sequence ) {
166 if ( !frame ) {
167 vic2_put_image( _environment, resource, x1->name, y1->name, "", "", image->frameSize, image->frameCount, _flags );
168 } else {
169 vic2_put_image( _environment, resource, x1->name, y1->name, frame->realName, "", image->frameSize, image->frameCount, _flags );
170 }
171 } else {
172 if ( !frame ) {
173 vic2_put_image( _environment, resource, x1->name, y1->name, "", sequence->realName, image->frameSize, image->frameCount, _flags );
174 } else {
175 vic2_put_image( _environment, resource, x1->name, y1->name, frame->realName, sequence->realName, image->frameSize, image->frameCount, _flags );
176 }
177 }
178 }
179 break;
180 case VT_IMAGES:
181 if ( image->bankAssigned != -1 ) {
182
183 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
184 sprintf(alreadyLoadedLabel, "%salready", label );
185
186 char bankWindowId[MAX_TEMPORARY_STORAGE];
187 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
188
189 char bankWindowName[MAX_TEMPORARY_STORAGE];
190 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
191
192 // cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
193 // if ( image->uncompressedSize ) {
194 // bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
195 // } else {
196 // bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
197 // }
198 // cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
199 // cpu_label( _environment, alreadyLoadedLabel );
200
201 Variable * frameSize = variable_temporary( _environment, VT_WORD, "(temporary)");
202 variable_store( _environment, frameSize->name, image->frameSize );
203 Variable * bank = variable_temporary( _environment, VT_BYTE, "(temporary)");
204 variable_store( _environment, bank->name, image->bankAssigned );
205 Variable * offset = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
206
207 if ( sequence ) {
208 if ( image->strips ) {
209 realFrame = variable_temporary( _environment, VT_BYTE, "(real frame)" );
210 outline1("LDA %s", sequence->realName);
211 outline0("ASL");
212 outline0("TAY");
213 outline1("LDA #<%sstrip", image->realName);
214 outline0("STA TMPPTR");
215 outline1("LDA #>%sstrip", image->realName);
216 outline0("STA TMPPTR+1");
217 outline0("LDA (TMPPTR),Y" );
218 outline0("STA TMPPTR2");
219 outline0("INY" );
220 outline0("LDA (TMPPTR),Y" );
221 outline0("STA TMPPTR2+1");
222 outline1("LDA (%s)", frame->realName );
223 outline0("TAY" );
224 outline0("LDA (TMPPTR2),Y" );
225 outline1("STA %s", realFrame->realName );
226 } else {
228 }
229 }
230
231 if ( !frame ) {
232 vic2_calculate_sequence_frame_offset(_environment, offset->realName, NULL, "", image->frameSize, 0 );
233 } else {
234 vic2_calculate_sequence_frame_offset(_environment, offset->realName, NULL, realFrame->realName, image->frameSize, 0 );
235 }
236
237 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(temporary)");
238 variable_store( _environment, address->name, image->absoluteAddress );
239 variable_add_inplace_vars( _environment, address->name, offset->name );
240 bank_read_vars_direct( _environment, bank->name, address->name, bankWindowName, frameSize->name );
241
242 Resource resource;
243 resource.realName = strdup( bankWindowName );
244 resource.isAddress = 0;
245
246 vic2_put_image( _environment, &resource, x1->name, y1->name, NULL, NULL, image->frameSize, 0, _flags );
247
248 } else {
249
250 if ( sequence ) {
251 if ( image->strips ) {
252 realFrame = variable_temporary( _environment, VT_BYTE, "(real frame)" );
253 outline1("LDA %s", sequence->realName);
254 outline0("ASL");
255 outline0("TAY");
256 outline1("LDA #<%sstrip", image->realName);
257 outline0("STA TMPPTR");
258 outline1("LDA #>%sstrip", image->realName);
259 outline0("STA TMPPTR+1");
260 outline0("LDA (TMPPTR),Y" );
261 outline0("STA TMPPTR2");
262 outline0("INY" );
263 outline0("LDA (TMPPTR),Y" );
264 outline0("STA TMPPTR2+1");
265 outline1("LDA %s", frame->realName );
266 outline0("TAY" );
267 outline0("LDA (TMPPTR2),Y" );
268 outline1("STA %s", realFrame->realName );
269 } else {
271 }
272 }
273 if ( !frame ) {
274 vic2_put_image( _environment, resource, x1->name, y1->name, "", NULL, image->frameSize, 0, _flags );
275 } else {
276 vic2_put_image( _environment, resource, x1->name, y1->name, realFrame->realName, NULL, image->frameSize, 0, _flags );
277 }
278 }
279 break;
280 case VT_IMAGE:
281 case VT_TARRAY:
282 if ( image->bankAssigned != -1 ) {
283
284 char alreadyLoadedLabel[MAX_TEMPORARY_STORAGE];
285 sprintf(alreadyLoadedLabel, "%salready", label );
286
287 char bankWindowId[MAX_TEMPORARY_STORAGE];
288 sprintf( bankWindowId, "BANKWINDOWID%2.2x", image->residentAssigned );
289
290 char bankWindowName[MAX_TEMPORARY_STORAGE];
291 sprintf( bankWindowName, "BANKWINDOW%2.2x", image->residentAssigned );
292
293 cpu_compare_and_branch_16bit_const( _environment, bankWindowId, image->variableUniqueId, alreadyLoadedLabel, 1 );
294 if ( image->uncompressedSize ) {
295 bank_uncompress_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName );
296 } else {
297 bank_read_semi_var( _environment, image->bankAssigned, image->absoluteAddress, bankWindowName, image->size );
298 }
299 cpu_store_16bit(_environment, bankWindowId, image->variableUniqueId );
300 cpu_label( _environment, alreadyLoadedLabel );
301
302 Resource resource;
303 resource.realName = strdup( bankWindowName );
304 resource.isAddress = 0;
305
306 vic2_put_image( _environment, &resource, x1->name, y1->name, NULL, NULL, 1, 0, _flags );
307 } else {
308 vic2_put_image( _environment, resource, x1->name, y1->name, NULL, NULL, 1, 0, _flags );
309 }
310 break;
311 default:
313 }
314
315
316}
317
318void put_image_vars_imageref( Environment * _environment, char * _image, char * _x1, char * _y1, char * _x2, char * _y2, char * _frame, char * _sequence, char * _flags ) {
319
321
322 Variable * image = variable_retrieve( _environment, _image );
323
324 Variable * x1 = variable_retrieve_or_define( _environment, _x1, VT_POSITION, 0 );
325 Variable * y1 = variable_retrieve_or_define( _environment, _y1, VT_POSITION, 0 );
326 Variable * frame = NULL;
327 if ( _frame) {
328 frame = variable_retrieve_or_define( _environment, _frame, VT_BYTE, 0 );
329 }
330 Variable * sequence = NULL;
331 if ( _sequence) {
332 sequence = variable_retrieve_or_define( _environment, _sequence, VT_BYTE, 0 );
333 }
334
335 Variable * address = variable_temporary( _environment, VT_ADDRESS, "(stub)" );
336
337 if ( !_environment->putImageRefUnsafe ) {
338 outline1("LDA %s", address_displacement( _environment, image->realName, "5") );
339 outline1("BNE %sskipx", label );
340 outline1("JMP %sskip", label );
341 outhead1("%sskipx:", label );
342 }
343
344 // Y = OFFSET
345
346 if ( _sequence ) {
347
348 outline1("LDA %s", image->realName );
349 outline0("STA TMPPTR" );
350 outline1("LDA %s", address_displacement( _environment, image->realName, "1") );
351 outline0("STA TMPPTR+1" );
352
353 outline0("CLC" );
354 outline0("LDA TMPPTR" );
355 outline0("ADC #3" );
356 outline0("STA TMPPTR" );
357 outline0("LDA TMPPTR+1" );
358 outline0("ADC #0" );
359 outline0("STA TMPPTR+1" );
360
361 if ( strlen(_sequence) == 0 ) {
362
363 } else {
364 outline1("LDA %s", sequence->realName );
365 outline0("STA MATHPTR0" );
366 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "10") );
367 }
368 if ( _frame ) {
369 if ( strlen(_frame) == 0 ) {
370
371 } else {
372 outline1("LDA %s", frame->realName );
373 outline0("STA MATHPTR0" );
374 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "8") );
375 }
376 }
377
378 outline0("LDA TMPPTR" );
379 outline1("STA %s", address->realName );
380 outline0("LDA TMPPTR+1" );
381 outline1("STA %s", address_displacement(_environment, address->realName, "1") );
382
383 } else {
384
385 if ( _frame ) {
386
387 outline1("LDA %s", image->realName );
388 outline0("STA TMPPTR" );
389 outline1("LDA %s", address_displacement( _environment, image->realName, "1") );
390 outline0("STA TMPPTR+1" );
391
392 outline0("CLC" );
393 outline0("LDA TMPPTR" );
394 outline0("ADC #3" );
395 outline0("STA TMPPTR" );
396 outline0("LDA TMPPTR+1" );
397 outline0("ADC #0" );
398 outline0("STA TMPPTR+1" );
399 if ( strlen(_frame) == 0 ) {
400
401 } else {
402 outline1("LDA %s", frame->realName );
403 outline0("STA MATHPTR0" );
404 cpu_call_indirect( _environment, address_displacement( _environment, image->realName, "8") );
405 }
406
407 outline0("LDA TMPPTR" );
408 outline1("STA %s", address->realName );
409 outline0("LDA TMPPTR+1" );
410 outline1("STA %s", address_displacement(_environment, address->realName, "1") );
411
412 } else {
413
414 outline1("LDA %s", image->realName );
415 outline1("STA %s", address->realName );
416 outline1("LDA %s", address_displacement( _environment, image->realName, "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 vic2_put_image( _environment, &resource, x1->name, y1->name, NULL, NULL, 1, 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 vic2_calculate_sequence_frame_offset(Environment *_environment, char *_offset, char *_sequence, char *_frame, int _frame_size, int _frame_count)
Definition vic2.c:3931
void vic2_put_image(Environment *_environment, Resource *_image, char *_x, char *_y, char *_frame, char *_sequence, int _frame_size, int _frame_count, char *_flags)
Definition vic2.c:3871