Initial revision
[ssr] / StraySrc / Libraries / Steel / c / sprite
1 /************************************************************************/
2 /* © Acorn Computers Ltd, 1992. */
3 /* */
4 /* This file forms part of an unsupported source release of RISC_OSLib. */
5 /* */
6 /* It may be freely used to create executable images for saleable */
7 /* products but cannot be sold in source form or as an object library */
8 /* without the prior written consent of Acorn Computers Ltd. */
9 /* */
10 /* If this file is re-distributed (even if modified) it should retain */
11 /* this copyright notice. */
12 /* */
13 /************************************************************************/
14
15 /*
16 * Title : c.sprite
17 * Purpose: provide access to RISC OS sprite facilities
18 * History: IDJ: 07-Feb-92: prepared for source release
19 *
20 */
21
22
23 #include <stddef.h>
24 #include "h.os"
25
26 #include "h.sprite"
27
28
29 /* Basic primitive used by sprite_xxx calls */
30
31 #define OS_SpriteOp 0x2E
32
33 #define ScreenSave 2
34 #define ScreenLoad 3
35
36 #define ReadAreaCB 8 /* *SInfo */
37 #define ClearSprites 9 /* *SNew */
38 #define LoadSpriteFile 10 /* *SLoad <filename> */
39 #define MergeSpriteFile 11 /* *SMerge <filename> */
40 #define SaveSpriteFile 12 /* *SSave <filename> */
41 #define ReturnName 13
42 #define GetSprite 14 /* *SGet <n> */
43 #define CreateSprite 15
44 #define GetSpriteUserCoords 16
45
46 #define SelectSprite 24 /* *SChoose <n> [<m>] */
47 #define DeleteSprite 25 /* *SDelete <n> */
48 #define RenameSprite 26 /* *SRename */
49 #define CopySprite 27
50 #define PutSprite 28
51 #define CreateMask 29
52 #define RemoveMask 30
53 #define InsertRow 31
54 #define DeleteRow 32
55 #define FlipAboutXAxis 33
56 #define PutSpriteUserCoords 34
57 #define AppendSprite 35
58 #define SetPointerShape 36
59
60 #define ReadSpriteSize 40
61 #define ReadPixelColour 41
62 #define WritePixelColour 42
63 #define ReadPixelMask 43
64 #define WritePixelMask 44
65 #define InsertCol 45
66 #define DeleteCol 46
67 #define FlipAboutYAxis 47
68 #define PlotMask 48
69 #define PlotMaskUserCoords 49
70
71 #define PlotMaskScaled 50
72 #define PaintCharScaled 51
73 #define PutSpriteScaled 52
74 #define PutSpriteGreyScaled 53
75 #define RemoveLeftHandWastage 54
76 #define PlotMaskTransformed 55
77 #define PutSpriteTransformed 56
78 #define InsertDeleteRows 57
79 #define InsertDeleteColumns 58
80
81 #define SwitchOutputToSprite 60
82 #define SwitchOutputToMask 61
83 #define ReadSaveAreaSize 62
84
85 #define BadReasonCode 63
86
87 #pragma no_check_stack
88
89 static os_error * sprite__op(os_regset *r)
90 {
91 return os_swix(OS_SpriteOp, r);
92 }
93
94
95 /******** Simple operations, use no sprite area, no name/sprite pointer ***/
96
97
98 os_error * sprite_screensave(const char *filename, sprite_palflag palflag)
99 {
100 os_regset r;
101 os_error *result;
102 r.r[0] = 2;
103 /*r.r[1] unused */
104 r.r[2] = (int) filename;
105 r.r[3] = palflag;
106 result = sprite__op(&r);
107 return result;
108 }
109
110
111 os_error * sprite_screenload(const char *filename)
112 {
113 os_regset r;
114 os_error *result;
115 r.r[0] = 3;
116 /*r.r[1] unused */
117 r.r[2] = (int) filename;
118 result = sprite__op(&r);
119 return result;
120 }
121
122
123 /****** Operations on either system/user area, no name/sprite pointer *****/
124
125 static void setfromarea(int op, sprite_area *area, os_regset *r)
126 {
127 if (area == sprite_mainarea)
128 {
129 r->r[0] = op;
130 /* r->r[1] unused */
131 }
132 else
133 {
134 r->r[0] = op + 256;
135 r->r[1] = (int) area;
136 }
137 }
138
139
140 void sprite_area_initialise(sprite_area *area, int length)
141 {
142 area->size = length; /* No SpriteOp to do this ! */
143 area->number = 0;
144 area->sproff = 16;
145 area->freeoff = 16;
146 }
147
148
149 os_error * sprite_area_readinfo(sprite_area *area, sprite_area *resultarea)
150 {
151 os_regset r;
152 os_error *result;
153 setfromarea(8, area, &r);
154 result = sprite__op(&r);
155 if (result == NULL) /* Only return result if no error */
156 {
157 resultarea->size = r.r[2];
158 resultarea->number = r.r[3];
159 resultarea->sproff = r.r[4];
160 resultarea->freeoff = r.r[5];
161 }
162 return result;
163 }
164
165
166 os_error * sprite_area_reinit(sprite_area *area)
167 {
168 os_regset r;
169 os_error *result;
170 setfromarea(9, area, &r);
171 result = sprite__op(&r);
172 return result;
173 }
174
175
176 os_error * sprite_area_save(sprite_area *area, const char *filename)
177 {
178 os_regset r;
179 os_error *result;
180 setfromarea(12, area, &r);
181 r.r[2] = (int) filename;
182 result = sprite__op(&r);
183 return result;
184 }
185
186
187 os_error * sprite_area_load(sprite_area *area, const char *filename)
188 {
189 os_regset r;
190 os_error *result;
191 setfromarea(10, area, &r);
192 r.r[2] = (int) filename;
193 result = sprite__op(&r);
194 return result;
195 }
196
197
198 os_error * sprite_area_merge(sprite_area *area, const char *filename)
199 {
200 os_regset r;
201 os_error *result;
202 setfromarea(11, area, &r);
203 r.r[2] = (int) filename;
204 result = sprite__op(&r);
205 return result;
206 }
207
208
209 os_error * sprite_getname(sprite_area *area, void *buffer,
210 int *length, int index)
211 {
212 os_regset r;
213 os_error *result;
214 setfromarea(13, area, &r);
215 r.r[2] = (int) buffer;
216 r.r[3] = *length;
217 r.r[4] = index;
218 result = sprite__op(&r);
219 if (result == NULL) /* Only return result if no error */
220 {
221 *length = r.r[3];
222 }
223 return result;
224 }
225
226
227 os_error * sprite_get(sprite_area *area, char *name, sprite_palflag palflag)
228 {
229 os_regset r;
230 os_error *result;
231 setfromarea(14, area, &r);
232 r.r[2] = (int) name;
233 r.r[3] = palflag;
234 result = sprite__op(&r);
235 return result;
236 }
237
238
239 os_error * sprite_get_rp(sprite_area *area, char *name, sprite_palflag palflag,
240 sprite_ptr *resultaddress)
241 {
242 os_regset r;
243 os_error *result;
244 setfromarea(14, area, &r);
245 r.r[2] = (int) name;
246 r.r[3] = palflag;
247 result = sprite__op(&r);
248 if (result == NULL) /* Only return result if no error */
249 {
250 *resultaddress = (void *) r.r[2];
251 }
252 return result;
253 }
254
255
256 os_error * sprite_get_given(sprite_area *area, char *name,
257 sprite_palflag palflag,
258 int x0, int y0, int x1, int y1)
259 {
260 os_regset r;
261 os_error *result;
262 setfromarea(16, area, &r);
263 r.r[2] = (int) name;
264 r.r[3] = palflag;
265 r.r[4] = x0;
266 r.r[5] = y0;
267 r.r[6] = x1;
268 r.r[7] = y1;
269 result = sprite__op(&r);
270 return result;
271 }
272
273
274 os_error * sprite_get_given_rp(sprite_area *area, char *name,
275 sprite_palflag palflag, int x0, int y0,
276 int x1, int y1, sprite_ptr *resultaddress)
277 {
278 os_regset r;
279 os_error *result;
280 setfromarea(16, area, &r);
281 r.r[2] = (int) name;
282 r.r[3] = palflag;
283 r.r[4] = x0;
284 r.r[5] = y0;
285 r.r[6] = x1;
286 r.r[7] = y1;
287 result = sprite__op(&r);
288 if (result == NULL) /* Only return result if no error */
289 {
290 *resultaddress = (void *) r.r[2];
291 }
292 return result;
293 }
294
295
296 os_error * sprite_create(sprite_area *area, char *name, sprite_palflag palflag,
297 int width, int height, int mode)
298 {
299 os_regset r;
300 os_error *result;
301 setfromarea(15, area, &r); /* NB. Not all done in numeric order !! */
302 r.r[2] = (int) name;
303 r.r[3] = palflag;
304 r.r[4] = width;
305 r.r[5] = height;
306 r.r[6] = mode;
307 result = sprite__op(&r);
308 return result;
309 }
310
311
312 os_error * sprite_create_rp(sprite_area *area, char *name,
313 sprite_palflag palflag,
314 int width, int height, int mode,
315 sprite_ptr *resultaddress)
316 {
317 os_regset r;
318 os_error *result;
319 setfromarea(15, area, &r); /* NB. Not all done in numeric order !! */
320 r.r[2] = (int) name;
321 r.r[3] = palflag;
322 r.r[4] = width;
323 r.r[5] = height;
324 r.r[6] = mode;
325 result = sprite__op(&r);
326 if (result == NULL) /* Only return result if no error */
327 {
328 /* spriteop 15 doesn't return pointer to sprite in r2, so....*/
329 /* select the sprite just created (gets its address in r2) */
330 setfromarea(24, area, &r);
331 r.r[2] = (int)name;
332 result = sprite__op(&r);
333 if (result == NULL)
334 *resultaddress = (void *) r.r[2];
335 }
336 return result;
337 }
338
339
340 /*********** Operations on system/user area, name/sprite pointer **********/
341
342 /* Modify op if using sprite address is address, not name */
343 /* But only if using own sprite area */
344
345 static void setfromtag(int op, sprite_area *area, sprite_id *spr, os_regset *r)
346 {
347 if (area == sprite_mainarea)
348 {
349 r->r[0] = op;
350 /* r->r[1] unused */
351 }
352 else
353 {
354 r->r[1] = (int) area;
355 if ((spr->tag) == sprite_id_addr)
356 {
357 r->r[0] = 512 + op;
358 r->r[2] = (int) (spr->s.addr);
359 }
360 else
361 {
362 r->r[0] = 256 + op;
363 r->r[2] = (int) (spr->s.name);
364 }
365 }
366 }
367
368
369 os_error * sprite_readinfo(sprite_area *area, sprite_id *spr,
370 sprite_info *resultinfo)
371 {
372 os_regset r;
373 os_error *result;
374 setfromtag(40, area, spr, &r);
375 result = sprite__op(&r);
376 if (result == NULL) /* Only return result if no error */
377 {
378 resultinfo->width = r.r[3];
379 resultinfo->height = r.r[4];
380 resultinfo->mask = r.r[5];
381 resultinfo->mode = r.r[6];
382 }
383 return result;
384 }
385
386
387 os_error * sprite_select(sprite_area *area, sprite_id *spr)
388 {
389 os_regset r;
390 os_error *result;
391 setfromtag(24, area, spr, &r);
392 result = sprite__op(&r);
393 return result;
394 }
395
396
397 os_error * sprite_select_rp(sprite_area *area, sprite_id *spr,
398 sprite_ptr *resultaddress)
399 {
400 os_regset r;
401 os_error *result;
402 setfromtag(24, area, spr, &r);
403 result = sprite__op(&r);
404 if (result == NULL) /* Only return result if no error */
405 {
406 *resultaddress = (void *) r.r[2];
407 }
408 return result;
409 }
410
411
412 os_error * sprite_delete(sprite_area *area, sprite_id *spr)
413 {
414 os_regset r;
415 os_error *result;
416 setfromtag(25, area, spr, &r);
417 result = sprite__op(&r);
418 return result;
419 }
420
421
422 os_error * sprite_rename(sprite_area *area, sprite_id *spr, char *newname)
423 {
424 os_regset r;
425 os_error *result;
426 setfromtag(26, area, spr, &r);
427 r.r[3] = (int) newname;
428 result = sprite__op(&r);
429 return result;
430 }
431
432
433 os_error * sprite_copy(sprite_area *area, sprite_id *spr, char *copyname)
434 {
435 os_regset r;
436 os_error *result;
437 setfromtag(27, area, spr, &r);
438 r.r[3] = (int) copyname;
439 result = sprite__op(&r);
440 return result;
441 }
442
443
444 os_error * sprite_put(sprite_area *area, sprite_id *spr, int gcol_action)
445 {
446 os_regset r;
447 os_error *result;
448 setfromtag(28, area, spr, &r);
449 r.r[5] = gcol_action;
450 result = sprite__op(&r);
451 return result;
452 }
453
454
455 os_error * sprite_put_given(sprite_area *area, sprite_id *spr, int gcol_action,
456 int x, int y)
457 {
458 os_regset r;
459 os_error *result;
460 setfromtag(34, area, spr, &r);
461 r.r[3] = x;
462 r.r[4] = y;
463 r.r[5] = gcol_action;
464 result = sprite__op(&r);
465 return result;
466 }
467
468
469 os_error * sprite_put_scaled(sprite_area *area, sprite_id *spr,
470 int gcol_action,
471 int x, int y,
472 sprite_factors *factors,
473 sprite_pixtrans *pixtrans)
474 {
475 os_regset r;
476 os_error *result;
477 setfromtag(52, area, spr, &r);
478 r.r[3] = x;
479 r.r[4] = y;
480 r.r[5] = gcol_action;
481 r.r[6] = (int) factors;
482 r.r[7] = (int) pixtrans;
483 result = sprite__op(&r);
484 return result;
485 }
486
487
488 os_error * sprite_put_greyscaled(sprite_area *area, sprite_id *spr,
489 int x, int y,
490 sprite_factors *factors,
491 sprite_pixtrans *pixtrans)
492 {
493 os_regset r;
494 os_error *result;
495 setfromtag(53, area, spr, &r);
496 r.r[3] = x;
497 r.r[4] = y;
498 r.r[5] = 0; /* doesn't support mask or gcol action */
499 r.r[6] = (int) factors;
500 r.r[7] = (int) pixtrans;
501 result = sprite__op(&r);
502 return result;
503 }
504
505
506 os_error * sprite_put_mask(sprite_area *area, sprite_id *spr)
507 {
508 os_regset r;
509 os_error *result;
510 setfromtag(48, area, spr, &r);
511 result = sprite__op(&r);
512 return result;
513 }
514
515
516 os_error * sprite_put_mask_given(sprite_area *area, sprite_id *spr,
517 int x, int y)
518 {
519 os_regset r;
520 os_error *result;
521 setfromtag(49, area, spr, &r);
522 r.r[3] = x;
523 r.r[4] = y;
524 result = sprite__op(&r);
525 return result;
526 }
527
528
529 os_error * sprite_put_mask_scaled(sprite_area *area, sprite_id *spr,
530 int x, int y,
531 sprite_factors *factors)
532 {
533 os_regset r;
534 os_error *result;
535 setfromtag(50, area, spr, &r);
536 r.r[3] = x;
537 r.r[4] = y;
538 r.r[6] = (int) factors;
539 result = sprite__op(&r);
540 return result;
541 }
542
543
544 os_error * sprite_put_char_scaled(char ch,
545 int x, int y,
546 sprite_factors *factors)
547 {
548 os_regset r;
549 os_error *result;
550 r.r[0] = 51;
551 r.r[1] = ch;
552 r.r[3] = x;
553 r.r[4] = y;
554 r.r[6] = (int) factors;
555 result = sprite__op(&r);
556 return result;
557 }
558
559
560 os_error * sprite_create_mask(sprite_area *area, sprite_id *spr)
561 {
562 os_regset r;
563 os_error *result;
564 setfromtag(29, area, spr, &r);
565 result = sprite__op(&r);
566 return result;
567 }
568
569
570 os_error * sprite_remove_mask(sprite_area *area, sprite_id *spr)
571 {
572 os_regset r;
573 os_error *result;
574 setfromtag(30, area, spr, &r);
575 result = sprite__op(&r);
576 return result;
577 }
578
579
580 os_error * sprite_insert_row(sprite_area *area, sprite_id *spr, int row)
581 {
582 os_regset r;
583 os_error *result;
584 setfromtag(31, area, spr, &r);
585 r.r[3] = row;
586 result = sprite__op(&r);
587 return result;
588 }
589
590
591 os_error * sprite_delete_row(sprite_area *area, sprite_id *spr, int row)
592 {
593 os_regset r;
594 os_error *result;
595 setfromtag(32, area, spr, &r);
596 r.r[3] = row;
597 result = sprite__op(&r);
598 return result;
599 }
600
601
602 os_error * sprite_insert_column(sprite_area *area, sprite_id *spr, int column)
603 {
604 os_regset r;
605 os_error *result;
606 setfromtag(45, area, spr, &r);
607 r.r[3] = column;
608 result = sprite__op(&r);
609 return result;
610 }
611
612
613 os_error * sprite_delete_column(sprite_area *area, sprite_id *spr, int column)
614 {
615 os_regset r;
616 os_error *result;
617 setfromtag(46, area, spr, &r);
618 r.r[3] = column;
619 result = sprite__op(&r);
620 return result;
621 }
622
623
624 os_error * sprite_flip_x(sprite_area *area, sprite_id *spr)
625 {
626 os_regset r;
627 os_error *result;
628 setfromtag(33, area, spr, &r);
629 result = sprite__op(&r);
630 return result;
631 }
632
633
634 os_error * sprite_flip_y(sprite_area *area, sprite_id *spr)
635 {
636 os_regset r;
637 os_error *result;
638 setfromtag(47, area, spr, &r);
639 result = sprite__op(&r);
640 return result;
641 }
642
643 os_error * sprite_readsize(sprite_area *area, sprite_id *spr,
644 sprite_info *resultinfo)
645 {
646 os_regset r;
647 os_error *result;
648 setfromtag(40, area, spr, &r);
649 result = sprite__op(&r);
650 /* now copy returned data */
651 resultinfo->width = r.r[3] ;
652 resultinfo->height = r.r[4] ;
653 resultinfo->mask = r.r[5] ;
654 resultinfo->mode = r.r[6] ;
655 return result;
656 }
657
658 os_error * sprite_readpixel(sprite_area *area, sprite_id *spr, int x, int y,
659 sprite_colour *resultcolour)
660 {
661 os_regset r;
662 os_error *result;
663 setfromtag(41, area, spr, &r);
664 r.r[3] = x;
665 r.r[4] = y;
666 result = sprite__op(&r);
667 if (result == NULL) /* Only return result if no error */
668 {
669 resultcolour->colour = r.r[5];
670 resultcolour->tint = r.r[6];
671 }
672 return result;
673 }
674
675
676 os_error * sprite_writepixel(sprite_area *area, sprite_id *spr, int x, int y,
677 sprite_colour *colour)
678 {
679 os_regset r;
680 os_error *result;
681 setfromtag(42, area, spr, &r);
682 r.r[3] = x;
683 r.r[4] = y;
684 r.r[5] = colour->colour;
685 r.r[6] = colour->tint;
686 result = sprite__op(&r);
687 return result;
688 }
689
690
691 os_error * sprite_readmask(sprite_area *area, sprite_id *spr, int x, int y,
692 sprite_maskstate *resultmaskstate)
693 {
694 os_regset r;
695 os_error *result;
696 setfromtag(43, area, spr, &r);
697 r.r[3] = x;
698 r.r[4] = y;
699 result = sprite__op(&r);
700 if (result == NULL) /* Only return result if no error */
701 {
702 *resultmaskstate = r.r[5];
703 }
704 return result;
705 }
706
707
708 os_error * sprite_writemask(sprite_area *area, sprite_id *spr, int x, int y,
709 sprite_maskstate *maskstate)
710 {
711 os_regset r;
712 os_error *result;
713 setfromtag(44, area, spr, &r);
714 r.r[3] = x;
715 r.r[4] = y;
716 r.r[5] = (int) (*maskstate); /* Use pointer here for consistent interface */
717 result = sprite__op(&r);
718 return result;
719 }
720
721 os_error *sprite_restorestate(sprite_state state)
722 {
723 os_regset r;
724 os_error *result;
725
726 r.r[0] = state.r[0];
727 r.r[1] = state.r[1];
728 r.r[2] = state.r[2];
729 r.r[3] = state.r[3];
730
731 result = sprite__op(&r);
732 return result;
733 }
734
735 os_error *sprite_outputtosprite(sprite_area *area, sprite_id *id,
736 int *save_area, sprite_state *state)
737 {
738 os_regset r;
739 os_error *result;
740
741 setfromtag(0x3c, area, id, &r);
742 r.r[3] = (int) save_area;
743
744 result = sprite__op(&r);
745 if (result == NULL)
746 {
747 state->r[0] = r.r[0];
748 state->r[1] = r.r[1];
749 state->r[2] = r.r[2];
750 state->r[3] = r.r[3];
751 }
752 return result;
753 }
754
755 os_error *sprite_outputtomask(sprite_area *area, sprite_id *id,
756 int *save_area, sprite_state *state)
757 {
758 os_regset r;
759 os_error *result;
760
761 setfromtag(0x3d, area, id, &r);
762 r.r[3] = (int) save_area;
763
764 result = sprite__op(&r);
765 if (result == NULL)
766 {
767 state->r[0] = r.r[0];
768 state->r[1] = r.r[1];
769 state->r[2] = r.r[2];
770 state->r[3] = r.r[3];
771 }
772 return result;
773 }
774
775 os_error *sprite_outputtoscreen(int *save_area, sprite_state *state)
776 {
777 os_regset r;
778 os_error *result;
779
780 r.r[0] = 0x3c;
781 r.r[2] = 0;
782 r.r[3] = (int)save_area;
783
784 result = sprite__op(&r);
785 if (result == NULL)
786 {
787 state->r[0] = r.r[0];
788 state->r[1] = r.r[1];
789 state->r[2] = r.r[2];
790 state->r[3] = r.r[3];
791 }
792 return result;
793
794 }
795
796 os_error *sprite_sizeof_spritecontext(sprite_area *area, sprite_id *id,
797 int *size)
798 {
799 os_regset r;
800 os_error *result;
801
802 setfromtag(0x3e, area, id, &r);
803
804 result = sprite__op(&r);
805
806 if (result == NULL)
807 *size = r.r[3];
808
809 return result;
810 }
811
812
813 os_error *sprite_sizeof_screencontext(int *size)
814 {
815 os_regset r;
816 os_error *result;
817
818 r.r[0] = 0x3e;
819 r.r[2] = 0;
820
821 result = sprite__op(&r);
822
823 if (result == NULL)
824 *size = r.r[3];
825
826 return result;
827 }
828
829 os_error *sprite_removewastage(sprite_area *area, sprite_id *id)
830 {
831 os_regset r;
832 os_error *result;
833
834 setfromtag(0x36, area, id, &r);
835
836 result = sprite__op(&r);
837
838 return result;
839 }
840
841 os_error *sprite_change_size (sprite_area *area,
842 sprite_id *id,
843 BOOL rows,
844 int at,
845 int number)
846 {
847 os_regset reg_set;
848 setfromtag (rows? InsertDeleteRows: InsertDeleteColumns, area, id, &reg_set);
849 reg_set.r [3] = at;
850 reg_set.r [4] = number;
851 return sprite__op (&reg_set);
852 }
853
854 os_error *sprite_put_mask_trans (sprite_area *area,
855 sprite_id *id,
856 sprite_box *box,
857 sprite_transmat *trans_mat)
858 {
859 os_regset reg_set;
860 setfromtag (PlotMaskTransformed, area, id, &reg_set);
861 reg_set.r [3] = box == NULL? 0: 1 << 1;
862 reg_set.r [4] = (int) box;
863 reg_set.r [6] = (int) trans_mat;
864 return sprite__op (&reg_set);
865 }
866
867 os_error *sprite_put_mask_pgm (sprite_area *area,
868 sprite_id *id,
869 sprite_box *box,
870 sprite_pgm *pgm)
871 {
872 os_regset reg_set;
873 setfromtag (PlotMaskTransformed, area, id, &reg_set);
874 reg_set.r [3] = (box == NULL? 0: 1 << 1) | (1 << 0);
875 reg_set.r [4] = (int) box;
876 reg_set.r [6] = (int) pgm;
877 return sprite__op (&reg_set);
878 }
879
880 os_error *sprite_put_trans (sprite_area *area,
881 sprite_id *id,
882 int gcol_action,
883 sprite_box *box,
884 sprite_transmat *trans_mat,
885 sprite_pixtrans *pix_trans)
886 {
887 os_regset reg_set;
888 setfromtag (PutSpriteTransformed, area, id, &reg_set);
889 reg_set.r [3] = box == NULL? 0: 1 << 1;
890 reg_set.r [4] = (int) box;
891 reg_set.r [5] = gcol_action;
892 reg_set.r [6] = (int) trans_mat;
893 reg_set.r [7] = (int) pix_trans;
894 return sprite__op (&reg_set);
895 }
896
897 os_error *sprite_put_pgm (sprite_area *area,
898 sprite_id *id,
899 int gcol_action,
900 sprite_box *box,
901 sprite_pgm *pgm,
902 sprite_pixtrans *pix_trans)
903 {
904 os_regset reg_set;
905 setfromtag (PutSpriteTransformed, area, id, &reg_set);
906 reg_set.r [3] = (box == NULL? 0: 1 << 1) | (1 << 0);
907 reg_set.r [4] = (int) box;
908 reg_set.r [5] = gcol_action;
909 reg_set.r [6] = (int) pgm;
910 reg_set.r [7] = (int) pix_trans;
911 return sprite__op (&reg_set);
912 }
913
914 #pragma check_stack
915
916 /* end of c.sprite */