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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * colour.h
  3.  *
  4.  * Colour description.
  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: colour.h,v $
  30.  * Revision 1.15  1999/03/10 03:49:51  robertj
  31.  * More documentation adjustments.
  32.  *
  33.  * Revision 1.14  1999/03/09 08:01:47  robertj
  34.  * Changed comments for doc++ support (more to come).
  35.  *
  36.  * Revision 1.13  1999/02/16 08:08:45  robertj
  37.  * MSVC 6.0 compatibility changes.
  38.  *
  39.  * Revision 1.12  1998/09/23 06:23:07  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.11  1995/03/14 12:41:09  robertj
  43.  * Updated documentation to use HTML codes.
  44.  *
  45.  * Revision 1.10  1995/01/27  11:05:33  robertj
  46.  * Added description string.
  47.  *
  48.  * Revision 1.9  1994/11/29  10:13:08  robertj
  49.  * Documentation.
  50.  *
  51.  * Revision 1.8  1994/11/19  00:05:00  robertj
  52.  * Added clear standard colour.
  53.  *
  54.  * Revision 1.7  1994/10/23  03:51:57  robertj
  55.  * Changed colours to have 8 bit components.
  56.  *
  57.  * Revision 1.6  1994/08/23  11:32:52  robertj
  58.  * Oops
  59.  *
  60.  * Revision 1.5  1994/08/22  00:46:48  robertj
  61.  * Added pragma fro GNU C++ compiler.
  62.  *
  63.  * Revision 1.4  1994/01/03  04:42:23  robertj
  64.  * Mass changes to common container classes and interactors etc etc etc.
  65.  *
  66.  * Revision 1.3  1993/08/24  00:27:59  robertj
  67.  * Added Grey standard colour.
  68.  *
  69.  * Revision 1.2  1993/07/14  12:49:16  robertj
  70.  * Fixed RCS keywords.
  71.  *
  72.  */
  73. #define _PCOLOUR
  74. #ifdef __GNUC__
  75. #pragma interface
  76. #endif
  77. /**A class representing a colour specification. This class provides
  78.    encapsulation for a 4 component colour. These are the amount of Red, Green,
  79.    Blue and transparency (Alpha).
  80.    
  81.    This class allows for the representation of an arbitrary colour which may
  82.    not be able to be realised on the particular drawing canvas. A descendent
  83.    from this class called a Ref{PRealColour} always represents a colour that
  84.    actually can be displayed. For example, for a typical printer canvas the
  85.    only two colours possible are Black and White.
  86.    It is up the application and its colour needs to determine if simply using
  87.    the PColour or translating it to a PRealColour first is required.
  88.    Note that for target drawing systems that do not support the opaqueness to
  89.    transparency as a continuous value, zero indicates transparent and non-zero
  90.    indicates full opaque, ie solid colour with no background.
  91.  */
  92. class PColour : public PObject
  93. {
  94.   PCLASSINFO(PColour, PObject);
  95.   public:
  96.    /**Codes for specification of standard, most common colours. These are the
  97.        primaries plus some greys and the {it Clear} or transparent colour.
  98.      */
  99.     enum StandardColours {
  100.       /// Red=0,   Green=0,   Blue=0,   Alpha=255
  101.       Black,     
  102.       /// Red=255, Green=0,   Blue=0,   Alpha=255
  103.       Red,       
  104.       /// Red=0,   Green=255, Blue=0,   Alpha=255
  105.       Green,     
  106.       /// Red=255, Green=255, Blue=0,   Alpha=255
  107.       Yellow,    
  108.       /// Red=0,   Green=0,   Blue=255, Alpha=255
  109.       Blue,      
  110.       /// Red=255, Green=0,   Blue=255, Alpha=255
  111.       Magenta,   
  112.       /// Red=0,   Green=255, Blue=255, Alpha=255
  113.       Cyan,      
  114.       /// Red=255, Green=255, Blue=255, Alpha=255
  115.       White,     
  116.       /// Red=64,  Green=64,  Blue=64,  Alpha=255
  117.       LightGrey, 
  118.       /// Red=128, Green=128, Blue=128, Alpha=255
  119.       Grey,      
  120.       /// Red=192, Green=192, Blue=192, Alpha=255
  121.       DarkGrey,  
  122.       /// Red=0,   Green=0,   Blue=0,   Alpha=0
  123.       Clear,     
  124.       NumStandardColours
  125.     };
  126.    /**Create a standard colour specification.
  127.      */
  128.     PColour(
  129.       StandardColours col = Black   /// Standard colour code
  130.     );
  131.     /** Create a colour of the specified RGB values and alpha channel. */
  132.     PColour(
  133.       BYTE r,   /// Red component
  134.       BYTE g,   /// Green component
  135.       BYTE b,   /// Blue component
  136.       BYTE a = 0xff /// Opaqueness, 0=fully transparent, 255=fully opaque
  137.     );
  138.    /**Create a colour from a description string. The description string
  139.        simply contains the four colour components separated by commas or
  140.        spaces. The order of the components is red, green, blue and opacity.
  141.      */
  142.     PColour(
  143.       const PString & description   /// Standard colour description string.
  144.     );
  145.     /**@name Overrides from class PObject */
  146.    /**Create a copy of the colour. It is the callers responsibility to delete
  147.        an object created using this funtion.
  148.        @return
  149.        a new PColour object with the same value.
  150.      */
  151.     virtual PObject * Clone() const;
  152.    /**Determine if the two colours are the same, ie have the save values for
  153.        all of the components.
  154.        @return
  155.        #EqualTo# if all componets equal, #GreaterThan#
  156.        otherwise.
  157.      */
  158.     virtual Comparison Compare(
  159.       const PObject & obj   /// PColour object to compare against
  160.     ) const;
  161.    /**Default hash function for putting colours into dictionaries.
  162.        @return
  163.        number from 0 to 50 based on the following expression:
  164. begin{verbatim}
  165.               ((Red ^ 0x55) + (Green ^ 0xaa) + (Blue ^ 0xc3))%51
  166. end{verbatim}
  167.      */
  168.     virtual PINDEX HashFunction() const;
  169.   /**@name New functions for class */
  170.    /**Get the colour description string. This string defines the colour as a
  171.        string for use in configuration files etc.
  172.        @return
  173.        description string for colour.
  174.      */
  175.     PString GetDescription() const;
  176.     /** Set the red component of the colour specification. */
  177.     virtual void SetRed(
  178.       BYTE r  /// New value for the red component
  179.     );
  180.    /**Get the red component of the colour specification.
  181.        @return
  182.        value from 0 to 255 for the red component.
  183.      */
  184.     BYTE GetRed() const;
  185.     /** Set the green component of the colour specification. */
  186.     virtual void SetGreen(
  187.       BYTE g  /// New value for the green component
  188.     );
  189.    /**Get the greeen component of the colour specification.
  190.        @return
  191.        value from 0 to 255 for the green component.
  192.      */
  193.     BYTE GetGreen() const;
  194.     /** Set the blue component of the colour specification. */
  195.     virtual void SetBlue(
  196.       BYTE b  /// New value for the blue component
  197.     );
  198.    /**Get the blue component of the colour specification.
  199.        @return
  200.        value from 0 to 255 for the blue component.
  201.      */
  202.     BYTE GetBlue() const;
  203.     /** Set the alpha (opacity) component of the colour specification. */
  204.     virtual void SetAlpha(
  205.       BYTE a  /// New value for the opaqueness component
  206.     );
  207.    /**Get the opaqueness component of the colour specification.
  208.        @return
  209.        value from 0 to 255 for the opaqueness component.
  210.      */
  211.     BYTE GetAlpha() const;
  212.     /** Component indexes for Ref{operator[]} access method. */
  213.     enum {
  214.       /// Red
  215.       RedComponent,
  216.       /// Green
  217.       GreenComponent,
  218.       /// Blue
  219.       BlueComponent,
  220.       /// Transparency
  221.       AlphaComponent,
  222.       NumComponents
  223.     };
  224.    /**Get the component specified by the index. The index may be of the
  225.        following values: 0 for Red, 1 for Green, 2 for Blue, 3 for Alpha.
  226.        @return
  227.        value from 0 to 255 for the component specified.
  228.      */
  229.     BYTE operator[](
  230.       PINDEX component  /// Component index.
  231.     ) const;
  232.    /**Calculate a distance metric between the two colours in RGB colour space.
  233.        @return
  234.        distance metric between the colours.
  235.      */
  236.     long GetDistance(
  237.       const PColour & other  /// Colour to measure distance from.
  238.     ) const;
  239.   protected:
  240.     /** Components of the colour */
  241.     BYTE component[NumComponents];
  242. #ifdef DOC_PLUS_PLUS
  243. };
  244. #endif
  245. // Class declaration continued in platform specific header file ///////////////