home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser-CD 2000 January / LCD_01_2000.iso / games / doom / pmdoom / src / v_vieo32.c < prev    next >
C/C++ Source or Header  |  1999-12-17  |  4KB  |  170 lines

  1. /*  Emacs style mode select   -*- C++ -*-  */
  2. /* ----------------------------------------------------------------------------- */
  3. /*  */
  4. /*  $Id:$ */
  5. /*  */
  6. /*  Copyright (C) 1993-1996 by id Software, Inc. */
  7. /*  */
  8. /*  This source is available for distribution and/or modification */
  9. /*  only under the terms of the DOOM Source Code License as */
  10. /*  published by id Software. All rights reserved. */
  11. /*  */
  12. /*  The source is distributed in the hope that it will be useful, */
  13. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  14. /*  FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License */
  15. /*  for more details. */
  16. /*  */
  17. /*  $Log:$ */
  18. /*  */
  19. /*  DESCRIPTION: */
  20. /*     Gamma correction LUT stuff. */
  21. /*     Functions to draw patches (by post) directly to screen. */
  22. /*     Functions to blit a block to the screen. */
  23. /*  */
  24. /* ----------------------------------------------------------------------------- */
  25.  
  26. static const char
  27. rcsid[] = "$Id: v_video.c,v 1.5 1997/02/03 22:45:13 b1 Exp $";
  28.  
  29.  
  30. #include "i_system.h"
  31. #include "r_local.h"
  32.  
  33. #include "doomdef.h"
  34. #include "doomdata.h"
  35.  
  36. #include "m_bbox.h"
  37. #include "m_swap.h"
  38.  
  39. #include "v_video.h"
  40. #include "i_video.h"
  41.  
  42. /*  Each screen is [SCREENWIDTH*SCREENHEIGHT];  */
  43. extern byte    *screens[5];    
  44.  
  45. /*  */
  46. /*  V_DrawPatch */
  47. /*  Masks a column based masked pic to the screen.  */
  48. /*  */
  49. void
  50. V_DrawPatch32
  51. ( int        x,
  52.   int        y,
  53.   int        scrn,
  54.   patch_t*    patch ) 
  55.  
  56.     int        count;
  57.     int        col; 
  58.     column_t*    column; 
  59.     unsigned long    *desttop,*dest;
  60.     byte*    source; 
  61.     int        w; 
  62.      
  63.     y -= SHORT(patch->topoffset); 
  64.     x -= SHORT(patch->leftoffset); 
  65. #ifdef RANGECHECK 
  66.     if (x<0
  67.     ||x+SHORT(patch->width) >SCREENWIDTH
  68.     || y<0
  69.     || y+SHORT(patch->height)>SCREENHEIGHT 
  70.     || (unsigned)scrn>4)
  71.     {
  72.       fprintf( stderr, "Patch at %d,%d exceeds LFB\n", x,y );
  73.       /*  No I_Error abort - what is up with TNT.WAD? */
  74.       fprintf( stderr, "V_DrawPatch: bad patch (ignored)\n");
  75.       return;
  76.     }
  77. #endif 
  78.  
  79.     if (!scrn)
  80.     V_MarkRect (x, y, SHORT(patch->width), SHORT(patch->height)); 
  81.  
  82.     col = 0; 
  83.     desttop = (unsigned long *) (screens[scrn]) +y*SCREENWIDTH+x; 
  84.      
  85.     w = SHORT(patch->width); 
  86.  
  87.     for ( ; col<w ; x++, col++, desttop++)
  88.     { 
  89.         column = (column_t *)((byte *)patch + LONG(patch->columnofs[col])); 
  90.  
  91.         /*  step through the posts in a column  */
  92.         while (column->topdelta != 0xff ) 
  93.         {     
  94.             source = (byte *)column + 3; 
  95.             dest = desttop + column->topdelta*SCREENWIDTH; 
  96.             count = column->length; 
  97.              
  98.             while (count--) 
  99.             { 
  100.                 *dest = truecolor_palette[*source++]; 
  101.                 dest += SCREENWIDTH; 
  102.             } 
  103.             column = (column_t *)(  (byte *)column + column->length + 4 ); 
  104.         } 
  105.     }             
  106.  
  107. /*  */
  108. /*  V_DrawPatchFlipped  */
  109. /*  Masks a column based masked pic to the screen. */
  110. /*  Flips horizontally, e.g. to mirror face. */
  111. /*  */
  112. void V_DrawPatchFlipped32
  113. ( int        x,
  114.   int        y,
  115.   int        scrn,
  116.   patch_t*    patch ) 
  117.  
  118.     int        count;
  119.     int        col; 
  120.     column_t*    column; 
  121.     unsigned long    *desttop,*dest;
  122.     byte*    source; 
  123.     int        w; 
  124.      
  125.     y -= SHORT(patch->topoffset); 
  126.     x -= SHORT(patch->leftoffset); 
  127. #ifdef RANGECHECK 
  128.     if (x<0
  129.     ||x+SHORT(patch->width) >SCREENWIDTH
  130.     || y<0
  131.     || y+SHORT(patch->height)>SCREENHEIGHT 
  132.     || (unsigned)scrn>4)
  133.     {
  134.       fprintf( stderr, "Patch origin %d,%d exceeds LFB\n", x,y );
  135.       I_Error ("Bad V_DrawPatch in V_DrawPatchFlipped");
  136.     }
  137. #endif 
  138.  
  139.     if (!scrn)
  140.         V_MarkRect (x, y, SHORT(patch->width), SHORT(patch->height)); 
  141.  
  142.     col = 0; 
  143.     desttop = (unsigned long *) (screens[scrn]) +y*SCREENWIDTH+x; 
  144.      
  145.     w = SHORT(patch->width); 
  146.  
  147.     for ( ; col<w ; x++, col++, desttop++) 
  148.     { 
  149.         column = (column_t *)((byte *)patch + LONG(patch->columnofs[w-1-col])); 
  150.  
  151.         /*  step through the posts in a column  */
  152.         while (column->topdelta != 0xff ) 
  153.         { 
  154.             source = (byte *)column + 3; 
  155.             dest = desttop + column->topdelta*SCREENWIDTH; 
  156.             count = column->length; 
  157.              
  158.             while (count--) 
  159.             { 
  160.                 *dest = truecolor_palette[*source++]; 
  161.                 dest += SCREENWIDTH; 
  162.             } 
  163.             column = (column_t *)(  (byte *)column + column->length + 4 ); 
  164.         } 
  165.     }             
  166. }
  167.