home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / povsrc.sit / SOURCE / RAW.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-03  |  9.5 KB  |  327 lines

  1. /****************************************************************************
  2. *                raw.c
  3. *
  4. *  This module contains the code to read and write the RAW file format
  5. *  The format is as follows:
  6. *
  7. *
  8. *  (header:)
  9. *    wwww hhhh       - Width, Height (16 bits, LSB first)
  10. *
  11. *  (each scanline:)
  12. *    llll            - Line number (16 bits, LSB first)
  13. *    rr rr rr ...    - Red data for line (8 bits per pixel,
  14. *                       left to right, 0-255 (255=bright, 0=dark))
  15. *    gg gg gg ...    - Green data for line (8 bits per pixel,
  16. *                       left to right, 0-255 (255=bright, 0=dark))
  17. *    bb bb bb ...    - Blue data for line (8 bits per pixel,
  18. *                       left to right, 0-255 (255=bright, 0=dark))
  19. *
  20. *  from Persistence of Vision Raytracer 
  21. *  Copyright 1992 Persistence of Vision Team
  22. *---------------------------------------------------------------------------
  23. *  Copying, distribution and legal info is in the file povlegal.doc which
  24. *  should be distributed with this file. If povlegal.doc is not available
  25. *  or for more info please contact:
  26. *
  27. *       Drew Wells [POV-Team Leader] 
  28. *       CIS: 73767,1244  Internet: 73767.1244@compuserve.com
  29. *       Phone: (213) 254-4041
  30. * This program is based on the popular DKB raytracer version 2.12.
  31. * DKBTrace was originally written by David K. Buck.
  32. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  33. *
  34. *****************************************************************************/
  35.  
  36. #include "frame.h"
  37. #include "povproto.h"
  38.  
  39. struct Raw_File_Handle_Struct {
  40.    FILE_HANDLE root;
  41.    FILE *Red_File, *Green_File, *Blue_File;
  42.    char *Red_Buffer, *Green_Buffer, *Blue_Buffer;
  43.    int line_number;
  44. };
  45.  
  46. typedef struct Raw_File_Handle_Struct RAW_FILE_HANDLE;
  47.  
  48. FILE_HANDLE *Get_Raw_File_Handle()
  49. {
  50.    RAW_FILE_HANDLE *handle;
  51.  
  52.    if ((handle = (RAW_FILE_HANDLE *) malloc(sizeof(RAW_FILE_HANDLE))) == NULL) {
  53.       fprintf (stderr, "Cannot allocate memory for output file handle\n");
  54.       return(NULL);
  55.    }
  56.  
  57.    handle->root.Default_File_Name_p = Default_Raw_File_Name;
  58.    handle->root.Open_File_p = Open_Raw_File;
  59.    handle->root.Write_Line_p = Write_Raw_Line;
  60.    handle->root.Read_Line_p = Read_Raw_Line;
  61.    handle->root.Close_File_p = Close_Raw_File;
  62.    return ((FILE_HANDLE *) handle);
  63. }
  64.  
  65. char *Default_Raw_File_Name()
  66. {
  67.    return ("data");
  68. }
  69.  
  70. int Open_Raw_File (handle, name, width, height, buffer_size, mode)
  71. FILE_HANDLE *handle;
  72. char *name;
  73. int *width;
  74. int *height;
  75. int buffer_size;
  76. int mode;
  77. {
  78.    RAW_FILE_HANDLE *raw_handle;
  79.    char file_name[256];
  80.  
  81.    handle->mode = mode;
  82.    handle->filename = name;
  83.    raw_handle = (RAW_FILE_HANDLE *) handle;
  84.    raw_handle->line_number = 0;
  85.  
  86.    switch (mode) {
  87.    case READ_MODE:
  88.       strcpy (file_name, name);
  89.       strcat (file_name, RED_RAW_FILE_EXTENSION);
  90.  
  91.       if ((raw_handle->Red_File=fopen(file_name,READ_FILE_STRING)) == NULL)
  92.          return(0);
  93.  
  94.       strcpy (file_name, name);
  95.       strcat (file_name, GREEN_RAW_FILE_EXTENSION);
  96.  
  97.       if ((raw_handle->Green_File=fopen(file_name,READ_FILE_STRING))==NULL)
  98.          return(0);
  99.  
  100.       strcpy (file_name, name);
  101.       strcat (file_name, BLUE_RAW_FILE_EXTENSION);
  102.  
  103.       if ((raw_handle->Blue_File=fopen(file_name,READ_FILE_STRING))== NULL)
  104.          return(0);
  105.  
  106.       if (buffer_size != 0) {
  107.          if ((raw_handle->Red_Buffer = malloc (buffer_size)) == NULL)
  108.             return(0);
  109.  
  110.          setvbuf (raw_handle->Red_File, raw_handle->Red_Buffer, _IOFBF, buffer_size);
  111.       }
  112.  
  113.       if (buffer_size != 0) {
  114.          if ((raw_handle->Green_Buffer = malloc (buffer_size)) == NULL)
  115.             return(0);
  116.  
  117.          setvbuf (raw_handle->Green_File, raw_handle->Green_Buffer, _IOFBF, buffer_size);
  118.       }
  119.  
  120.       if (buffer_size != 0) {
  121.          if ((raw_handle->Blue_Buffer = malloc (buffer_size)) == NULL)
  122.             return(0);
  123.  
  124.          setvbuf (raw_handle->Blue_File, raw_handle->Blue_Buffer, _IOFBF, buffer_size);
  125.       }
  126.  
  127.       handle->width = *width;
  128.       handle->height = *height;
  129.       handle->buffer_size = buffer_size;
  130.       break;
  131.  
  132.    case WRITE_MODE:
  133.       strcpy (file_name, name);
  134.       strcat (file_name, RED_RAW_FILE_EXTENSION);
  135.  
  136.       if ((raw_handle->Red_File = fopen (file_name, WRITE_FILE_STRING)) == NULL)
  137.          return(0);
  138.  
  139.       if (buffer_size != 0) {
  140.          if ((raw_handle->Red_Buffer = malloc (buffer_size)) == NULL)
  141.             return(0);
  142.  
  143.          setvbuf (raw_handle->Red_File, raw_handle->Red_Buffer, _IOFBF, buffer_size);
  144.       }
  145.  
  146.       strcpy (file_name, name);
  147.       strcat (file_name, GREEN_RAW_FILE_EXTENSION);
  148.  
  149.       if ((raw_handle->Green_File = fopen (file_name, WRITE_FILE_STRING)) == NULL)
  150.          return(0);
  151.  
  152.       if (buffer_size != 0) {
  153.          if ((raw_handle->Green_Buffer = malloc (buffer_size)) == NULL)
  154.             return(0);
  155.  
  156.          setvbuf (raw_handle->Green_File, raw_handle->Green_Buffer, _IOFBF, buffer_size);
  157.       }
  158.  
  159.       strcpy (file_name, name);
  160.       strcat (file_name, BLUE_RAW_FILE_EXTENSION);
  161.  
  162.       if ((raw_handle->Blue_File = fopen (file_name, WRITE_FILE_STRING)) == NULL)
  163.          return(0);
  164.  
  165.       if (buffer_size != 0) {
  166.          if ((raw_handle->Blue_Buffer = malloc (buffer_size)) == NULL)
  167.             return(0);
  168.  
  169.          setvbuf (raw_handle->Blue_File, raw_handle->Blue_Buffer, _IOFBF, buffer_size);
  170.       }
  171.  
  172.       handle->width = *width;
  173.       handle->height = *height;
  174.       handle->buffer_size = buffer_size;
  175.  
  176.       break;
  177.  
  178.    case APPEND_MODE:
  179.       strcpy (file_name, name);
  180.       strcat (file_name, RED_RAW_FILE_EXTENSION);
  181.  
  182.       if ((raw_handle->Red_File=fopen(file_name,APPEND_FILE_STRING))==NULL)
  183.          return(0);
  184.  
  185.       if (buffer_size != 0) {
  186.          if ((raw_handle->Red_Buffer = malloc (buffer_size)) == NULL)
  187.             return(0);
  188.  
  189.          setvbuf (raw_handle->Red_File, raw_handle->Red_Buffer, _IOFBF, buffer_size);
  190.       }
  191.  
  192.       strcpy (file_name, name);
  193.       strcat (file_name, GREEN_RAW_FILE_EXTENSION);
  194.  
  195.       if ((raw_handle->Green_File=fopen(file_name,APPEND_FILE_STRING))==NULL)
  196.          return(0);
  197.  
  198.       if (buffer_size != 0) {
  199.          if ((raw_handle->Green_Buffer = malloc (buffer_size)) == NULL)
  200.             return(0);
  201.  
  202.          setvbuf (raw_handle->Green_File, raw_handle->Green_Buffer, _IOFBF, buffer_size);
  203.       }
  204.  
  205.       strcpy (file_name, name);
  206.       strcat (file_name, BLUE_RAW_FILE_EXTENSION);
  207.  
  208.       if ((raw_handle->Blue_File=fopen(file_name,APPEND_FILE_STRING))==NULL)
  209.          return(0);
  210.  
  211.       if (buffer_size != 0) {
  212.          if ((raw_handle->Blue_Buffer = malloc (buffer_size)) == NULL)
  213.             return(0);
  214.  
  215.          setvbuf (raw_handle->Blue_File, raw_handle->Blue_Buffer, _IOFBF, buffer_size);
  216.       }
  217.  
  218.       handle->width = *width;
  219.       handle->height = *height;
  220.       handle->buffer_size = buffer_size;
  221.  
  222.       break;
  223.    }
  224.    return(1);
  225. }
  226.  
  227. void Write_Raw_Line (handle, line_data, line_number)
  228. FILE_HANDLE *handle;
  229. COLOUR *line_data;
  230. int line_number;
  231. {
  232.    register int x;
  233.    RAW_FILE_HANDLE *raw_handle;
  234.    char file_name[256];
  235.  
  236.    raw_handle = (RAW_FILE_HANDLE *) handle;
  237.  
  238.    for (x = 0 ; x < handle->width ; x++)
  239.       putc((int) floor (line_data[x].Red * 255.0), raw_handle->Red_File);
  240.  
  241.    for (x = 0 ; x < handle->width ; x++)
  242.       putc((int) floor (line_data[x].Green * 255.0), raw_handle->Green_File);
  243.  
  244.    for (x = 0 ; x < handle->width ; x++)
  245.       putc((int) floor (line_data[x].Blue * 255.0), raw_handle->Blue_File);
  246.  
  247.    if (handle->buffer_size == 0) {
  248.       fflush(raw_handle->Red_File);                       /* close and reopen file for */
  249.       strcpy (file_name, handle->filename);
  250.       strcat (file_name, RED_RAW_FILE_EXTENSION);
  251.       raw_handle->Red_File = freopen(file_name, APPEND_FILE_STRING,
  252.          raw_handle->Red_File);                /* integrity in case we crash*/
  253.  
  254.       fflush(raw_handle->Green_File);                       /* close and reopen file for */
  255.       strcpy (file_name, handle->filename);
  256.       strcat (file_name, GREEN_RAW_FILE_EXTENSION);
  257.       raw_handle->Green_File = freopen(file_name, APPEND_FILE_STRING,
  258.          raw_handle->Green_File);                /* integrity in case we crash*/
  259.  
  260.       fflush(raw_handle->Blue_File);                       /* close and reopen file for */
  261.       strcpy (file_name, handle->filename);
  262.       strcat (file_name, BLUE_RAW_FILE_EXTENSION);
  263.       raw_handle->Blue_File = freopen(file_name, APPEND_FILE_STRING,
  264.          raw_handle->Blue_File);                /* integrity in case we crash*/
  265.    }
  266. }
  267.  
  268. int Read_Raw_Line (handle, line_data, line_number)
  269. FILE_HANDLE *handle;
  270. COLOUR *line_data;
  271. int *line_number;
  272. {
  273.    int data, i;
  274.    RAW_FILE_HANDLE *raw_handle;
  275.  
  276.    raw_handle = (RAW_FILE_HANDLE *) handle;
  277.  
  278.    for (i = 0 ; i < handle->width ; i++) {
  279.       if ((data = getc(raw_handle->Red_File)) == EOF) {
  280.          if (i == 0)
  281.             return(0);
  282.          else
  283.             return(-1);
  284.       }
  285.  
  286.       line_data[i].Red = (DBL) data / 255.0;
  287.    }
  288.  
  289.    for (i = 0 ; i < handle->width ; i++) {
  290.       if ((data = getc(raw_handle->Green_File)) == EOF)
  291.          return(-1);
  292.  
  293.       line_data[i].Green = (DBL) data / 255.0;
  294.    }
  295.  
  296.    for (i = 0 ; i < handle->width ; i++) {
  297.       if ((data = getc(raw_handle->Blue_File)) == EOF)
  298.          return(-1);
  299.  
  300.       line_data[i].Blue = (DBL) data / 255.0;
  301.    }
  302.  
  303.    *line_number = raw_handle->line_number++;
  304.    return (1);
  305. }
  306.  
  307. void Close_Raw_File (handle)
  308. FILE_HANDLE *handle;
  309. {
  310.    RAW_FILE_HANDLE *raw_handle;
  311.  
  312.    raw_handle = (RAW_FILE_HANDLE *) handle;
  313.    if(raw_handle->Red_File)
  314.       fclose (raw_handle->Red_File);
  315.    if(raw_handle->Green_File)
  316.       fclose (raw_handle->Green_File);
  317.    if(raw_handle->Blue_File)
  318.       fclose (raw_handle->Blue_File);
  319.  
  320.    if (handle->buffer_size != 0) {
  321.       free (raw_handle->Red_Buffer);
  322.       free (raw_handle->Green_Buffer);
  323.       free (raw_handle->Blue_Buffer);
  324.    }
  325. }
  326.