home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / utilities / utilsp / pca / TBoxLibs / c / sprite
Encoding:
Text File  |  1996-04-26  |  23.3 KB  |  980 lines

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