pixels.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:21k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * pixels.h
  3.  *
  4.  * Pixel image.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: pixels.h,v $
  30.  * Revision 1.24  1999/08/24 06:54:36  robertj
  31.  * Cleaned up the smart pointer code (macros).
  32.  *
  33.  * Revision 1.23  1999/03/10 03:49:52  robertj
  34.  * More documentation adjustments.
  35.  *
  36.  * Revision 1.22  1999/03/09 08:01:49  robertj
  37.  * Changed comments for doc++ support (more to come).
  38.  *
  39.  * Revision 1.21  1999/02/16 08:08:46  robertj
  40.  * MSVC 6.0 compatibility changes.
  41.  *
  42.  * Revision 1.20  1998/12/01 12:55:56  robertj
  43.  * new directory structure.
  44.  *
  45.  * Revision 1.19  1998/10/16 11:08:11  robertj
  46.  * GNU compatibility.
  47.  *
  48.  * Revision 1.18  1998/09/23 06:28:00  robertj
  49.  * Added open source copyright license.
  50.  *
  51.  * Revision 1.17  1995/11/09 12:18:30  robertj
  52.  * Changed read image function to accept any stream.
  53.  *
  54.  * Revision 1.16  1995/06/17 11:12:55  robertj
  55.  * Documentation update.
  56.  *
  57.  * Revision 1.15  1995/03/14 12:42:03  robertj
  58.  * Updated documentation to use HTML codes.
  59.  *
  60.  * Revision 1.14  1995/01/09  12:39:03  robertj
  61.  * Documentation.
  62.  *
  63.  * Revision 1.13  1994/12/12  10:06:21  robertj
  64.  * Renamed PWrapper to PSmartPointer.
  65.  * Made depth member of PPixels and removed virtual function.
  66.  *
  67.  * Revision 1.12  1994/12/05  11:34:12  robertj
  68.  * Major rewrite of images, pictures and pixmaps.
  69.  * Renamed PPict, PPixels and PImage to make sure all uses are found.
  70.  *
  71.  * Revision 1.11  1994/10/23  04:51:26  robertj
  72.  * Split PPixels into a number of subclasses for each pixel size.
  73.  *
  74.  * Revision 1.10  1994/08/23  11:32:52  robertj
  75.  * Oops
  76.  *
  77.  * Revision 1.9  1994/08/22  00:46:48  robertj
  78.  * Added pragma fro GNU C++ compiler.
  79.  *
  80.  * Revision 1.8  1994/06/25  11:55:15  robertj
  81.  * Unix version synchronisation.
  82.  *
  83.  * Revision 1.7  1994/04/03  08:34:18  robertj
  84.  * Added help and focus functionality.
  85.  *
  86.  * Revision 1.6  1994/03/07  07:38:19  robertj
  87.  * Major enhancementsacross the board.
  88.  *
  89.  * Revision 1.5  1994/01/03  04:42:23  robertj
  90.  * Mass changes to common container classes and interactors etc etc etc.
  91.  *
  92.  * Revision 1.4  1993/12/31  06:45:38  robertj
  93.  * Made inlines optional for debugging purposes.
  94.  *
  95.  * Revision 1.3  1993/12/29  04:40:47  robertj
  96.  * Mac port.
  97.  *
  98.  * Revision 1.2  1993/12/01  16:09:05  robertj
  99.  * Windows NT port.
  100.  *
  101.  * Revision 1.1  1993/10/16  20:33:20  robertj
  102.  * Initial revision
  103.  *
  104.  */
  105. #define _PPIXELS
  106. #ifdef __GNUC__
  107. #pragma interface
  108. #endif
  109. #ifndef _PIMAGE
  110. #include <pwlib/image.h>
  111. #endif
  112. #ifndef _PPALETTE
  113. #include <pwlib/palette.h>
  114. #endif
  115. PARRAY(PColourArray, PColour);
  116. class PPixelBase;
  117. /*
  118. PDECLARE_CLASS(PPixelImage, PImage)
  119.    This class is used to represent a pixel image. It works in conjuction with
  120.    the Ref{PPixelBase} class using the "smart" pointer system.
  121.    
  122.    A pixel image is one for which each indiviual pixel is stored and rendered.
  123.    This give maximum flexibility in what the image may display at the expense
  124.    of large memory usage.
  125.    
  126.    A common use for images is by the Ref{PMemoryCanvas} class for drawing to
  127.    off screen memory.
  128.  */
  129. class PPixelImage : public PImage
  130. {
  131.   PSMART_POINTER_INFO(PPixelImage, PImage, PPixelBase);
  132.   public:
  133.    /**Create a pixel image container.
  134.        Access to this image will assert.
  135.      */
  136.     PPixelImage(PPixelBase * obj = NULL);
  137.    /**Create a new, blank pixmap or the specified dimensions. The pixel image
  138.        may then be drawn into via a Ref{PMemoryCanvas} instance.
  139.      */
  140.     PPixelImage(
  141.       PDIMENSION dx,    /// Width of image in pixels.
  142.       PDIMENSION dy,    /// Height of image in pixels.
  143.       BYTE depth        /// Depth of image in bits per pixel.
  144.     );
  145.    /**Create a pixel image, reading it from the applications resources. This
  146.        would typically be created by the PWRC program IMAGE keyword.
  147.      */
  148.     PPixelImage(
  149.       PRESOURCE_ID resID    /// Unique identifier for pixel image resource.
  150.     );
  151.    /**Create a pixel image, reading the picture from the file in standard
  152.        platform specific format. For example under MS-Windows this would read
  153.        a ".BMP" file.
  154.      */
  155.     PPixelImage(
  156.       istream & stream   /// Stream to read pixel image from.
  157.     );
  158. };
  159. class PPixelBase : public PImageBase
  160. {
  161.   PCLASSINFO(PPixelBase, PImageBase)
  162. /* A class representing a graphic drawing shape that is a pixel bitmap image.
  163.    This is used in conjuction with the Ref{PPixelImage} class using the
  164.    "smart" pointer system.
  165.    A pixel image is one for which each indiviual pixel is stored and rendered.
  166.    This gives maximum flexibility in what the image may display at the expense
  167.    of large memory usage and lack of scalability. The alternative is to use
  168.    the Ref{PPictImage} which stores the image as a set of drawing commands.
  169.    
  170.    This is an abstract class as a sub-class based on a particular depth is
  171.    really created and placed into the smart pointer.
  172.  */
  173.   protected:
  174.    /**Create a bit image with the dimensions specified. This will allocate
  175.        storage for the internal representation o fthe pixmap. As this can be
  176.        a significant amount, the Ref{GetPixelDataPtr()} function should be
  177.        checked to see if the memory allocation succeeded.
  178.      */
  179.     PPixelBase(
  180.       PDIMENSION dx,    /// Width of image in pixels.
  181.       PDIMENSION dy,    /// Height of image in pixels.
  182.       BYTE depth        /// Depth of image in bits per pixel.
  183.     );
  184.     /** Delete the pixel bitmap and its internal memory storage. */
  185.     ~PPixelBase();
  186.   public:
  187.   /**@name Overrides from class PObject */
  188.    /**Determine if the two pixel images are the same. Note that this is
  189.        different from having two pixel images that merely {bf look} the
  190.        same. They must be references to the same pixel image file or if
  191.        loaded from resources, the same resource ID.
  192.        @return
  193.        #EqualTo# if reference the same pixel image,
  194.        #GreaterThan# if different.
  195.      */
  196.     virtual Comparison Compare(
  197.       const PObject & obj   /// Another pixel image to compare against.
  198.     ) const;
  199.   /**@name Overrides from class PImage */
  200.    /**Write the picture drawing into the specified file in platform specific
  201.        format. For example under MS-Windows this would read a ".BMP" file.
  202.      */
  203.     virtual BOOL Write(
  204.       PFile & dwg   /// File to write the pixel image to.
  205.     );
  206.   /**@name New functions for class */
  207.    /**Get the memory storage pointer for the raw pixel data. This is not
  208.        generally useful to a platform independent application as the exact
  209.        format of the pixels in the memory block is platform specific.
  210.        
  211.        The normal use of this function is to check that a memory block was
  212.        successfully allocated on systems for which memory is a limited
  213.        resource.
  214.        @return
  215.        pointer to a memory block.
  216.      */
  217.     PPixelDataPtr GetPixelDataPtr() const;
  218.    /**Get a pointer to the raw pixel data for the raster line. This is not
  219.        generally useful to a platform independent application as the exact
  220.        format of the pixels in the memory block is platform specific.
  221.        
  222.        An application that requires special processing of the data and takes
  223.        responsibility for all of the pixel depth detection etc could use this
  224.        function. For example if only 8 bit images are used the pixel packing
  225.        into the raster is very uniform across platforms and high levels of
  226.        optimisation could be made.
  227.        
  228.        It is recommended that the Ref{GetRaster()} and Ref{SetRaster()}
  229.        function be used instead of this function.
  230.        
  231.        Note that this function should be used instead of the
  232.        Ref{GetPixelDataPtr()} function as the order of the raster lines is
  233.        platform dependent. That is:
  234.        
  235.        #        GetRaster(0) != GetPixelDataPtr()#
  236.        
  237.        may be TRUE.
  238.        
  239.        @return
  240.        pointer to memory block at start of raster line.
  241.      */
  242.     PPixelDataPtr GetRasterDataPtr(PORDINATE y) const;
  243.    /**Determine if the pixel image can display full RGB colours. Essentially
  244.        this means the image has a depth greater than 24 bits per pixel.
  245.        Returns TRUE if true colour pixel image.
  246.      */
  247.     BOOL IsFullColour() const;
  248.    /**Determine the depth (number of bits per pixel) of the bitmap image. The
  249.        descendent class determines this value even tough it is stored as a
  250.        member variable. That variable should {bf not} be changed.
  251.        @return
  252.        bits per pixel for image.
  253.      */
  254.     BYTE GetDepth() const;
  255.    /**Get the palette associated with the pixel image.
  256.     
  257.        For non true colour pixel images, this determines the correspondence
  258.        between the pixel values and the RGB colours they represent. For true
  259.        colour images this is only used as a hint to the destination device
  260.        about the best colours to use, assuming the destination device is not
  261.        a true colour display itself.
  262.        @return
  263.        palette used for image.
  264.      */
  265.     PPalette GetPalette() const;
  266.    /**Set the palette associated with the pixel map.
  267.     
  268.        For non true colour pixel images, this determines the correspondence
  269.        between the pixel values and the RGB colours they represent. For true
  270.        colour images this is only used as a hint to the destination device
  271.        about the best colours to use, assuming the destination device is not
  272.        a true colour display itself.
  273.        
  274.        Note changing the palette for an existing image can have very strange
  275.        effects as the pixel values themselves do not change.
  276.      */
  277.     void SetPalette(
  278.       const PPalette & pal    /// New palette for pixel image.
  279.     );
  280.    /**Set the pixel at the location specified to the particular colour. For
  281.        true colour images the pixel is set to that colour. For non true colour
  282.        images the pixel is set to the nearest colour contained in the palette.
  283.      */
  284.     virtual void SetPixelColour(
  285.       PORDINATE x,            /// Horizontal position of pixel in raster.
  286.       PORDINATE y,            /// Vertical raster line.
  287.       const PColour& colour   /// Colour to set pixel to.
  288.     );
  289.    /**Get the colour of the pixel at the specified location. For non true
  290.        colour images this is the colour in the palette at the index determined
  291.        by the pixel value.
  292.        @return
  293.        colour for the pixel.
  294.      */
  295.     virtual PColour GetPixelColour(
  296.       PORDINATE x,    /// Horizontal position of pixel in raster.
  297.       PORDINATE y     /// Vertical raster line.
  298.     ) const;
  299.    /**Set the pixel at the location to the specified value. If the image is
  300.        true colour then the it will set a grey scale value for the pixel. For
  301.        non true colour images this sets the colour of the pixel to that in the
  302.        palette at the index position.
  303.      */
  304.     virtual void SetPixel(
  305.       PORDINATE x,   /// Horizontal position of pixel in raster.
  306.       PORDINATE y,   /// Vertical raster line.
  307.       BYTE value     /// New value for pixel.
  308.     ) = 0;
  309.    /**Get the pixel at the location. If the image is true colour then it
  310.        returns the luminance for the pixel colour. If a non true colour image
  311.        then this returns the index into the palette that the pixel value
  312.        represents.
  313.        
  314.        @return
  315.        current value of pixel.
  316.      */
  317.     virtual BYTE GetPixel(
  318.       PORDINATE x,    /// Horizontal position of pixel in raster.
  319.       PORDINATE y     /// Vertical raster line.
  320.     ) const = 0;
  321.    /**Set the pixels for the whole or part of the raster line. Note this
  322.        expects the data to be unpacked (one pixel per byte) and packages it
  323.        into the correct internal representation used by the platform.
  324.        
  325.        This is functionally equivalent to repeated calls to the
  326.        Ref{SetPixelColour()} or Ref{SetPixel()} functions but is optimised
  327.        for each image depth and platform.
  328.      */
  329.     void SetRaster(
  330.       PORDINATE y,     /// Vertical raster line.
  331.       const PColourArray & rasterColours,  /// Array of colours for pixels.
  332.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  333.     );
  334.     void SetRaster(
  335.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  336.       PORDINATE y,     /// Vertical raster line.
  337.       const PColourArray & rasterColours,  /// Array of colours for pixels.
  338.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  339.     );
  340.     void SetRaster(
  341.       PORDINATE y,     /// Vertical raster line.
  342.       const PBYTEArray & rasterBytes,  /// Array of values for pixels.
  343.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  344.     );
  345.     void SetRaster(
  346.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  347.       PORDINATE y,     /// Vertical raster line.
  348.       const PBYTEArray & rasterBytes,  /// Array of values for pixels.
  349.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  350.     );
  351.     void SetRaster(
  352.       PORDINATE y,     /// Vertical raster line.
  353.       const BYTE * raster,  /// Pointer to array of values for pixels.
  354.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  355.     );
  356.     void SetRaster(
  357.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  358.       PORDINATE y,     /// Vertical raster line.
  359.       const BYTE * raster,  /// Pointer to array of values for pixels.
  360.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to set
  361.     );
  362.    /**Get the pixels for the whole or part of the raster line. Note this
  363.        provides the data unpacked (one pixel per byte) from the correct
  364.        internal representation used by the platform.
  365.        This is functionally equivalent to repeated calls to the
  366.        Ref{SetPixelColour()} or Ref{SetPixel()} functions but is optimised
  367.        for each image depth and platform.
  368.      */
  369.     void GetRaster(
  370.       PORDINATE y,     /// Vertical raster line.
  371.       PColourArray & rasterColours,  /// Array of colours for pixels.
  372.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  373.     ) const;
  374.     void GetRaster(
  375.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  376.       PORDINATE y,     /// Vertical raster line.
  377.       PColourArray & rasterColours,  /// Array of colours for pixels.
  378.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  379.     ) const;
  380.     void GetRaster(
  381.       PORDINATE y,     /// Vertical raster line.
  382.       PBYTEArray & rasterBytes,  /// Array of values for pixels.
  383.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  384.     ) const;
  385.     void GetRaster(
  386.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  387.       PORDINATE y,     /// Vertical raster line.
  388.       PBYTEArray & rasterBytes,  /// Array of values for pixels.
  389.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  390.     ) const;
  391.     void GetRaster(
  392.       PORDINATE y,     /// Vertical raster line.
  393.       BYTE * raster,   /// Pointer to array of values for pixels.
  394.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  395.     ) const;
  396.     void GetRaster(
  397.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  398.       PORDINATE y,     /// Vertical raster line.
  399.       BYTE * raster,   /// Pointer to array of values for pixels.
  400.       PDIMENSION width = P_MAX_INDEX  /// Number of pixels in raster to get.
  401.     ) const;
  402.    /**Extract a section of pixels out of the image. The new image is of the
  403.        same depth as the current image but has dimensions the size of the
  404.        section extracted.
  405.        @return
  406.        new pixel image of section of current image.
  407.      */
  408.     PPixelImage ExtractPixels(
  409.       PORDINATE x,      /// Horizontal position of start pixel in raster.
  410.       PORDINATE y,      /// Vertical raster line.
  411.       PDIMENSION width, /// Horizontal width of the section of image to extract.
  412.       PDIMENSION height /// Vertical height of the section of image to extract.
  413.     ) const;
  414.     PPixelImage ExtractPixels(
  415.       const PRect & rect
  416.         /// Position and dimensions of the section of image to extract.
  417.     ) const;
  418.    /**Get the dirty area for the pixel image.
  419.     
  420.        The dirty area is set by calls to the Ref{SetPixelColour()},
  421.        Ref{SetPixel()} and Ref{SetRaster()} functions. This can be used to
  422.        optimise processing by easily determining how much of image has been
  423.        changed. The dirty area continues to increase in size until the
  424.        Ref{ClearDirtyArea()} function is called.
  425.      */
  426.     const PRect & GetDirtyArea() const;
  427.     void ClearDirtyArea();
  428.    /**Clear the dirty area for the pixel image.
  429.     
  430.        The dirty area is set by calls to the Ref{SetPixelColour()},
  431.        Ref{SetPixel()} and Ref{SetRaster()} functions. This can be used to
  432.        optimise processing by easily determining how much of image has been
  433.        changed. The dirty area continues to increase in size until the
  434.        ClearDirtyArea() function is called.
  435.      */
  436.   protected:
  437.     /** Expand the dirty area to include the specified pixels. */
  438.     void SetDirtyArea(
  439.       PORDINATE x,      /// Horizontal position of start pixel in raster.
  440.       PORDINATE y,      /// Vertical raster line.
  441.       PDIMENSION width = 1  /// Number of pixels to set as "dirty".
  442.     );
  443.    /**Calculate the address of the byte that contains the specified pixel
  444.        in the raster line in the pixel image.
  445.     
  446.        @return
  447.        pointer to the position in the raster line.
  448.      */
  449.     PPixelDataPtr CalculateRaster(
  450.       PORDINATE x,      /// Horizontal position of start pixel in raster.
  451.       PORDINATE y,      /// Vertical raster line.
  452.       PDIMENSION & widthToLastX
  453.      /**Width value to convert to a last X value. This is a number of pixels
  454.          provided by the calling function that is altered to a horizontal
  455.          pixel number. This is assured to be within the bounds of raster line.
  456.        */
  457.     ) const;
  458.    /**Set the colours of a raster line in the pixel image. This is the
  459.        polymorphic form of the Ref{SetRaster()} functions.
  460.      */
  461.     virtual void SetRasterColours(
  462.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  463.       PORDINATE y,     /// Vertical raster line.
  464.       const PColourArray & rasterColours,  /// Array of colours for pixels.
  465.       PDIMENSION width /// Number of pixels in raster to set
  466.     );
  467.    /**Get the colours of a raster line in the pixel image. This is the
  468.        polymorphic form of the Ref{GetRaster()} functions.
  469.      */
  470.     virtual void GetRasterColours(
  471.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  472.       PORDINATE y,     /// Vertical raster line.
  473.       PColourArray & rasterColours,  /// Array of colours for pixels.
  474.       PDIMENSION width /// Number of pixels in raster to get.
  475.     ) const;
  476.    /**Set the colours of a raster line in the pixel image. This is the
  477.        polymorphic form of the Ref{SetRaster()} functions.
  478.      */
  479.     virtual void SetRasterValues(
  480.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  481.       PORDINATE y,     /// Vertical raster line.
  482.       const BYTE * raster,  /// Pointer to array of values for pixels.
  483.       PDIMENSION width /// Number of pixels in raster to set.
  484.     ) = 0;
  485.    /**Get the colours of a raster line in the pixel image. This is the
  486.        polymorphic form of the Ref{GetRaster()} functions.
  487.      */
  488.     virtual void GetRasterValues(
  489.       PORDINATE x,     /// Horizontal position of start pixel in raster.
  490.       PORDINATE y,     /// Vertical raster line.
  491.       BYTE * raster,   /// Pointer to array of values for pixels.
  492.       PDIMENSION width /// Number of pixels in raster to get.
  493.     ) const = 0;
  494.       /** Colour look up table */
  495.     PPalette palette;
  496.       /** Memory block for pixel data */
  497.     PPixelDataPtr pixels;
  498.       /** Width of a scan line in pixel data in bytes */
  499.     PINDEX pixelLineBytes;
  500.       /** Area of pix map that was changed */
  501.     PRect dirtyArea;
  502.   friend class PPixelImage;
  503.   
  504. #ifdef DOC_PLUS_PLUS
  505. };
  506. #endif
  507. // Class declaration continued in platform specific header file ///////////////