home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / toollib_2 / Examples / GFXView / Builds / c / picture < prev    next >
Encoding:
Text File  |  1996-01-30  |  3.7 KB  |  181 lines

  1. /*** picture.c ***/
  2. /* A picture is some form of graphic stored in a file.
  3.  * Currently supported graphics are: Sprite, Draw, JPEG
  4.  * (c) Paul Field 1995
  5.  */
  6.  
  7. /* The picture object is simply responsible for routing
  8.  * picture calls to the appropriate 'real' picture type
  9.  */
  10.  
  11.  
  12. #include "picture.h"
  13.  
  14. #include "osfile.h"
  15. #include "jpeg.h"
  16.  
  17. #include "allocate.h"
  18. #include "exception.h"
  19. #include "draw_pic.h"
  20. #include "sprite_pic.h"
  21. #include "jpeg_pic.h"
  22.  
  23.  
  24. /* Constant used for debugging: insert 'assert(NeverReachHere)'
  25.  * at points which should never be executed
  26.  */
  27. enum { NeverReachHere = FALSE };
  28.  
  29.  
  30. typedef enum picture_type_enum
  31.  { picture_sprite, picture_jpeg, picture_drawfile
  32.  }picture_type;
  33.  
  34.  
  35. struct picture_str
  36.  { picture_type type;
  37.    union
  38.     { sprite_pic *sprite;
  39.       jpeg_pic   *jpeg;
  40.       draw_pic   *draw;
  41.     }data;
  42.  };
  43.  
  44.  
  45.  
  46.  
  47. bool picture_supported_file_type(unsigned file_type)
  48.  { return(file_type == osfile_TYPE_SPRITE ||
  49.           file_type == osfile_TYPE_DRAW   ||
  50.           (file_type == jpeg_FILE_TYPE && jpeg_pic_supported()));
  51.  }
  52.  
  53.  
  54.  
  55.  
  56. picture *picture_create(const char *file_name)
  57.  { picture *pic;
  58.  
  59.    assert(file_name != NULL);
  60.  
  61.    pic = memory_allocate(sizeof(*pic));
  62.  
  63.    try
  64.     { bits file_type;
  65.  
  66.       osfile_read_stamped_no_path(file_name, NULL, NULL, NULL, NULL, &file_type);
  67.       assert(picture_supported_file_type(file_type));
  68.  
  69.       switch(file_type)
  70.        {  case osfile_TYPE_DRAW:
  71.            pic->type = picture_drawfile;
  72.            pic->data.draw = draw_pic_create(file_name);
  73.            break;
  74.  
  75.           case osfile_TYPE_SPRITE:
  76.            pic->type = picture_sprite;
  77.            pic->data.sprite = sprite_pic_create(file_name);
  78.            break;
  79.  
  80.          case jpeg_FILE_TYPE:
  81.            pic->type = picture_jpeg;
  82.            pic->data.jpeg = jpeg_pic_create(file_name);
  83.            break;
  84.  
  85.          default:
  86.            assert(NeverReachHere);
  87.        }
  88.     }
  89.    catch
  90.     { memory_free(pic);
  91.       throw();
  92.     }
  93.    catch_end
  94.  
  95.    return pic;
  96.  }
  97.  
  98.  
  99.  
  100. void picture_destroy(picture *pic)
  101.  { if (pic != NULL)
  102.     { switch(pic->type)
  103.        { case picture_drawfile:
  104.            draw_pic_destroy(pic->data.draw);
  105.            break;
  106.  
  107.          case picture_sprite:
  108.            sprite_pic_destroy(pic->data.sprite);
  109.            break;
  110.  
  111.          case picture_jpeg:
  112.            jpeg_pic_destroy(pic->data.jpeg);
  113.            break;
  114.  
  115.          default:
  116.            assert(NeverReachHere);
  117.        }
  118.       memory_free(pic);
  119.     }
  120.  }
  121.  
  122.  
  123.  
  124. void picture_draw(const picture *pic, int origin_x, int origin_y, unsigned scale_percent, const os_box *clip)
  125.  { assert(pic != NULL);
  126.  
  127.    switch(pic->type)
  128.     { case picture_drawfile:
  129.         draw_pic_draw(pic->data.draw, origin_x, origin_y, scale_percent, clip);
  130.         break;
  131.  
  132.      case picture_sprite:
  133.         sprite_pic_draw(pic->data.sprite, origin_x, origin_y, scale_percent, clip);
  134.         break;
  135.  
  136.       case picture_jpeg:
  137.         jpeg_pic_draw(pic->data.jpeg, origin_x, origin_y, scale_percent, clip);
  138.         break;
  139.  
  140.       default:
  141.         assert(NeverReachHere);
  142.     }
  143.  }
  144.  
  145.  
  146.  
  147. void picture_size(const picture *pic, unsigned *width, unsigned *height)
  148.  { assert(pic != NULL);
  149.    assert(width != NULL);
  150.    assert(height != NULL);
  151.  
  152.    switch(pic->type)
  153.     { case picture_drawfile:
  154.         draw_pic_size(pic->data.draw, width, height);
  155.         break;
  156.  
  157.       case picture_sprite:
  158.         sprite_pic_size(pic->data.sprite, width, height);
  159.         break;
  160.  
  161.       case picture_jpeg:
  162.         jpeg_pic_size(pic->data.jpeg, width, height);
  163.         break;
  164.  
  165.       default:
  166.         assert(NeverReachHere);
  167.     }
  168.  }
  169.  
  170.  
  171.  
  172.  
  173. unsigned picture_suggested_scale(const picture *pic)
  174.  { assert(pic != NULL);
  175.  
  176.    if(pic->type == picture_jpeg)
  177.     { return jpeg_pic_suggested_scale(pic->data.jpeg);
  178.     }
  179.    return 100;
  180.  }
  181.