home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / povsrc31.zip / df3file.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-01-21  |  10.6 KB  |  450 lines

  1. /****************************************************************************
  2. *                df3file.c
  3. *
  4. *  This module contains the code to write df3 format density files.
  5. *
  6. *  from Persistence of Vision(tm) Ray Tracer
  7. *  Copyright 1996,1998 Persistence of Vision Team
  8. *---------------------------------------------------------------------------
  9. *  NOTICE: This source code file is provided so that users may experiment
  10. *  with enhancements to POV-Ray and to port the software to platforms other
  11. *  than those supported by the POV-Ray Team.  There are strict rules under
  12. *  which you are permitted to use this file.  The rules are in the file
  13. *  named POVLEGAL.DOC which should be distributed with this file.
  14. *  If POVLEGAL.DOC is not available or for more info please contact the POV-Ray
  15. *  Team Coordinator by leaving a message in CompuServe's GO POVRAY Forum or visit
  16. *  http://www.povray.org. The latest version of POV-Ray may be found at these sites.
  17. *
  18. * This program is based on the popular DKB raytracer version 2.12.
  19. * DKBTrace was originally written by David K. Buck.
  20. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
  21. *
  22. * By Phil Carrig (PoD)
  23. * Used the file targa.c as a framework for this one. 
  24. *
  25. *****************************************************************************/
  26.  
  27. /****************************************************************************
  28. *
  29. *  Explanation:
  30. *
  31. *  Write a frame of an animation sequence into an existing density file.
  32. *  If this is the first frame of a complete sequence, create the file and 
  33. *    write the df3 header and a complete file full of zeros.
  34. *  If the dimensions of the existing file differ from the supplied parameters,
  35. *    (width,height,number of frames) then create new file as above.
  36. *
  37. *
  38. *****************************************************************************/
  39.  
  40. #include "frame.h"
  41. #include "povproto.h"
  42. #include "povray.h"
  43. #include "df3file.h"
  44.  
  45.  
  46.  
  47. /*****************************************************************************
  48. * Local preprocessor defines
  49. ******************************************************************************/
  50.  
  51. #define boolean  int
  52.  
  53.  
  54.  
  55. /*****************************************************************************
  56. * Local typedefs
  57. ******************************************************************************/
  58.  
  59.  
  60. /*****************************************************************************
  61. * Local variables
  62. ******************************************************************************/
  63. /*YS added these variables */
  64. static long Framesize;
  65. static long Height;
  66. static long Width;
  67.  
  68.  
  69. /*****************************************************************************
  70. * Static functions
  71. ******************************************************************************/
  72.  
  73. static int Open_DF3_File (FILE_HANDLE *handle, char *name, int *width, int *height, int buffer_size, int mode);
  74. static void Write_DF3_Line (FILE_HANDLE *handle, COLOUR *line_data, int line_number);
  75. static int Read_DF3_Line (FILE_HANDLE *handle, COLOUR *line_data, int *line_number);
  76. static void Close_DF3_File (FILE_HANDLE *handle);
  77. static void Write_DF3_Pixel (FILE_HANDLE *handle, DBL b, DBL g, DBL r);
  78. static void Read_DF3_Image(IMAGE *Image, char *name);
  79.  
  80.  
  81.  
  82. /*****************************************************************************
  83. *
  84. * FUNCTION
  85. *
  86. *   Get_DF3_File_Handle
  87. *
  88. * INPUT
  89. *   
  90. * OUTPUT
  91. *   
  92. * RETURNS
  93. *   
  94. * AUTHOR
  95. *
  96. *   POD
  97. *   
  98. * DESCRIPTION
  99. *
  100. *   -
  101. *
  102. * CHANGES
  103. *
  104. *   -
  105. *
  106. ******************************************************************************/
  107.  
  108. FILE_HANDLE *Get_DF3_File_Handle()
  109. {
  110.   FILE_HANDLE *handle;
  111.  
  112.   handle = (FILE_HANDLE *)POV_MALLOC(sizeof(FILE_HANDLE), "DF3 file handle");
  113.  
  114.   handle->Open_File_p         = Open_DF3_File;
  115.   handle->Write_Line_p        = Write_DF3_Line;
  116.   handle->Read_Line_p         = Read_DF3_Line;
  117.   handle->Read_Image_p        = Read_DF3_Image;
  118.   handle->Close_File_p        = Close_DF3_File;
  119.  
  120.   handle->file = NULL;
  121.   handle->buffer = NULL;
  122.   handle->buffer_size = 0;
  123.  
  124.   return(handle);
  125. }
  126.  
  127.  
  128. /*****************************************************************************
  129. *
  130. * FUNCTION
  131. *
  132. *   Open_DF3_File
  133. *
  134. * INPUT
  135. *   
  136. * OUTPUT
  137. *   
  138. * RETURNS
  139. *   
  140. * AUTHOR
  141. *
  142. *   PoD
  143. *   
  144. * DESCRIPTION
  145. *
  146. *   -
  147. *
  148. * CHANGES
  149. *
  150. *
  151. ******************************************************************************/
  152.  
  153. static int Open_DF3_File (FILE_HANDLE *handle, char *name, int *width, int *height, int buffer_size, int mode)
  154. {
  155.     char *linebuff;
  156.     int line,frames,currframe;
  157.     char Mode[4] = "";
  158.     boolean newfile;
  159.     int w,h,d;
  160.     unsigned char header[6];
  161.     Height=(long)*height;    
  162.     Width=(long)*width;
  163.     handle->mode = mode;
  164.     handle->filename = name;
  165.     
  166.     frames = opts.FrameSeq.ActualFinalFrame - opts.FrameSeq.ActualInitialFrame + 1;
  167.     Framesize = (long)*width * (long)*height;
  168.     
  169.     newfile = 1;
  170.     strcpy( Mode, "wb");
  171.     
  172.     if( !(opts.Options & TO_STDOUT) && (handle->file = fopen (name, "rb")) != NULL)
  173.     {
  174.         if (fread(header, 6, 1, handle->file) == 1)
  175.     {
  176.         w = (header[0] << 8) + header[1];
  177.         h = (header[2] << 8) + header[3];
  178.         d = (header[4] << 8) + header[5];
  179.         
  180.         if( w == *width && h == *height && d == frames && opts.FrameSeq.FrameNumber != opts.FrameSeq.InitialFrame)
  181.         {
  182.         newfile = 0;
  183.         strcpy(Mode,"rb+");
  184.         }
  185.     }
  186.     fclose( handle->file );
  187.     }
  188.     if (opts.Options & TO_STDOUT)
  189.     {
  190.     buffer_size = 0;
  191.     handle->file = stdout;
  192.     }
  193.     else if ((handle->file = fopen (name, Mode)) == NULL)
  194.     {
  195.     return(0);
  196.     }
  197.     
  198.     if (buffer_size != 0)
  199.     {
  200.     handle->buffer = (char *)POV_MALLOC((size_t)buffer_size, "DF3 file buffer");
  201.     setvbuf (handle->file, handle->buffer, _IOFBF, buffer_size);
  202.     }
  203.  
  204.     handle->width = *width;
  205.     handle->height = *height;
  206.     if( newfile )
  207.     {
  208.         /* Output df3 file header info */
  209.         if( opts.FrameSeq.FrameNumber == opts.FrameSeq.InitialFrame )
  210.         {
  211.             putc(*width / 256, handle->file);
  212.             putc(*width % 256, handle->file);
  213.             putc(*height / 256, handle->file);
  214.             putc(*height % 256, handle->file);
  215.             putc(frames / 256, handle->file);
  216.             putc(frames % 256, handle->file);
  217.         }
  218.     
  219.         /* write out whole file */
  220.         if(!(opts.Options & TO_STDOUT))
  221.         {
  222.             linebuff = (char *)POV_MALLOC((size_t)*width, "DF3 line buffer");
  223.             memset( linebuff,0,*width);
  224.             for( currframe = 0; currframe < frames; currframe++ )
  225.             {
  226.                 for( line = 0; line < *height; line++ )
  227.                     fwrite( linebuff, (size_t)*width, 1, handle->file);
  228.             }
  229.             POV_FREE( linebuff );
  230.         }
  231.     }
  232.  
  233.     if(!(opts.Options & TO_STDOUT))
  234.     {
  235.         currframe = opts.FrameSeq.FrameNumber-opts.FrameSeq.ActualInitialFrame;
  236.         fseek( handle->file, 6L+(long)Framesize*currframe, SEEK_SET );
  237.     }
  238.     handle->buffer_size = buffer_size;
  239.     
  240.     Debug_Info( "ActualInitFrame = %d\n", opts.FrameSeq.ActualInitialFrame);
  241.     Debug_Info( "InitFrame = %d\n", opts.FrameSeq.InitialFrame);
  242.     Debug_Info( "SubsetStartFrame = %d\n", opts.FrameSeq.SubsetStartFrame);
  243.     Debug_Info( "SubsetEndFrame = %d\n", opts.FrameSeq.SubsetEndFrame);
  244.     Debug_Info( "ActualFinalFrame = %d\n", opts.FrameSeq.ActualFinalFrame);
  245.     Debug_Info( "FinalFrame = %d\n", opts.FrameSeq.FinalFrame);
  246.     Debug_Info( "Frames = %d\n", frames);
  247.     
  248.     return(1);
  249. }
  250.  
  251.  
  252.  
  253. /*****************************************************************************
  254. *
  255. * FUNCTION
  256. *
  257. *   Write_DF3_Pixel
  258. *
  259. * INPUT
  260. *
  261. *   handle     - Current file handel
  262. *   r, g, b    - Color values to write
  263. *   
  264. * OUTPUT
  265. *   
  266. * RETURNS
  267. *   
  268. * AUTHOR
  269. *
  270. *   PoD
  271. *   
  272. * DESCRIPTION   :
  273. *
  274. *
  275. * CHANGES
  276. *
  277. *
  278. ******************************************************************************/
  279.  
  280. static void Write_DF3_Pixel (FILE_HANDLE *handle, DBL  b, DBL  g, DBL r)
  281. {
  282.     unsigned int grey;
  283.  
  284.     grey = ((0.30 * r) + (0.59 * g) + (0.11 * b)) * 255;
  285.  
  286.     if ((putc(grey , handle->file) == EOF))
  287.     {
  288.     Error("Error writing DF3 output data to %s.\n",handle->filename);
  289.     }
  290. }
  291.  
  292.  
  293. /*****************************************************************************
  294. *
  295. * FUNCTION
  296. *
  297. *   Write_DF3_Line
  298. *
  299. * INPUT
  300. *   
  301. * OUTPUT
  302. *   
  303. * RETURNS
  304. *   
  305. * AUTHOR
  306. *
  307. *   PoD
  308. *   
  309. * DESCRIPTION
  310. *
  311. *   -
  312. *
  313. * CHANGES
  314. *
  315. *
  316. ******************************************************************************/
  317.  
  318. static void Write_DF3_Line (FILE_HANDLE *handle, COLOUR *line_data, int line_number)
  319. {
  320.    register int x;
  321.     /*YS changed things so that each frame is written with line 0 at the bottom
  322.         Have to do this because the density file is used that way.
  323.         df3 goes from 0 to 1 (bottom to top) so write the file that way too*/
  324.  
  325.     long AddLines=(Height-(long)line_number)*Width;    
  326.     
  327.     if(!(opts.Options & TO_STDOUT))
  328.     {
  329.         long currframe = opts.FrameSeq.FrameNumber-opts.FrameSeq.ActualInitialFrame;
  330.         fseek( handle->file, (6L+(long)Framesize*currframe)+AddLines, SEEK_SET );
  331.     }
  332.     for (x = 0; x < handle->width; x++)
  333.     {
  334.     Write_DF3_Pixel (handle, line_data[x][BLUE], line_data[x][GREEN], line_data[x][RED]);
  335.     }
  336. }
  337.  
  338.  
  339.  
  340. /*****************************************************************************
  341. *
  342. * FUNCTION
  343. *
  344. *   Read_DF3_Line
  345. *
  346. * INPUT
  347. *   
  348. * OUTPUT
  349. *   
  350. * RETURNS
  351. *   
  352. * AUTHOR
  353. *
  354. *   PoD
  355. *   
  356. * DESCRIPTION
  357. *
  358. *   Hmm.. don't know about reading df3 images.
  359. *
  360. * CHANGES
  361. *
  362. *
  363. ******************************************************************************/
  364.  
  365. static int Read_DF3_Line (FILE_HANDLE *handle, COLOUR *line_data, int *line_number)
  366. {
  367.  
  368.   return(-1);
  369. }
  370.  
  371.  
  372.  
  373. /*****************************************************************************
  374. *
  375. * FUNCTION
  376. *
  377. *   Close_DF3_File
  378. *
  379. * INPUT
  380. *   
  381. * OUTPUT
  382. *   
  383. * RETURNS
  384. *   
  385. * AUTHOR
  386. *
  387. *   PoD
  388. *   
  389. * DESCRIPTION
  390. *
  391. *   -
  392. *
  393. * CHANGES
  394. *
  395. *   -
  396. *
  397. ******************************************************************************/
  398.  
  399. static void Close_DF3_File (FILE_HANDLE *handle)
  400. {
  401.   if (handle->file)
  402.   {
  403.     fflush(handle->file);
  404.  
  405.     if (!(opts.Options & TO_STDOUT))
  406.       fclose (handle->file);
  407.   }
  408.  
  409.   if (handle->buffer != NULL)
  410.   {
  411.     POV_FREE (handle->buffer);
  412.   }
  413.  
  414.   handle->file = NULL;
  415.   handle->buffer = NULL;
  416. }
  417.  
  418.  
  419.  
  420. /*****************************************************************************
  421. *
  422. * FUNCTION
  423. *
  424. *   Read_DF3_Image
  425. *
  426. * INPUT
  427. *   
  428. * OUTPUT
  429. *   
  430. * RETURNS
  431. *   
  432. * AUTHOR
  433. *
  434. *   PoD
  435. *   
  436. * DESCRIPTION
  437. *
  438. *   Don't know about this yet, returns error.
  439. *
  440. * CHANGES
  441. *
  442. *
  443. ******************************************************************************/
  444.  
  445. void Read_DF3_Image(IMAGE *Image, char *name)
  446. {
  447.     Error ("Can't read DF3 image.\n");
  448.     return;
  449. }
  450.