PWRP-SDK.TXT Driver File Contents (4Winamp.zip)

Power PlugIn SDK v1.02 to make own Skins
========================================


This file ("pwrp-sdk.txt") will describe how to make your own
skins for Power PlugIn.

You are not allowed to change this file nor any of the files
delivered with the Power PlugIn package.

Please notice, that the version number of this SDK is not
identical to the version number of Power PlugIn itself.

SDK v1.02 was introduced with Power PlugIn v1.03.

Please read this file with a font with fixed width.

For a description of Power PlugIn and how to install, configure
and use it, as well as copyright and license information,
read the file "readme_powerp.txt".


For a description, what files you should deliver with your own skin and
which one must be included, read section "HOW TO DELIVER YOUR SKIN(S)"
in the file "readme_powerp.txt" which should have been delivered with
the Power PlugIn package.



HOW DOES POWER PLUGIN LOAD THE A SKIN FOR SPEED:
------------------------------------------------

When started, Power PlugIn will load the selected Design.
It will load *all* images of the selected Design. This means
that the images for all sizes of the music-player window
will be loaded at startup.
This can result in long loading times (some seconds)
(including the analysation and optimization process).

For a description about the analysation and optimization
process, see section "HOW DOES POWER PLUGIN ANALYSE AND
OPTIMIZE A SKIN:" below.



DIRECTORY STRUCTORE OF SKIN FILES:
----------------------------------

Let me start with a description, how the files for Power PlugIn Skins
should be stored.
Power PlugIn has a specific location where its skins are stored.
The user can select a path for all skins of its desire, but by default, the
Skin path is set to "powerp\Skins" (which is relative to the path where
Power PlugIn is installed to).

Example: Imagine Power PlugIn is installed in "C:\Program Files\WinAmp\PlugIns"
         then the Skins will be reside by default in
         "C:\Program Files\WinAmp\PlugIns\powerp\Skins".

Now each subdirectory in the skin-path contains a skin and the name of each
subdirectory is the name of the skin itself.

Example: With the Power PlugIn archive you should have received a skin
         named "HiFi-X".

Such a subdirectory should contain a file "skin.txt" which contains
the definition of the skin. The syntax and required contents of the file
"skin.txt" will be described later.
Furthermore the subdirectory should contain a "readme.txt". What the
readme should contain will be explained in the section "HOW TO DELIVER
YOUR SKIN(S)" below.

Then the subdirectory should also contain all the images the skin
will use. These images can be placed in the subdirectory itself or
in deeper subdirectories with names of your desire.
The locations of the images will then be referenced in the "skin.txt" file.

Example: My "HiFi-X" skin directory structure (nearly) looks like this:
         HiFi-X\skin.txt      the skin definition file
         HiFi-X\116\          contains the images for WinAmp's normal size
         HiFi-X\126\          contains the images for ModPlug
         HiFi-X\232\          contains the images for WinAmp's double size



SYNTAX AND CONTENTS OF FILE SKIN.TXT:
-------------------------------------

Note: If you want to know how to design a skin so that Power PlugIn can
      execute it as fast as possible, see the section "HOW TO DESIGN
      A PLUGIN FOR SPEED" below.

1/ Syntax of the file "skin.txt":
   ------------------------------

    The syntax of the file "skin.txt" is arranged like the registry
    but in textual format. It is similar to normal "*.ini"-files,
    but with the difference that it can support keys and subkeys.

    First of all, that "skin.txt" can be interpreted as valid configuration
    file, one text line should contain only the following text:
      PRIVATECONFIG1
    This text should not have any preceeding and trailing spaces nor
    it should contain other characters.
    All text lines before the line containing "PRIVATECONFIG1" will be
    ignored. All following lines will be interpreted as part of
    the configuration information.

    The configuration can contain keys and values. Each name (of key
    or value) must be encapsulated in " quotation marks (to be able
    to include spaces in the names).
    Each key-name brackets will follow enclosing subkeys or values.
    Example key:
      "Some Key"
      {
      }
    Values can be strings, double-words or binary-fields.
    After each value defintion, a ; character must follow
    ( like in C/C++-language ).
    Double-word values normally are in hexadecimal mode. But when you
    preceed the value with a # character, it will be in decimal mode.
    Example values:
      "Some String" = "This is a string.";
      "The same string" = "This is "
                          "a string";
      "A Hex Double Word" = dword: F0;
      "A Decimal Double Word" = dword: #250;
      "A negative Double Word" = dword: #-20;
      "A Binary Field" = hex:00,01,02,03,fc,fd,fe,ff;
      "The same Binary Field" = hex:00,01,
                                    02,03,
                                    fc,fd,
                                    fe,ff;

    Some words about strings:
    A string has a special syntax format. It is similar to the format of
    C/C++-strings. If a "\" character is found in the string, the following
    character(s) indicate a special escape-sequence. The sequences are (mostly)
    the same as for C/C++-strings.
    The following escape-sequences are supported:
      simple-escape-sequence:
        \a \b \f \n \r \t \v \' \" \\ \?
      octal-escape-sequence:
        \ octal-digit
        \ octal-digit octal-digit
        \ octal-digit octal-digit octal-digit
        In here, a maximum of 3 oct-digits are supported.
      hexadecimal-escape-sequence:
        \x hexadecimal-digit
        hexadecimal-escape-sequence hexadecimal-digit
        In here, a maximum of 3 hex-digits are supported.
    Example: If you define a string like

               "a String\nwith \"escape-sequences\"\nsamples: \\ \x41 \102"

             this will represent the following text sequence:

               a String
               with "escape-sequences"
               samples: \ A B

    You can include remarks in the configuration information:
    Like in C++-language, there are 2 remark methods:
    - If a line contains a "!" character, all following characters only
      in that line will be ignored ( similar to the C++ "//" remark ).
    - All text within a "[<" and ">]" section will be ignored ( similar
      to the C/C++ "/*" and "*/" remark ).
    There is some small bug:
    Imagine following remark constellation:
      [< start of remark
         remark continues here. ! and now the end of remark should follow >]
      "a string"="this should be a valid string value";
    In this example, the remark will start with "[<". And it should end
    with the ">]". But the ">]" will not be interpreted as end
    of remark, because a "!" character is preceeding in that text line.
    The result will be that the value "a string" still is interpreted to
    be inside a remark section and therefore will be ignored.
    Sorry about this.
    Be sure to prevent this case.
    The example above would be valid if you write it like this:
      [< start of remark
         remark continues here. ! and now the end of remark should follow
         >]
      "a string"="this should be a valid string value";

    Some more notes about "skin.txt":
    ---------------------------------
    Power PlugIn will only read the file "skin.txt". It will never write
    to it or change it in any way.

2/ Contents of the file "skin.txt" for defining a skin:
   ----------------------------------------------------

    First Note: The best example how to make a "skin.txt" file you can
    find in the "HiFi-X" skin delivered with the Power PlugIn package.

    A Skin is designed in an hierarchical order.
    It consists of one or more Designs.

    Each Design is intended for one Music-Player. But it is also
    possible to make more Designs for one Music-Player and let the
    user select the Design he wants.

    Each Design contains a Scheme for one size of the Music-Player
    window (escpecially its height).
    Supprted are: normal size, double size, windowshade size, windowshade
    double size.

    Finally a Scheme contains
    - a height value for Power PlugIn to know for which height
      the Scheme is intended.
    - the plugin-window definitions with their animations.


    On root of the "skin.txt" file there must be two keys:

    > The "Design" key contains subkeys where each subkey represents
      a design and the subkey's name is the name of the design.
      One of these designs the user will be able to select
      in the configuration of Power PlugIn.

    > A key named "Schemes" which contains subkeys. Each subkey
      contains the definitions of a scheme. A subkey's name is
      the name of the Scheme.
      The names of the schemes will be referenced by the Design
      definitions.

    > In addition, there can (but need not) be values for global
      settings.
      Supported values are:

      - "Start Message" for displaying a startup message.
          This is a string value.
          If it is defined, the string will be displayed in a
          startup dialog when the Power PlugIn is started.
          Note: In the settings of Power PlugIn you can select
                if the start message dialog shall be dismissed
                automatically.

    Each Design definition must contain a value "Normal Size".
    It contains the name of the scheme to use for normal size of
    the player window.
    Example:

        "Designs"
        {
          "First Design"
          {
            "Normal Size" = "First Scheme";
          }
        }
        "Schemes"
        {
          "First Scheme"
          {
            ! ... in here, the scheme will be defined
          }
        }

    Besides the "Normal Size", there can be defined:
      "Double Size"               for double size of the player-window
      "WindowShade Size"          for windowshade size (like for WinAmp)
                                   WindowShade means, that the player is
                                   just a titlebar.
      "WindowShade Double Size"   for windowshade but also double size

    If more than only normal-size is defined, then Power PlugIn will select
    that scheme to be visible which height-value "Height" is closest to the
    current player-window's height.
    Example:

        "Designs"
        {
          "First Design"
          {
            "Normal Size" = "Normal Scheme";
            "Double Size" = "Double Scheme";
          }
        }
        "Schemes"
        {
          "Normal Scheme"
          {
            "Height" = dword: #116;
            ! ... and some other scheme definitions
          }
          "Double Scheme"
          {
            "Height" = dword: #232;
            ! ... and some other scheme definitions
          }
        }

    In this example, the "Normal Scheme" will be displayed when the
    player-window's height is 116 or greater. But if the height
    is 232 or greater, "Double Scheme" will be displayed instead.
    Of course, if the window height is less than 116, Power PlugIn will
    use the closest scheme, which is "Normal Size".

    Some other options for Designs:
    -------------------------------

    - Which design should be used as default (before the user explicitely
      selects one in the Power PlugIn configuration) ?
      Normally, the first defined Design will be used.
      Example:

        "Designs"
        {
          "Design for WinAmp"
          {
            ! ... some design definitions
          }
          "Design for ModPlug"
          {
            ! ... some design definitions
          }
        }

      In this example, the default design is "Design for WinAmp", no
      matter which music-player you are using.
      But if you would want ModPlug to use "Design for ModPlug" as
      default Design, you can define a mask string for the
      "Default if Player class name matches" value or the
      "Default if Player window title matches" value.
      Example:

        "Designs"
        {
          "Design for WinAmp"
          {
            ! ... some design definitions
          }
          "Design for ModPlug"
          {
            "Default if Player class name matches" = "*modplug*";
            ! ... some design definitions
          }
        }

      or:

        "Designs"
        {
          "Design for WinAmp"
          {
            ! ... some design definitions
          }
          "Design for ModPlug"
          {
            "Default if Player window title matches" = "*modplug*";
            ! ... some design definitions
          }
        }

      For definition of "Default if Player class name matches" value:
        The design "Design for ModPlug" will be used as default design if
        the player-window's class name matches one of the masks in the
        mask string.
      For definition of "Default if Player window title matches" value:
        The design "Design for ModPlug" will be used as default design if
        the player-window's title matches one of the masks in the
        mask string.
      The mask string can contain one or more masks seperated by ";"
      characters.
      Each mask is a case-INsensitive string supporting wildcards
      Supported wildcards:
        *             specifies and string of any length
                      (even length zero).
        ?             specifies any character
        [afex-z]      specifies a list of characters which must match
                      the current character ( in this example the
                      current character must be 'a', 'f', 'e', 'x', 'y' or 'z',
                      no matter which letter case ).
        [?]           the current character must be a '?' char.
        [;]           the current character must be a ';' char (and the ';'
                      char is not interpreted as the end of a mask which will
                      be followed by another mask. see description below).
      Example:
          "*mp*3*pl*" will match with class names like
          "MPEG3 Player" or "The super mp3player v1.0".
      You can also define more than one mask, if you seperate them
      by ";" characters.
      Example:
          "music*pl*;song*pl*" will match with class names like
          "MusicPlayer" or "Music Player v1.0" but also "Song-Player"
          or "Songs Player v2.0" etc.


    How a Scheme is designed:
    -------------------------

    A Scheme contains one or more plugin-windows for each of the 4 sides
    of the music-player window.

    Each window contains a background image (maybe with mask to support
    non-rectangular windows) and zero, one or more animation definitions.

    An animation can be made of a list of images or by a drawing.
    Different types of animations are supported.


    In the "skin.txt" a Scheme can contain up to 4 keys each representing
    a side of the music-player-window: "Left", "Right", "Top" and "Bottom".
    Example:

        "Schemes"
        {
          "A Scheme"
          {
            "Height" = dword: #116;
            "Left"
            {
              ! ... definitions for plugin-windows on the left side
              !     of the player-window.
            }
            "Right"
            {
              ! ... definitions for plugin-windows on the right side
              !     of the player-window.
            }
            "Top"
            {
              ! ... definitions for plugin-windows on the top side
              !     of the player-window.
            }
            "Bottom"
            {
              ! ... definitions for plugin-windows on the bottom side
              !     of the player-window.
            }
          }
        }

    The order of the 4 keys is not important.

    The plugin-windows created on the left side of the player window will
    be positioned like that: The first plugin-window will be positioned on
    left side of the player window without space in between.
    The next plugin-window will be created on the left side of the previous
    plugin-window, and so on...
    So the plugin-windows will be created on a chain on the left side of
    the player window.
    With an option "Image ? Window Offset", described later, you will be able
    to move a plugin-window away from its default position.
    If a left plugin-window is aligned on the top, center or bottom, can be
    defined using the "Image ? Align" option which will be described later.

    In similar ways, this also belongs to the right, top and bottom sides.


    How to create plugin-windows at one side of the player window:

    For this, you will have to define a number of images where each image
    will represent the background image for one plugin-window. The width
    and height of the plugin-window will be as large as the smallest
    bounding rectangle around the visible parts of the image (with or
    without mask).
    Example for the left side of the player window:

        "Schemes"
        {
          "A Scheme"
          {
            "Left"
            {
              "Number of Images" = dword: #2;
              "Image 1"      = "img1.bmp";
              "Image 2"      = "img2.bmp";
              "Image 2 Mask" = "mask2.bmp";
              ! ... some other definitions
            }
          }
        }

    First of all, the number of plugin-windows to be created on that side
    of the player window must be defined using the "Number of Images" option.

    Note: The order of the value-definitions in "skin.txt" is not important
     within one key. Also the order of subkeys within one key is not important
     except in cases where it is explicitely described (ie. the order of animations
     for each plugin-window, but this will be described later).

    In the example above, 2 plugin-windows will be created on the left side of
    the player window.
    The first will use "img1.bmp" as background image,
    the second will use "img2.bmp" as background image with a mask image "mask2.bmp".
    I will speak about the masks a bit later.

    First lets talk about image definitions in common in the file "skin.txt".
    Please remember that image defintions not only belongs to defining plugin-windows
    but also to define animations with images (I will explain animations later).

    So as shown above, "Number of Images" tells the number of images which will
    be loaded within that key.
    The images themselves will be defined by "Image ?" definitions where the "?"
    character here means only a number starting from 1 till the number of images.
    This number *must not* have preceeding zeros. So a value like "Image 01"
    will not be interpreted as image definition and will be ignored. As well the
    spaces in between should be always only one space character. Definitions like
    "Image  1" also will be wrong and therefore ignored.
    Correct will be something like that: "Image 9", "Image 10", "Image 315" etc.

    For one image, there will be several options which can be defined. I will list
    them later. But you should remember, that the prefix always should be "Image ?".
    So ie. a mask will be defined with the option "Image ? Mask" as shown in the
    example above.

    It can be that you want to define a large number of images.
    In that case you will not have to write the options for each image separately.
    A prefix of "Image n" instead of "Image ?" (where "?" means a number) is supported.
    Example: The example from above can look like this as well:

        "Number of Images" = dword: #2;
        "Image n"      = "img?.bmp";
        "Image 2 Mask" = "mask2.bmp";

    For an "Image n" or "Image n Mask" option (masks will be described later),
    the file name specified may contain one or more "?" characters. These characters
    will be replaced by the number of an image starting with 1 till the number of
    images specified.
    You should include as many "?" chars in the filename as there can be chars for
    the largest number.
    Example:

        "Number of Images" = dword: #315;
        "Image n"      = "img???.bmp";

    In this example, images with numbers from 1 to 315 will be loaded. So there
    should be 3 "?" chars since the largest number (315) contains 3 chars.
    If a number has less chars as the number of "?" chars provided, the number
    will be preceeded by zeros.
    Example from above will try to load the following images:
        img001.bmp
        img002.bmp
        img003.bmp
        ....
        img314.bmp
        img315.bmp

    If for one image option, there is present an option with a "Image ?" prefix
    as well as a "Image n" prefix, then the option with the "Image ?" prefix
    will be used and the option with the "Image n" prefix will ignored for that
    special index.
    Example:

        "Number of Images" = dword: #20;
        "Image n" = "img??.bmp";
        "Image 18" = "other.bmp";

    This example will load the following images:
        img01.bmp
        img02.bmp
        ....
        img16.bmp
        img17.bmp
        other.bmp
        img19.bmp
        img20.bmp

    You see instead for image 18, option "Image n" will be ignored because
    the option "Image 18" has been defined.
    This belongs not only to the images themselves but also for all other options
    using "Image ?" or "Image n" as prefix.

    You can define images using "Image n" but specifying *no* "?" character in
    the filename. This will cause the same image file to be loaded for
    all images.
    Example:

        "Image n" = "image.bmp";
        "Image n Mask" = "mask.bmp";

    This can make sense ie. for animations of type thermometer (described later)
    which can use just the same image but on different locations (which
    can be manipulted using "Image n Move Origin" option described below) or
    in different colors (which can be changed using "Image ? Colorize" or
    "Image n Color Fade" option described below).


    Now a list of all common options possible for Image definitions using
    "Image ?" or "Image n" as prefix.
    Please notice, that in the list, I use prefix "Image ?", but you can
    use prefix "Image n" instead as well.
    If only one of these 2 prefixes are supported for an option, it will be
    explained explicitely at the option description.
    The list contains image options which always can be used for image definitions,
    no matter if the image definition is used to define a plugin-window or to
    define an animtion with images (animations are described later).

    - "Image ?"
        This option will load an image. For prefix "Image n", the filename can contain
        "?" chars as described above.

        You can also define paths followed by the filename.
        Please remember, how in "skin.txt" a string should be specified: It has
        predefined special chars which are intruded by a "\" char (similar to
        the C/C++-string-syntax as described above in section
        "Syntax of the file "skin.txt"").
        So if you specify a path, it could look like this:

          "images\\img1.bmp"

        You see, 2 "\" chars must be specified.

        Please notice, you should *not* specify absolute paths (with drive letters)
        since you cannot know the directory structure of other computers than yours.
        I strongly recommend to use *only* relative paths.
        The paths will be relative to the location where the "skin.txt" file is
        located.
        Example:
          Imagine the "skin.txt" file is located in
          "C:\Program Files\WinAmp\PlugIns\powerp\Skins\My_Skin".
          Following is a list of example definitions with relative paths
          on the left and the corresponding absolute paths with filename
          on the right side:
            "img1.bmp"                            C:\Program Files\WinAmp\PlugIns\powerp\Skins\My_Skin\img1.bmp
            "images\\img1.bmp"                    C:\Program Files\WinAmp\PlugIns\powerp\Skins\My_Skin\images\img1.bmp
            "..\\Other_Skin\\img1.bmp"            C:\Program Files\WinAmp\PlugIns\powerp\Skins\Other_Skin\img1.bmp
            "..\\Other_Skin\\pictures\\img1.bmp"  C:\Program Files\WinAmp\PlugIns\powerp\Skins\Other_Skin\pictures\img1.bmp
        You see, you can also specify ".." for parent path. You can specify
        it also multiple times (if you could use it), e.g.:
        "..\\..\\..\\pics\\an_image.bmp".

        Following is a list of image file types which can be loaded:
          *.bmp
          *.dib
          *.pbm
          *.pcx
          *.pgm
          *.ppm
          *.rle
          *.tga
        Sorry, but JPG, GIF and PNG are not supported.
        Maybe JPG and PNG will be supported in future.

    - "Image ? Mask"
        With this option, you can define to use a mask which specifies which
        parts (or even pixels) of the image are opaque and which ones are
        transparent.

        A filename can be specified using the "Image ? Mask" or "Image n Mask"
        option. The syntax of the filename is the same as for the "Image ?"
        and "Image n" options described above.

        There are 3 options which influence mask handling:
          "Image ? Mask"
          "Image ? Glass Color"
          "Image ? Use Glass"

        If neighter of the 3 options is specified, no mask is used for the
        current image and the whole image will be opaque.
        If eighter "Image ? Mask" is specified, or only "Image ? Glass Color",
        or both are specified, then the usage of a mask will be enabled and
        the image can contain transparent parts.
        If you explicitely set "Image ? Use Glass", then this option will
        enable or disable the usage of a mask no matter if the other 2 options
        are specified or not.

        If you only specify the "Image ? Mask" option, then the mask image
        should contain white pixels for pixels which should be transparent.
        All other colors in the mask image will be interpreted as opaque.

        If you only specify the "Image ? Glass Color" option, then Power PlugIn
        will generate a mask internally using the image of "Image ?" option.
        The "Image ? Glass Color" will specifiy an RGB (red-green-blue) color
        which indicates the transparent color. All pixels in the image of
        "Image ?" option with that color will be transparent.
        The "Image ? Glass Color" option is a dword of format RRGGBB (hexadecimal).
        Example:

          "Image 1 Glass Color" = dword: A024FF

        In this example the color is specified as red=160, green=36, blue=255.

        If you specify both, the "Image ? Mask" option as well as the
        "Image ? Glass Color" option, the "Image ? Mask" option specifies
        the mask image, but the transparent color is not white any more.
        The transparent color is specified by the "Image ? Glass Color"
        option.

        With the "Image ? Use Glass" option, you can explicitely enable or disable
        the usage of a mask.
        This option is a boolean. A value of 0 means it is set to false, each other
        value means it is set to true.
        Example:

          "Image 1 Use Glass" = dword: 0;

        will disable the usage of a mask, no matter if the "Image ? Mask" and/or
        "Image ? Glass Color" options are specified.

          "Image 1 Use Glass" = dword: 1;

        will enable the usage of a mask, even if none of the "Image ? Mask" and
        "Image ? Glass Color" options is specified.
        So if the usage of a mask is enabled, but none of the "Image ? Mask" and
        "Image ? Glass Color" options is specified, the mask will be generated
        from the image specified by the "Image ?" or "Image n" option. It pixels
        with total white color will be interpreted as transparent.

        You see, with masks, you can set pixels to be completely opaque or
        completely transparent.
        Sorry, but the degree of transparency (which is called alpha-blending)
        is not supported (yet) for images.

        Some notes to plugin-windows:
        If you specify a mask for a plugin-window's background image, then the
        plugin-window can be non-rectangular according to the transparent parts
        of the mask.

    - "Image ? Glass Color"
        See description to "Image ? Mask"

    - "Image ? Use Glass"
        See description to "Image ? Mask"

    - "Image ? Origin"
        This option (a string) will position the image (including a mask if present)
        relative to an imaginary coordinate-space-origin.

        If this option is not specified, the origin will be set to "0,0" which
        means it is on the top left corner of the image.

        The specified coordinates have the format "x,y" where x is a coordinate
        in x-direction (horizontal, where positive values reach from left to right)
        and y is a coordinate in y-direction (vertical, where positive values
        reach from top to bottom).

        The specified coordinates indicate the offset of the top left corner
        of the image relative to the imaginary origin.
        Example:

          "Image 1 Origin" = "-1,12";

        means that the top left corner of the image is at position x=-1, y=12.
        Note: The string should not contain any spaces.

        To origin is fixed to the position defined by the background image's
        origin definition (of a plugin-window).
        All other images, which may be defined in animations of that
        plugin-window, will be relative to the same imaginary origin.
        Example (how to specify animations is described later):

          "Left"
          {
            "Number of Images" = dword: 1;
            "Image 1" = "img1.bmp";
            "Image 1 Origin" = "-1,12";
            "Image 1 Anims"
            {
              "An Animation"
              {
                "Number of Images" = dword: 4;
                "Image n" = "anim?.bmp";
                "Image 1 Origin" = "-2,9";
                "Image 2 Origin" = "-1,12";
                "Image 3 Origin" = "0,15";
                "Image 4 Origin" = "1,18";
              }
            }
          }

        In this example the background image is at position -1,12 relative
        to the imaginary origin while the first anim image is at position -2,9.
        This means that the first anim image is at position -1,-3 relative
        to the background image. ( -1,-3 is calculated from (-2)-(-1),(9)-(12) ).

        In the example above you see 4 origin definitions which all have the
        offset 1,3 relative to the previous origin definition.
        Such a case can be realized by an easier definition:

          "Image n Origin" = "-2,9";
          "Image n Move Origin" = "1,3";

        With the "Image n Move Origin" option (a "Image ? Move Origin" is
        not supported since it makes no sense) you can define a dynamic
        offset of the origin for n images while you only need to write
        2 lines of text.
        The calculation of the origin for image X from the example above
        will be: -2+(X-1)*1,9+(X-1)*3
        which will result in the 4 origins from the example above.

        The "Image n Move Origin" can be very helpful for animations of type
        thermometer (described later).
        See "HiFi-X" skin delivered with the Power PlugIn package for
        a nice example.

        Some notes to masks:
        When a mask is specified and mask is looking like an image having
        somewhere in the middle the opaque parts where at the borders it is
        transparent, then Power PlugIn will load only that rectangular part
        of the image which matches the smallest bounding rectangle of the
        opaque area. This means that the loaded rectangular area is smaller
        than the real image.
        In such a case, do *not* forget, that the origin definition is
        relative to the top left corner of the image and not of the smaller
        image which has been cropped internally by Power PlugIn.
        For you, the designer of the skin, it is not important to know how
        Power PlugIn stores its images internally. For you, it is only
        interresting, that the *top left corner* of the image has an offset
        from the imaginary origin.

    - "Image n Move Origin"  (a "Image ? Move Origin" option does not exist)
        See description to "Image ? Origin" above.

    - "Image ? Rect" and
      "Image ? Mask Rect"
        You can define a rectangle which will be cut out when the image (or
        mask image) is loaded. Only the rect-area will be used as (mask) image.
        This is helpful if in one image file there are stored several images.

        "Image ? Rect" makes sense only if a "Image ?" is defined.
        "Image ? Mask Rect" makes sense only if a "Image ? Mask" is defined.

        Please notice, that cutting out a rectangle does *not* affect the
        image's origin. If the origin definition was ie. "0,0" then cutting
        out a rectangle will cause the new image's top left corner (which
        is the top left corner of the rectangle) to be relative to the
        imaginary origin with offset "0,0".

        Format: "x,y,cx,cy" where x is the x-coordinate (horizontal direction
        with positive values on the right) and y is the y-coordinate
        (vertical direction with positive values from top to bottom direction).
        x and y define the top left point of the rectangle. The coordinates are
        relative to the top left corner of the source image.
        cx is the width and cy is the height of the rectangle.

        Be sure to define a rectangle which compeletely lies inside the
        source image's rect are. So if an image has a width 320 and height
        240, the largest rectangle you may define is "0,0,320,240".
        It is *not* guaranteed what will happen if only one side of the
        rectangle exceeds the image's dimensions.

        Example:

          "Image 1 Rect" = "100,0,50,50";
          "Image 1 Mask Rect" = "0,200,50,50";

    - "Image ? Index" and
      "Image ? Mask Index"
        Now this is a little bit complicated. I hope I can explain it to you
        so that it is clear to you.

        Power PlugIn will store as many images as necessary but as few
        images as possible.
        (When I am speaking of images, then I mean an image defined by "Image ?"
        but I also mean an image defined by "Image ? Mask". So this means, that
        the images from "Image ?" themselves are stored separately and images
        from "Image ? Mask" are also stored separately).
        Now if you are using the same images multiple times, Power PlugIn will
        load only one instance into memory.
        But Power PlugIn has a complicated mechanism to determine, if an image
        references in the skin definition are the same.
        For Power PlugIn, an image definition is identical to anotherone if
        1/  the filenames in "Image ?" are the same, and
        2/  if the glass color and glass color usage are the same, and
        3/  if the "Image ? Rect" or "Image ? Mask Rect" are the same, and
        4/  has the same index (defined by "Image ? Index" or "Image ? Mask Index").

        By default (if no index is specified), each image will be loaded as having
        the index 1.
        Now if you specify an image definition ie. twice, you could specify an index
        of 2 for the second image definition which will cause Power PlugIn to
        store 2 seperate copies of the same image in memory.

        This can make sense (although it will not be necessary in normal life,
        but for exotic designers I did want to allow most flexibility)
        ie. for the background images of the plugin-windows:
        Example:
          Imagine you are designing a plugin-window on the left and one on the
          right side of the player window. For both you want to use the same
          background window.

            "Left"
            {
              "Number of Images" = dword: #1;
              "Image 1" = "bkgnd.bmp";
              "Image 1 Glass Color" = dword: 000000;  ! use black as transparent color
              ! ... some other definitions
            }
            "Right"
            {
              "Number of Images" = dword: #1;
              "Image 1" = "bkgnd.bmp";
              "Image 1 Glass Color" = dword: 000000;
              ! ... some other definitions
            }

          You see, both images are the same and Power PlugIn will store only one
          copy of the image to be used for both windows at the same time.

          But now imagine, you want to draw something into the background image
          using option "Image ? Mix Bkgnd" (described later). This option gives
          the possibility to draw (colorized) images of an animation into the
          background image. The drawing will be done once after loading the images
          and will not be changed.

          Now imagine, you have an animation somewhere in the left window which
          uses "Image ? Mix Bkgnd" to draw itself into the background image.
          If now, the right window would also use a animation with option
          "Image ? Mix Bkgnd" to draw into the background, but that animation
          looks differently than the anim in the left window, then this will
          result in a conflict.
          The left anim will draw itself into the background image. But the window
          on the right side will display also that background image. And so also
          in the right window, the drawing of the left anim will be visible.
          Of course, this case should be prevented.

          By specifying another index for the background image on the right
          window, Power PlugIn will store 2 different copies of the same
          background image and each of the anims can draw its images in
          an own copy of the background image. The left and right windows will
          display different background images then.

            "Right"
            {
              "Number of Images" = dword: #1;
              "Image 1" = "bkgnd.bmp";
              "Image 1 Glass Color" = dword: 000000;
              "Image 1 Index" = dword: #2;
              ! ... some other definitions
            }

        BUT IMPORTANT: There may be also another (not unimportant) case where
        you would want to cause Power PlugIn to store seperate copies of the same
        image:

        As described below in section "HOW DOES POWER PLUGIN ANALYSE AND
        OPTIMIZE A SKIN", Power PlugIn will try to optimize images of some
        animations for faster drawing operations.

        Power PlugIn will not be able to optimize an animation, if the images of
        that animation are used in another animation (no matter if they are
        used in the same or in another plugin-window) as well, but the background
        is not exactly the same as in the first animation. Even if an
        image which is used multiple times (no matter if it is used multiple
        times in the same animation or in different animations) and the
        background images are exactly the same (for this the background images
        even must have the same index from "Image ? Index") but the image
        which is used multiple times only differ by the origin definition
        (so that it is on the same background image but on different locations),
        Power PlugIn will not be able to optimize animations using that image.

        If you want to check, which animations Power PlugIn did optimize
        successfully, enable the test-optimization-option in the Power PlugIn
        configuration.
        Images with only red borders mean that they have been optimized
        according during pass 1. You will see the borders *only* if the images
        have been designed with a non-rectangular mask. It the image already
        was a rectangle, you will not see red borders since the optimization
        pass 1 will make non-rectangular images to rectangles again.
        Optimization pass 2 will try to make all images as large as the largest
        one of that animation. You will see this when (for some of the anim's
        images) there have been added green borders.
        For more info on the optimization process, see section
        "HOW DOES POWER PLUGIN ANALYSE AND OPTIMIZE A SKIN" below.

    - "Image ? Colorize"
        It is possible to colorize an image. This is helpful for ie. animations
        of type thermometer where only one little image file is used for all images
        of that animation. Colorizing gives the possiblity of making a colorful
        set of images for the animation while only one image file has to be defined.
        Example:
          "Number of Images" = dword: #3;
          "Image n" = "image.bmp";
          "Image 1 Colorize" = dword: ff0000;
          "Image 2 Colorize" = dword: ffff00;
          "Image 3 Colorize" = dword: 00ff00;
        Imagine "image.bmp" is a non-colored image (ie. it is white with possibly
        some gray pixels). The colorizing will cause image 1 to be red, image 2
        to be yellow and image 3 to be green.

        The format of the RGB color is the same as for "Image ? Glass Color"
        (see above).

        The colorizing will be done by a multiplication of the red, green and
        blue components of the color with the pixel's colors.
        So a colorization with color white will not change the image while a
        colorization with color black will make the whole image also black.
        Gray values in between make the image darker. If you use a color instead
        of only a gray color, the image will be colorized using that color.

        Of course "Image n Colorize" also is supported to colorize all images
        with the same color.
        If "Image n Colorize" is specified, but also a "Image ? Colorize" is
        specified, then the "Image ? Colorize" will have priority for that
        image number.
        Example:

          "Image n Colorize" = dword: ff0000;
          "Image 4 Colorize" = dword: ff00ff;

        will colorize all images with color red except image 4 will be
        colorized with color violet.

        (Please see also "Image n Color Fade" option below).

    - "Image n Color Fade"  (a "Image ? Color Fade" option does not exist)
        Like "Image ? Colorize", the "Image n Color Fade" option also can
        colorize images but it does not colorize all images with the
        same color. It colorizes them according to a list of colors and
        it will automatically fade between these colors.
        Example:

          "Number of Images" = dword: #34;
          "Image n" = "image.bmp";
          "Image n Fade Color" = "2,ff0000;16,ffff00;32,00ff00";

        Format:
        The format is a string with several color definitions separated
        by ";" characters.
        Each color definition consists of an image number (decimal value
        only), then a "," char followed by an RGB color value (hexadecimal
        value only) similar to the RGB color format described in
        "Image ? Glass Color" option.

        The list should be order by increasing image numbers. So the first
        color definition in the string should have the lowest image
        number while the last one should have the greatest image number.

        The images with the specified numbers will be colorized using the
        specified color. Images with numbers in between will be colorized
        by a color faded between the closest color definitions.
        In the example above this means image 2 is colorized red, image 16
        is colorized yellow and the images in between are colorized with
        colors faded between red and yellow. In similar ways, this also
        belongs to images between number 16 and 32.
        In that example, image 1, 33 and 34 are not colorized.

        A "Image ? Colorize" option has a priority before "Image n Color Fade"
        for the specific image number.
        Example:

          "Image n Color Fade" = "1,ff0000;32,0000ff";
          "Image 8 Colorize" = dword: 00ff00;

        In this example, the images 1 to 32 are colorized with a color fade
        from red to blue, except image 8 is colorized with color green instead.

    - "Image ? Mix Bkgnd"
        With this option, an animation may cause its images (after they have been
        colorized with option "Image ? Colorize" or "Image n Color Fade")
        to be colorized again with the color specified (but the result will not
        be stored in the images).
        The result will be draw directly into the background image and the new
        image will be stored as new background image.
        (See how I did make this in "HiFi-X" skin delivered with the
        Power PlugIn package).

        Both option possiblities "Image ? Mix Bkgnd" and "Image n Mix Bkgnd"
        are supported where, like in normal case, the "Image ? Mix Bkgnd"
        has a higher priority. That means in a case like

          "Image n Mix Bkgnd" = dword: 808080;
          "Image 3 Mix Bkgnd" = dword: a0a0a0;

        all images of the animation will be colorized with RGB color 808080
        before they are drawn into the background image, except image 3
        which will be colorized with RGB color a0a0a0 instead.

        The RGB color format is the same as for the "Image ? Glass Color"
        option.


    Now following is a list of image definition options, which will
    work *only* for defining the background image of a plugin-window:
    Please notice, that in the list, I use prefix "Image ?", but you can
    use prefix "Image n" instead as well.
    If only one of these 2 prefixes are supported for an option, it will be
    explained explicitely at the option description.

    - "Image ? Align"
        With this option, you can influence the default position where the
        plugin-window is to be created.

        For plugin-windows on the left or right side of the player-window:
        You can specifiy, if the plugin-window shall be created aligned
        to the top, center, or bottom of the player-window height.
        In that case, the option can take one of the following string values:
          "top"
          "center"
          "bottom"

        For plugin-windows on the top or bottom side of the player-window:
        You can specifiy, if the plugin-window shall be created aligned
        to the left, center, or right of the player-window width.
        In that case, the option can take one of the following string values:
          "left"
          "center"
          "right"

    - "Image ? Window Offset"
        With this option, you can cause a plugin-window to be moved away
        from its default creation position.
        The format is similar to that of the "Image ? Origin" option
        explained above.
        Example:

          "Image 1 Window Offset" = "-10,20";

        In this example, the window will be moved 10 pixels to the left
        and 20 pixels downwards away from its default position.

    - "Image ? Copy of"
        With this string option you can define a copy of another plugin-window
        defintion of the same or another scheme and player-side.

        This option will *not* work with the "Image n" prefix.

        Format:
          "<scheme-key-name>\\<player-side>\\Image <?>"

        <scheme-key-name> is the configuration-key-name of the scheme from
        where to make a copy of a plugin-window.
        <player-side> defines the side of the music-player from where to
        copy the plugin-window definition. Possible sides: "Left", "Right",
        "Top", "Bottom".
        <?> specifies the number of the plugin-window definition which shall
        be copied.

        Example:
          "Schemes"
          {
            "First Scheme"
            {
              "Bottom"
              {
                "Number of Images" = dword: #2;

                "Image 1" = "img1.bmp";
                ! ... some other options for plugin-window with background image 1
                "Image 1 Anims"
                {
                  ! ... some animations for plugin-window with background image 1
                }

                "Image 2" = "img2.bmp";
                "Image 2 Window Offset" = "10,10";
                ! ... some other options for plugin-window with background image 2
                "Image 2 Anims"
                {
                  ! ... some animations for plugin-window with background image 2
                }
              }
            }

            "Second Scheme"
            {
              "Top"
              {
                "Number of Images" = dword: #1;
                "Image 1 Copy of" = "First Scheme\\Bottom\\Image 2";
                "Image 1 Window Offset" = "-2,-1";
              }
            }
          }

        In this example, the scheme "Second Scheme" has a plugin-window on top
        which is a copy of the 2nd plugin-window used in scheme "First Scheme"
        at its bottom. Also its animations will be copied.

        Please notice, that also the specified option "Image 2 Window Offset"
        will be used for the copy in "Second Scheme", but in addition,
        the window will be moved again according to the other window offset
        "-2,-1". So the copied plugin-window will be moved by "8,9".

        Please notice, that it is not possible to make a copy of a copy.
        So something like the following "Scheme 3" is not possible:
          "Schemes"
          {
            "A Scheme"
            {
              "Left"
              {
                "Number of Images" = dword: #1;
                "Image 1" = "img1.bmp";
              }
            }
            "Scheme 2"
            {
              "Left"
              {
                "Number of Images" = dword: #1;
                "Image 1 Copy of" = "A Scheme\\Left\\Image 1";
              }
            }
            "Scheme 3"
            {
              "Left"
              {
                "Number of Images" = dword: #1;
                "Image 1 Copy of" = "Scheme 2\\Left\\Image 1";
              }
            }
          }

        But
            "Scheme 3"
            {
              "Left"
              {
                "Number of Images" = dword: #1;
                "Image 1 Copy of" = "A Scheme\\Left\\Image 1";
              }
            }
        is legal again.



    How to create animations for a plugin-window definition:
    --------------------------------------------------------

    In a plugin-window definition key, you must specifiy a key named
    "Image ? Anims" where "?" stands for the number of the plugin-window
    (or its background image).

    Within this key, you can specify several subkeys each one containing
    definitions for one animation. The name of such a subkey will be
    the name of the animation. (Currently the name of an animation is
    ignored, but it may be used in future versions of Power PlugIn).

    Against the normal handling of "skin.txt", the order of animations
    *can be important*. It can be important for you when Power PlugIn tries
    to optimize an animation. Normally Power PlugIn will not be able to
    optimize an animation if it is overlapping with other animations,
    EXCEPT IF the animation is the *first* one in the list of animations.
    (Of course, the animation must met all other necessary requirements
    so that Power PlugIn can optimize it. Read more about this in section
    "HOW DOES POWER PLUGIN ANALYSE AND OPTIMIZE A SKIN" below).

    On the other hand the order of Anim definitions *is* important because
    this will be the order they are drawn (which is important
    if parts of the animation images overlap with images of
    other animations). The first one will be drawn at bottom,
    the last one will be drawn on top.

    Example:

      "Schemes"
      {
        "A Scheme"
        {
          "Left"
          {
            "Number of Images" = dword: #1;
            "Image 1" = "bkgnd.bmp";
            "Image 1 Anims"
            {
              "First Anim"
              {
                ! ... some animation definitions
              }
              "Second Anim"
              {
                ! ... some animation definitions
              }
              ! ... other animations may follow
            }
          }
        }
      }

    Of course, it is possible for a plugin-window not to have any animations.
    For this, simply do not sepcify a "Image ? Anims" key.


    How an animation is defined:
    ----------------------------

    An animation consists of these main parts: A timer, the data source,
    the animation type, a sequence and a sound-channel.
    In certain cases, there also can be transformation functions.

    Example:

        "First Anim"
        {
          "Timer Delay" = dword: #50;
          "Anim Type" = "single";
          "Anim Sequences" = "1:1";
          "Anim Data Source" = "Spectrum";
          "Channel" = "left";
        }

    Data flow:
    The data will be taken from the specified data source (which can contain
    some internal filter functions) taken from the selected channel.
    It then will be passed to the animation-sequence transformer which
    will transform it and pass it to the drawing engine of Power PlugIn.
    The drawing engine then will draw the animation according to the
    specified animation type.

    The definition options:

    - "Timer Delay"
        This defines a timer in milliseconds for the animation.
        It defines the minimum delay between two frames of an animation.

        If not timer is defined for an animation, the default timer of 25 ms
        (milliseconds) will be used.

        If you specify a timer, you should set it to multiples of 25 ms for
        best results.

        Note: To ModPlug: It seems, that Modplug ignores the internal timer
        setting of 25 ms. It uses its own timer (which seems to be nearly
        25 ms). But this has no real influence on a "Timer Delay" definition.

    - "Anim Type"
        This defines how the animation will be drawn.

        Currently possible types:
          "single"
              The animation contains images.
              Only one of the images will be drawn at any time.
              This is the type to be used for ie. jumping speakers.
          "thermometer"
              The animation contains images.
              This is the type used for displaying scales. It is called
              thermometer because it looks like a thermometer scale.
              It will draw the images starting from number 1 to a
              number calculated from the current data source value.
          "drawing"
              The animation does not contain images.
              It will be generated just by drawing something into the
              plugin-window.
              Currently only for drawings, blur and alpha-blending
              operations are supported.
              Be sure to make drawing animations not too large and not
              too intensive because it can increase CPU-usage dramatically
              under certain circumstances.

        Options for the anim types will be explained later.

        For types singe and thermometer, I recommend not to use
        "Spectrum Peaks" as "Anim Data Source" (which will be described
        later) since it makes no sense for these animations.
        Use "Spectrum" instead.

    - "Anim Sequences"
        You can specify one or more sequences (seperated by ";" characters).
        But currently only the first sequence will be used, all other
        sequences, if specified, will be ignored. This may change in
        future versions of Power PlugIn.

        Currently supported Sequences:
          "1:1"
              This will simply take the source data and forward it to the
              drawing engine.
              This means, it will do nothing.
              If the source data is negative (which can be done using
              "Spectrum Scale" option (described later) if using spectrum
              or spectrum peaks as source data), must animation types will
              not do anything then. Try it out.
          "Rotate"
              This will cause the animation to loop its images. The higher
              the source data values the faster the rotation will be and
              vice versa.
              If source data is negative, the rotation will loop in
              the other direction.

    - "Anim Data Source"
        Describes where the data to influence the animation will be
        taken from.

        Currently supported Data Sources:
          "Spectrum"
              With this data source, you can specify a range to be
              taken from the spectrum data the music-player sends
              to Power PlugIn.
              From that data-range a mean value will be calculated
              (with some addition functionality which will be described
              later) and passed to the animation-sequence transformer.

              As you see, this data source will generate one single
              data value which will be used for the animation.

              This data source can be used for animations using images
              (this with anim types single and thermometer).
              But it also may be used by drawings if you want only
              one data value to be used for the drawing.

          "Spectrum Peaks"
              This allows the same functionality (and more) like
              the "Spectrum" data source, but with the main difference
              that it will generate more than only one data value.

        How to define options for the selected data source, will
        be described later.

    - "Channel"
        Describes the channel from which to take the source data.
        The source data then will be prepared defined by the
        "Anim Data Source" option.

        Supported Channels:
          "left"
          "right"
          "mono"      will be a mean of the left and right channel.
          "maximum"   similar like mono, but it will take the maximum
                      of the left or right channel.
                      This option is good ie. for a single SubWoofer speaker
                      acting like a mono speaker. If you would take "mono",
                      it speaker will not react very much if a sound is
                      played only on the left *or* right channel while
                      the other one is quiet, because "mono" will calculate
                      a mean value. Taking the maximum instead will make
                      react the speaker equally no matter if a sound
                      is played only on one or on both channels.

        If the "Channel" option is not specified, Power PlugIn will use
        a default channel according to the player-window side the plugin-window,
        which uses this animaion, is created on.
        For plugin-windows on the left side, Power PlugIn will use the "left"
        channel by default. For plugin-windows on the right side, the "right"
        channel will be used by default. For plugin-windows on the top or
        bottom side of the player-window, Power PlugIn will use the "mono"
        channel by default.

    Options for the anim-data-source "Spectrum" and "Spectrum Peaks":
    -----------------------------------------------------------------

    Main option for data-source "Spectrum":

    - "Spectrum Start" and
      "Spectrum End"
        With these values (they are dword values), you can select the
        range of data from the spectrum that the music-player sends
        to Power PlugIn.
        From this range Power PlugIn will calculate a mean value and
        pass this one to the animation transformation function.

        In the range, the start and end indices themselves will also
        be included.

        The range of possible data indices into the spectrum that
        the music-player sends to Power PlugIn goes from 0 to 575.
        So there are 576 data values of the spectrum.

        Low indices indicate bass frequencies.
        High indices indicate treble frequencies.

        Example:

          "Spectrum Start" = dword: #0;
          "Spectrum End" = dword: #575;

        This example will generate a mean value over the whole
        input spectrum.

        If you want only one value to be taken from the input
        spectrum, specify something like this:

          "Spectrum Start" = dword: #34;
          "Spectrum End" = dword: #34;

        The index 34 will be taken as data value from the
        input spectrum.

        Note: The ending index must be equal or greater than
        the starting index.

    Main option for data-source "Spectrum Peaks":

    The "Spectrum Peaks" data-source is similar to the "Spectrum" data-source
    but with the difference that more than only one data value will be
    calculated.

    There are two possibilities to define a list of spectrum peaks:

    - "Spectrum Peaks"
        With this option, you can define a list where you specify
        each peak seperately.
        A peak value can be defined by eigher one value which must be
        in the range of 0 to 575.
        Or you can define it with a starting and ending index like
        described in the "Spectrum" data-source.

        Format:
          A string where the peaks are seperated by "," characters
          and a input range for a peak is specified using the "-"
          character.

        Example:

          "Spectrum Peaks" = "0,10,20,100-199,200-299,300-399";

        In this example, 6 peak values will be generated.
        The first will be the peak at index 0 of the input spectrum (which
        the music-player sends to Power PlugIn).
        Peak number 2 and 3 are taken from index 10 and 20.
        The 4th peak will be generated similar to start and end values
        of the "Spectrum" data-source described above.
        The 5th and 6th peak will be generated as mean values from
        the 200 to 299 and 300 to 399 (each including the start end
        end indices).

        Note: You can use spectrum peaks for animations which use images
        (anim types single or thermometer) but this makes no sense since
        these animations (at the moment) support only one data value.
        If you use spectrum-peaks for these animation types, the last
        value will be used and all other ones will be ignored.
        I recommend to use "Spectrum" data-source instead for these anim
        types since with spectrum-peaks Power PlugIn will have to calculate
        values which then will not be used.

        Note: You can specify any order of peaks you want (but be
        sure that for each peak, the starting index is less or equal
        to its ending index).
        Example:

          "Spectrum Peaks" = "100,190,10-20,400,0-10,575,150,75";

        This example will look a bit confusing since the peaks are not
        ordered in any way :-)

    - "Spectrum Peaks List"
        This option is a replacement for the "Spectrum Peaks" option.
        It has the same purpose and will produce the same results, but
        for a large number of peaks, with this option it is more easily
        to define them all.

        Format: Is a string value of syntax:

          "<first>-<last>:<step> W<width>"

        Example:

          "Spectrum Peaks List" = "0-575:100 W50";

        It will produce a list of peaks which each will be calculated
        from a mean value out of a range from the input spectrum's data.
        The range will be defined by a start and end index as described
        above in "Spectrum Peaks".

        The start-index for a peak will be calculated like this:
        1/ If <first> is less or equal than <last>:

          start-index = <first> + (k-1)*<step>

        2/ If <first> is greater than <last>:

          start-index = <first> - (k-1)*<step>

        where 'k' means the number of the peak (1 for the first peak,
        2 for the second peak,...).

        There will be created so many peaks as long as:
        for case 1/
          the start-index is *less* or *equal* to <last>
        for case 2/
          the start-index is *greater* or *equal* to <last>.

        The end-index for each peak will be calculated in both
        cases like this:

          end-index = start-index + <width> - 1

        If the width is 1, the end- and start-indices will be equal for
        each peak, which means that only one data value will be taken
        from the input spectrum to calculate a peak value.

        The example above will be the same as if you would define:

          "Spectrum Peaks" = "0-49,100-149,200-249,300-349,400-449,500-549";

        <first> must be in the range from 0 to 575.
        <last> must be in the range from 0 to 575.
        <step> must be >= 1, even if <first> is greater than <last>
        <width> must be >= 1

        Note: If a range of one peak exceeds the limits of 0 and 575,
              Power PlugIn will automatically truncate the values to
              the possible range.

        Note: It is not recommended to produce a very large number of
              peaks since an animation of type "drawing" will have to
              draw each peak seperately which can increase CPU usage.
              I recommend to make not much more than 50 or 100 peaks
              for an animation.

        I hope the following examples do show all special cases which
        can happen.

        Example:
            "Spectrum Peaks List" = "0-40:10 W1";
          is the same as
            "Spectrum Peaks" = "0,10,20,30,40";
          In here you see, that the <last> value is included, because
          the start-index of the 5th peak is equal to <last> (which is
          40).
        Example:
            "Spectrum Peaks List" = "0-40:10 W5";
          is the same as
            "Spectrum Peaks" = "0-4,10-14,20-24,30-34,40-44";
        Example:
            "Spectrum Peaks List" = "0-575:200 W200";
          is the same as
            "Spectrum Peaks" = "0-199,200-399,400-575";
          In here, you see <first> and <last> are defined in its valid
          range, but start- and end-indices for the last peak would
          be calculated to "400-599" which is not possible because
          this exceeds the possible input spectrum's range.
          Power PlugIn will automatically use just the range "400-575".
        Example:
            "Spectrum Peaks List" = "574-0:200 W10";
          is the same as
            "Spectrum Peaks" = "574-575,374-383,174-183";
          In this example, you see that the first peak would exceed the
          possible range (it would be "574-583") which Power PlugIn
          automatically truncates to "574-575".
        Example:
            "Spectrum Peaks List" = "0-575:1 W1";
          will return a peak for each frequency index of the input spectrum
          sent by the music-player.
          It is not recommended to use so much peaks since this will rapidely
          increase CPU usage.

    Most of the other options can be used for both data-sources. But there
    are some which only can be used by one of them. See the following lists.

    Following is a list of options which can be used by both
    data-sources ("Spectrum" as well as "Spectrum Peaks"):

    - "Spectrum Sensitivity"
        This is a dword in the range from 0 to 1000.
        If not defined, a default value of 0 will be used.

        It defines, how easily the spectrum data (or peaks) will push
        to the maximum. The higher the value, the easier the animation
        will react on quiet sounds.

        0 is the normal value (normal sensitivity).

        At the moment, negative values are not supported. This may change
        in a future version of Power PlugIn.

        Sorry, but the sensitivity value is not linear. This means that
        a sensitivity of 100 or 200 makes nearly no difference while
        the difference between 990 and 991 is extremely large.
        Sorry about this.
        To find the best sensitivity value for an animation
        you will have to try it out.

        Especially for animations which use spectrum data from the
        treble frequencies (the higher index values somewhere between
        index 200 and 575 or something), you would want to set a higher
        sensitivity since in nature, bass frequencies are much louder
        than treble frequencies.

        HINT: When you try to find a good sensitivity value, please do
              this by resetting the user-sensitivity (which the user can
              select in the configuration of Power PlugIn). Both, the
              bass- and treble-user-sensitivity should be set to 0 when
              you try to find good "Spectrum Sensitivity" values for
              your animations.

    - "Spectrum Function"
        This also will influence how easily the spectrum data (or peaks)
        will push to the maximum.
        This also is a dword in the range from 0 to 1000.
        If not defined, a default value of 0 will be used.

        0 will make a 100% linear spectrum-transformation function.
        1000 will make a 100% logarithmic transformation function.

        Values in between will make the transformation function a
        interpolation between the linear transformaion and the
        logarithmic transformation.
        So a value of 500 will make it half linear and half
        logarithmic. A value of 250 will make 75% linear and
        25% logarithmic.

        If the transformation is logarithmic, the input spectrum
        data will managed like this. For low frequency volumes,
        the transformed data will be increased very fast. But
        the higher the input frequency volume goes, the slower
        the transformed data will be increased.

        This means for logarithmic transformation, the animation
        will react more sensitive for low volumes, but for
        loud volumes the animation will hardly react.

        This option is good ie. for jumping speakers because with
        logarithmic transformation, the jumping of the speakers
        look for realistic.
        It is also good for ie. displaying a spectrum in animation
        of type "drawing" (using spectrum-peaks), because the treble
        frequencies can be hardly seen with linear transformation.
        Making it a bit more logarithmic will cause the treble
        frequencies to be seen better while the bass frequencies
        still will be seen (nearly) as good as before.

      PLEASE NOTICE THE DIFFERENCE BETWEEN THE "Spectrum Function"
        AND "Spectrum Sensitivity":

        By increasing the sensitivity, you will simply scale the
        the input spectrum data.

        This means, that for ie. a very high sensitivity, the animation
        will react like this: For input data volumes in the range
        from very quiet to nearly quiet, the animation will react
        extremely strong which will of course look good.
        But if the volumes are in the range of loud till maximum
        loudness, the animation will stay continuously at the maximum
        value. You will not see any reaction as long as the input data's
        volume is loud.

        With a logarithmic function, you can prevent this case.
        Imagine you are using a very logarthmic function.
        For input data between quiet and nearly quiet, the animation
        will react very strong. But in the case of volumes in the
        range from loud to very loud, the animation still will react
        a bit.
        With completely linear transformation, the animation would
        react equally scaled for quiet and loud volumes.

        It is on you now to find a good combination of both options
        for your animations.

    - "Spectrum Scale"
        This options has (nearly) the same influence on the animation as
        the "Spectrum Sensitivity" value, but with the difference
        that "Spectrum Scale" will be a linear value while the
        "Spectrum Sensitivity" is not.
        As explained above, the difference between low
        "Spectrum Sensitivity" values is not so large as for high
        values.
        With "Spectrum Scale", this effect does not exist. The
        data will simply be multiplied with the "Spectrum Scale" value.

        In addition, "Spectrum Scale" also supports negative values
        which can be used ie. for animation sequences "Rotate" to
        rotate in the other direction.

        This value must be provided as floating point value in a string.

        Example:
            "Spectrum Scale" = "1.0";
          will not cause any scaling.
        Example:
            "Spectrum Scale" = "2.0";
          will not double the calculated data.
        Example:
            "Spectrum Scale" = "0.5";
          will half the calculated data.
        Example:
            "Spectrum Scale" = "-1.0";
          will not cause the data-source to be negative.

      PLEASE NOTICE THE ORDER POWER PLUGIN WILL USE THESE THREE DEFINITIONS:
        From each data of the input-spectrum (which is sent from the music-player
        to Power PlugIn), Power PlugIn will first manipulate them using the
        "Spectrum Sensitivity", then it will use the "Spectrum Function" on
        the data.
        At last Power PlugIn will take the result and multiply it with
        the value of "Spectrum Scale".
        The final result will be the final value(s) of the source-data which
        then will be passed to the other animation steps (like anim-sequence
        calculation and painting of the animation).

        Note: The "Spectrum Scale" can be used (besides the
              "Spectrum Sensitivity") to make the animation react more hardly
              or stronger.
              But on the other hand, the "Spectrum Scale" can be used to adjust
              the average speed for "Rotate" animation sequences. (Of course
              this will also work with "Spectrum Sensitivity", but since the
              "Spectrum Scale" works linear, it is more easily to handle).

        Note: The "Spectrum Scale" is *not* a replacement for the
              "Spectrum Sensitivity". If both values are defined, Power PlugIn
              will then use both values in the calculation process.

              To see the difference: the "Spectrum Sensitivity" will be used
              on the data, *before* "Spectrum Function" is used.
              But "Spectrum Scale" is used *after* the "Spectrum Function"
              has been used.

              For all 3 options try out the values which match best your
              wishes for an animation.

    - "Spectrum Falloff"
        This option will give the possibility to adjust the speed for the
        falloff of a spectrum value.
        The higher this value, the slower the calculated spectrum source-data
        will fall off.
        The value is a dword in the range from 0 to 1000.
        If the option is not specified, a default of 0 will be used.
        0 = immediately fall off (as fast as possible).
        1000 = the value will never fall off. It will stay at this value
               as long as the data does not get greater. It the value
               becomes greater, the it will stay on the new value.

        With this option, you can simulate a spectrum-display like for
        normal hifi-systems (best simulated using an animation of type
        "thermometer" or "drawing").

    - "Ignore User Sensitivity"
        This option is a dword acting as boolean value.
        If you set it to 0, this means false.
        Any other value means true.

        If this value is not specified, false will be suggested.

        If set to true, the user-sensitivity (which the user can
        adjust in the configuration of Power PlugIn) will be ignored.

        This is helpful if ie. an animation of type "drawing" is used
        where many spectrum peaks are displayed.
        If you want them to be displayed independent of the user
        settings, then you can set this option to true.

        But for ie. an animation with jumping speakers you will
        want to user to influence the animation by the user-
        sensitivity so that the user can adjust how strong the
        jumping speakers will react on bass or treble frequencies.

    The following options still can be used by both data-sources
    ("Spectrum" and "Spectrum Peaks"), but they can be used for
    animations on type "drawing" only.
    For animations of type "thermometer" or "single" they will be
    ignored.
    Maybe in a future version of Power PlugIn, this will also work
    for animations of type "thermometer" (for "single" the top
    value makes no sense).
    In addition it may be that in a future version of Power PlugIn,
    there will be added some new animations of type "drawing"
    (which can be selected using option "Drawing Object" described
    later). It may be that not all of these drawing objects will
    support the spectrum-top-values.

    In each case where an animation does not use spectrum-top-values,
    it is not harmful to define the spectrum-top-value options but
    Power PlugIn simply will ignore them for these animations.

    Note: If an animation can use spectrum-top-values, but you are
    using animation-sequence "Rotate", the top-values will be drawn,
    but they will be calculated based upon sequence "1:1" while
    the data values of the spectrum themselves will be calculated
    based upon "Rotate".
    So for sequence "Rotate", usage of spectrum-top-values make
    no sense. But if you want to use them, do so (if you can
    find any sense in it).

    The following 2 options define a top-value for each peak of
    the spectrum (works for data-source "Spectrum Peaks" as well
    as for "Spectrum").
    The top value will be hold on its position for a specific time
    and then will fall off with a specific speed.

    - "Spectrum Top Falloff"
        This option is used to define the falloff speed of the
        spectrum-top-values.
        It is a dword in the range of 0 to 1000.
        It is similar to the "Spectrum Falloff" option above.

    - "Spectrum Top Wait Delay"
        This option defines the time delay in milliseconds
        which a spectrum-top-value will wait till it will
        fall off.
        It is a dword value.

    additional Options for anim-type ("Anim Type") "single":
    --------------------------------------------------------

    - "Empty Image"
        This option is a dword value operating as boolean.
        If set to 0, false is meant. All other values mean true.

        If not defined, false will be suggested.

        Noramlly (if set to false), Power PlugIn will draw only one
        of the images of animation at any time.

        When settings this option to true, the animation
        will be handled as having one more image. (But you
        should not change the "Number of Images" value).
        The new image will be the first one and it will
        be completely empty which means, only the background
        will be visible.

        I did implement this option because for a situation like that:
        Imagine you have an animation of type "single" and
        sequence "1:1" displaying several lamps where only one
        lamp at a time is visible. It then may be your wish
        that if no sound is played, none of the lamps is displayed.
        This will be possible when using the "Empty Image" option.

    additional Options for anim-type ("Anim Type") "thermometer":
    -------------------------------------------------------------

    Currently there are no special options for this
    animation type.

    additional Options for anim-type ("Anim Type") "drawing":
    ---------------------------------------------------------

    For this anim type, you will have to define, which drawing
    should be used.

    - "Drawing Object"
        With this (string) option you can define, which drawing to use.
        Supported objects:
         - "Top Spectrum" : will generate a spectrum from left to right
                            placed at the top of the effective drawing rect.
         - "VCenter Spectrum" : will generate a spectrum from left
                                to right where the top half is mirrored
                                to the bottom half.
         - "Bottom Spectrum" : will generate a spectrum from left to right
                               placed at the bottom of the effective drawing rect.
         - "Left Spectrum" : will generate a spectrum from top to bottom
                             placed at the left side of the effective drawing rect.
         - "HCenter Spectrum" : will generate a spectrum from top
                                to bottom where the left half is mirrored
                                to the right half.
         - "Right Spectrum" : will generate a spectrum from top to bottom
                              placed at the right side of the effective drawing rect.
         - "Fire" : A fire will be generated like this: In the effective drawing rect,
                    there will be drawn some colors (axplained later).
                    For a horizontal fire source (I am speaking of a fire whose flames
                    move upwards like normal fire, or downwards) the height of the
                    effective drawing rect (defined by option "Effective Drawing Rect")
                    should be only some pixels large. When adding a blur (which moves
                    upwards or downwards) the flames will be visible.
                    For a vertical fire source (when the flames shall move left or
                    right), the width of the effective drawing rect should be only
                    some pixels large. For this, a blur should be added which
                    moves left or right.
                    This object does not work with a data-source "Spectrum Peaks".
                    It needs only the data-source "Spectrum".
                    More options for a fire will be described below.
         - "Flare" : This one works with "Spectrum Peaks" as data-source rather
                     than "Spectrum".
                     It draws the spectrum peaks ordered in an ellipse using
                     lines. By defining the "Drawing Style" of "outlined" or "filled"
                     you can select if only the lines should be drawn or
                     if the area should be filled.
                     More options for a flare will be described below.

                     Note:
                     As described at the data-source "Spectrum Peaks", each peak is
                     calculated from the average value of a range of input spectrum
                     data values. The larger you set this range (ie. in the
                     "Spectrum Peaks List" option, this range is set by the
                     "W" parameter in the string) the more the flare will look
                     like an ellipse and react smoother. If you set the range
                     very small (ie. 2 or 3), the spectrum peaks will react very
                     heavy and the flare will flicker very much.

                     In addition you can specify the "Spectrum Falloff" option which
                     will cause the flare to become more slowly smaller.

                     Try out some different settings. Of course you can also use all
                     other options which manipulte the data-source (like
                     "Spectrum Sensitivity", "Spectrum Function" etc.) since the
                     manipulation of the data-source is independent from the
                     other animation settings (like animation type, sequence etc).

        Note to all possible spectrum-objects:
         If you do not want the visible spectrum to be generated from left to
         right or from top to bottom, you can reverse the order of the
         "Spectrum Peaks" or "Spectrum Peaks List". This will cause the visible
         spectrum to be generated from right to left or from bottom to top.

        Please tell me if you want me to implement your ideas of drawing-
        objects for future versions of Power PlugIn and I will try to do so.

        Note: You *must* specify this option ("Drawing Object") or Power PlugIn will
              not draw anything in the animation.

    - "Drawing Rect"
        Defines the rectangle wherein the drawing will be placed in over
        the background image.

        This is a string value.

        Format:
          "x,y,cx,cy"

        x is the x-coordinate and y the y-coordinate of the top left corner
        of the rectangle. It is relative to the imaginary origin of
        the plugin-window. (The imaginary origin has been explained above
        at the descriptions of the image options, especially the
        "Image ? Origin" option).

        cx and cy define the width and height of the rectangle.
        In addition this is the size of the image where the drawing will
        be placed into. Power PlugIn will then plot the image into the
        the plugin-window.

        Note: You *must* specify this option or Power PlugIn will not draw
              anything in the animation.

    - "Effective Drawing Rect"
        This is the effective drawing rectangle where Power PlugIn will draw
        points, rectangles, lines, circles etc. into. The drawing
        will not exceed this rectangle (the drawing will be clipped to
        this rectangle).

        The format is the same as for "Drawing Rect". In addition, this
        rectangle also is relative to the imaginary origin.

        Normally you will set this rectangle to the same as the
        "Drawing Rect".
        But if you are using blur (described a bit later), you would want
        to make this rect a bit smaller (about 2 to 8 pixels border width
        on each side of the rectangle) because the drawings will be
        made smoother and thicker the more blurry they become.

        Note: You *must* specify this option or Power PlugIn will not draw
              anything in the animation.

    - "Drawing Color Table"
        This defines a palette for the drawing image to use.
        The drawing image will be created as image using 256 colors.
        So the palette should contain 256 colors.

        The syntax is similar to the one of the "Image n Color Fade"
        option described above. Look there for a exact description
        of the syntax.

        BUT with the "Drawing Color Table" you also can specifiy
        a palette using a slightely different syntax:

        You can define an alpha-channel value for each color.
        The alpha-channel will be necessary only if you will
        enable alpha-blending (using the "Alpha Blending" option
        described a bit later).
        Alpha blending will offer the possiblity of transpareny while
        you can tell for each color entry in the palette, *how much*
        transparent the color will be.

        The format for colors with alpha-blending is:
        The format is a string with several color definitions separated
        by ";" characters.
        Each color definition consists of a color index (decimal value
        only) in the range 0 to 255, then a "," char followed by an ARGB
        color value (hexadecimal value only) (the A in ARGB means the
        alpha channel).
        An ARGB color will be a hexadecimal value of format AARRGGBB where
        A is the alpha channel, R the red channel, G the green channel
        and B the blue channel.
        For the alpha channel, a color is completely opaque if its alpha
        value is set to 0, and completely transparent for 255.
        Example:

          "Drawing Color Table" = "0,ff000000;255,00ffffff";

        In this example, the color at index 255 is completely white and
        totally opaque, while color at index 0 is completely black and
        totally transparent.
        The colors in between are a fading between these colors, but
        also the alpha channel will be faded in between so that a
        color with lower index will be more transparent (for that
        example above).

      IMPORTANT NOTE:
        If you are using blur, I recommend that you should set
        the "Drawing Color" (described a bit later) to the color at
        index 255, because the blur will function that way that it
        will decrease the color index for each pixel in the image.
        So the drawing should be made with the color at index 255
        to get the best blur effect.
        BUT FOR THIS, you should ensure that in the color table
        only *ONE INDEX* has the RRGGBB color value to be used for
        drawing the rectangles, lines, points, circles etc.
        (In addition for a blur that index should be index 255).

        Even if there are 2 colors with the same RRGGBB values but
        differ only by their AA values, the colors will be interpreted
        as equal.
        You should prevent such a case, because Power PlugIn will take the
        first color index which matches the RGB color defined
        in "Drawing Color" for drawing the rects, lines etc.
        If you want that the drawing engine will use index 255
        as drawing color, you will have to ensure that *only*
        the color at index 255 has the RRGGBB color value defined
        by "Drawing Color".

        Note: You *must* specify this option or Power PlugIn will not draw
              anything in the animation.

    - "Drawing Color"
        This is a dword defining the RGB color to use for drawing
        rectangles, lines, circles, points etc. into the
        drawing image.

        Format is the same as of the "Image ? Glass Color" option
        described somewhere above.
        Example:

          "Drawing Color" = dword: A0FF00;

        This example uses a color of red=160, green=255, blue=0 as
        drawing color.
        This color should be present in the "Drawing Color Table".

        Please read the IMPORTANT NOTE in the "Drawing Color Table"
        option to know, how to define a color for drawing.

        If you define a "Drawing Color" which is not present in
        the "Drawing Color Table", then Power PlugIn will use that
        color of the color table which matches closest to the
        specified drawing color.
        In such a case, it is not exactly clear, which index of
        the color table Power PlugIn will choose.

        Note: You *must* specify this option or Power PlugIn will not draw
              anything in the animation.

    - "Drawing Style"
        Defines the style, how Power PlugIn will draw the drawing
        object.

        This option is a string value.

        I will list here all supported values you can specify.
        But it can be for different drawing objects (defined by
        the "Drawing Object" option), that not all of the specified
        styles are possible.
        Try it out.

        Supported values:
         - "filled"   : (this is the default if "Drawing Style"
                         is not specified)
                        This will cause the drawing (ie. a spectrum)
                        to be drawn filled (ie. with filled boxes).
                        Note: For a spectrum, the top-values (if enabled)
                         will be drawn non-filled nevertheless.
         - "outlined" : This will cause the drawing (ie. a spectrum)
                        to be drawn only using thin lines.

    additional Options for animation-types:
    ---------------------------------------

    The following options are currently supported only for
    an animation type "drawing" (defined by "Anim Type" option).
    If they are defined for other anim types, they will be ignored.
    This may change in a future version of Power PlugIn.

    - "Blur"
        This is a dword value working as boolean. If set to 0, this
        means false, all other values mean true.

        It set to true, the blur operation is enabled.

        IMPORTANT NOTE:
        The blur operation can be very time-expensive if the
        "Drawing Rect" option is set to a large size.

        Please notice, that the blur-operation will performed
        on the whole rect defined by "Drawing Rect" and not just
        on the (possibly smaller) rect defined by
        "Effective Drawing Rect".

    - "Blur Speed"
        This option will be ignored if the "Blur" option not true.

        With this option (a dword value) you can define the speed for
        the blur operation.

        The higher the value, the faster the blurring will be, (this means
        the faster the blur will clear the image).
        Slowest = 0.

        Note: Although negative values are possible,
              they make no sense.

        IMPORTANT NOTE:
          The make a good blur, you should define a "Drawing Color Table"
          where the "Drawing Color" should be the color on index 255, because
          the blur operation will work that way, that it decreases the
          index values of the pixels in the image.
          For more about it, read the IMPORTANT NOTE at the description of the
          "Drawing Color Table" option above.

        Note: If you want the blur to be slower than 0, you can define a
         "Timer Delay". But do not forget that this also will slow down
         the interval of retrieving source data.

    - "Blur Movement"
        This string option will enable the blur to move in one direction.

        Format: "<x-move>,<y-move>"

        <x-move> defines the movement in horizontal direction.
        0 will not move in that direction.
        1 will move right.
        2 will move right in double speed.
        etc.
        Negative values will move in left direction.

        <y-move> defines the movement in vertical direction.
        0 will not move in that direction.
        1 will move down.
        2 will move down in double speed.
        etc.
        Negative values will move upwards.

        Example:
          "Blur Movement" = "3,-1";
        will move in triple speed to the right and upwards as well.

        Note for fire (I mean when option "Drawing Object" is set to "Fire"):
         For a fire you will want to add a moving blur to see the flames.
         Imagine a fire whose flames shall move upwards.
         For this, a horizontal fire source shall be created (see explanations
         of fire options below). In that case, the effective drawing rect
         (defined by option "Effective Drawing Rect") should be only some
         pixels high. But the height should not be smaller than the moving
         speed or else the flames will look to pixelized.
         Example:
           "Blur Movement" = "0,-4";
         For this the effective drawing rect should have a height of 4 at minimum,
         better will be 5 or 6.

         For a fire whose flames shall move left or right, the fire source shall
         be a vertical one (specified by option "Vertical Fire Source") and
         the *width* of the effective drawing rect shall be set that way as
         explained above for the height of a horizontal fire source.

        If this option is not provided, no movement will be allpied on the blur.

    - "Blur Scale"
        With this option, you can stretch the blur effect in x- and/or y-direction.
        The more a blur is stretched, it will look more pixelized.

        Format: "<x-scale>,<y-scale>"

        <x-scale> shall be set to a value greater or equal to 1.
        <y-scale> shall be set to a value greater or equal to 1.

        The default will be 1 for both directions. (No stretching if this
        option is not provided).

    - "Alpha Blending"
        This option is a dword value working as boolean. If set to
        0, this means false, all other values mean true.

        If set to true, alpha blending will enabled.
        For this, the "Drawing Color Table" should be defined with
        colors in for AARRGGBB (where A means the alpha channel).
        See the description *and* IMPORTANT NOTE to "Drawing Color Table".

        With alpha blending enabled, the background will shine through.

        I recommend to use alpha blending for an animation *only* if
        it does not overlap with other animations (which is the case
        when even only the bounding rectangles of each of an anims
        images overlap with the bouding rects of the images of another
        anim; do not forget that for an anim of type "drawing" also uses
        an image defined by "Drawing Rect" option).
        If it would overlap nevertheless, this would result in a wrong
        displaying, because the alpha-blending for an anim will work
        only with the background image. All other anims below the
        "drawing"-anim will not be visible (in the area where the anims
        do overlap).

        IMPORTANT NOTE:
          The alpha blending is a very time-expensive operation (it is
          even slower than the blur operation), because for each pixel,
          the CPU will have to do 6 multiplications, 3 additions and
          3 shift operations.

          Please, when using alpha blending, hold the image size defined
          by "Drawing Rect" as small as possible.

    - "Mask Image"
        With this option you can specify a mask image to be used for
        animations of type "drawing" so that the visible part is not
        just a simple rectangle.

        The format is the same as for the "Image ?" option.

        Note: It is *not* necessary that the image is at the same position
         and the same size as the drawing rect defined by the "Drawing Rect"
         option. Power PlugIn will automatically handle this correctly and
         will use the intersection of the non-rectangular area defined by
         the mask image and the drawing rect.

    - "Mask Image Rect"
        Has the same meaning as "Image ? Rect" option but is intended
        for image defined by the "Mask Image" option.

    - "Mask Image Origin"
        Has the same meaning as "Image ? Origin" option but is intended
        for image defined by the "Mask Image" option.

    - "Mask Image Glass Color"
        Has the same meaning as "Image ? Glass Color" option but is intended
        for image defined by the "Mask Image" option.

    additional Options for drawing-object "Fire":
    ---------------------------------------------

    - "Fire Color Index Range"
        With this option you can specify a basic, permanent fire to use
        for the animation. This permanent fire will be visible even if
        no sound can be heard from the music-player (as long as you do
        not specify the "Min Number of Hotspots for Permanent Fire" option).

        Format: "<min>-<max>"

        <min> is the minimum index (it must be equal or smaller to <max>)
        <max> is the maximum index to use

        Each index value is an index into the color table (defined by
        "Drawing Color Table" option). So it can be only a value in
        the range of 0 to 255.

        Power PlugIn will generate the permanent fire by taking
        color values randomly out of the specified range and put
        it on random positions in the effective drawing rect (defined
        by "Effective Drawing Rect" option).

        Examples:
          "Fire Color Index Range" = "20-100";
          "Fire Color Index Range" = "0-0";
        The second example will completely switch off usage of a permanent
        fire.

        The permanent fire will make look the fire more smooth and more
        realistic when there are some/many hotspots drawn as well.
        (See explanation of hotspots below).
        You may want this to happen, but in addition you may want no
        fire visible if no sound is being heard from the music-player.
        This you may handle with the "Min Number of Hotspots for
        Permanent Fire" option explained below.

    - "Number of Fire Hotspots"
        In addition to a permanent fire, there are hotspots which will
        be drawn into the effective drawing rect (defined by the
        "Effective Drawing Rect" option) as well.

        The hotspots are drawn with a special color (defined by the
        "Fire Hotspot Color Index" option), which mostly will be set
        to 255 which mostly will represent a light color so that
        the hotspots really look 'hot'.

        The "Number of Fire Hotspots" option specifies the minimum and
        maximum number of hotspots to draw. Power PlugIn will select
        a number in that range according to the data-source.
        (For a fire, you cannot use "Spectrum Peaks" as data-source defined
        by the "Anim Data Source" option. But you can use a data-source
        which generates only one single data value like the "Spectrum"
        data-source).

        Format: "<min>-<max>"

        where <min> is the minimum number of hotspots and <max> is the
        maximum number.
        <max> must be equal or greater than <min>.
        Each of the 2 values must be greater or equal to zero.

        Mostly you will want <min> to be zero so that no hotspots are
        drawn if no sound is heard from the music-player.

        The <max> value mostly you will set according to the size
        of the effective drawing rect.

        Example:
          "Number of Fire Hotspots" = "0-50";

    - "Fire Hotspot Color Index"
        specifies the color to use for drawing hotspots.
        This is an index value which points into the color table defined
        by the "Drawing Color Table" option.
        So it can be taken out of the range 0 to 255.

        Mostly the color table you will create that way that at index 0
        you have the drakest (and possible most transparent) color whereas
        at index 255 you will select the lightest (and possibly most opaque)
        color. (This order you will want because of the blur operation if
        enabled).
        In that case you will mostly use 255 as color index for hotspots
        because it represents the lightest color.

    - "Min Number of Hotspots for Permanent Fire"
        As explained in option "Fire Color Index Range" above, a permanent
        fire mostly makes sense to make the fire look more realistic.
        Sometimes you want the permanent fire to visible even if no sound
        can be heard from the music-player.

        But on the other hand you may want to use a permanent fire to make
        a realistic fire, but when no sound is heard, no fire should be
        visible.

        To make this, you can specifiy the option
        "Min Number of Hotspots for Permanent Fire".

        It specifies the minimum number of hotspots which must be drawn so
        that also the permanent fire is drawn.
        If the number of hotspots is less than the specified number, than
        no permanent fire will be drawn.

        Example:
          "Min Number of Hotspots for Permanent Fire" = dword: #1;
        will cause the permanent fire to be drawn only if one or more
        hotspots are drawn. If no hotspots are drawn, also no permanent
        fire will be visible.

        If this option is not speicified, it will be imagined as if it has
        been set to 0 (which means that the permanent fire will always
        be drawn).

    - "Vertical Fire Source"
        This is a dword value interpreted as boolean.
        If set to 0 it means false, all other values mean true.

        By default (if this option is not specified), the fire source
        will be drawn horizontally. This will be used for fires which
        shall move upwards or downwards. In that case the height
        of the effective drawing rect shall be only some pixels large
        (depending on the "Blur Movement" option).

        If you set this to true, the fire souce will be vertically to
        be used for a fire which moves to the left or to the right.
        In that case, the *width* of the effective drawing rect shall
        be only some pixels large.

        Example:
          "Vertical Fire Source" = dword: 0;

    - "Clear Fire Source"
        A dword value which acts as a boolean.
        If set to 0 it means false, all other values mean true.

        If this option is not specified, true will be imagined.

        If set to true, Power PlugIn will generate the fire as
        following:
        - It will draw the permanent fire and the hotspots into
          the effective drawing rect.
        - Then it will do the blur on the image.
        - Then it will clear the fire source again. For this it
          will clear the effective drawing rect (and a somewhere
          outside where the blur did draw something which does
          not look like a fire).

        If set to false, the last step will not be done.

        This option has been implemented, because if the fire source
        would stay visible, it will not look realistic, because the
        blur will (hardly) done no smoothing on it.

    - "Fire Wobble Size"
        By default, Power PlugIn will always fill the whole effective
        drawing rect with the fire source. This means that the
        width of a horizontal fire source and the height of a vertical
        fire source always are the same.

        By setting this dword value greater than 0, you can specifify
        an offset value which Power PlugIn will use randomly to decrease
        the width of a horizontal fire source or the height of a
        vertical fire source.

        The value specified will be the maximum value which Power PlugIn
        will subtract from the left and right border of the horizontal
        fire source or from the top and bottom border of the vertical
        fire source.

        This will make the fire look more realistic.

        The value cannot be greater than the width (for horizontal fire
        source) or height (for vertical fire source) of the effective
        drawing rect (defined by "Effective Drawing Rect" option).
        If you nevertheless set it to a greater value, Power PlugIn
        will automatically truncate it to the maximum value possible.

        If this option is not specified, it is the same as if it has
        been set to 0 (which means no wobbling).

        Example:
          "Fire Wobble Size" = dword: #10;

        Normally you would want to set the wobble size to a value of
        10% or 20% of the full width (for horz fire source) or height
        (for vert fire source) of the effective drawing rect to
        get good results.
        Try out some values.

    - "Fire Hotspot Size"
        Normally a hotspot has a size of 3.
        You may want to change this by setting this dword value.

        This value will affect the width of the hotspot (for horizontal
        fire source) or the height of the hotspot (for vertical
        fire source).

        Example:
          "Fire Hotspot Size" = dword: #3;

    Note: To test how only the fire source looks like, make the
     effective drawing rect ("Effective Drawing Rect" option) as
     large as the drawing rect ("Drawing Rect" option) and switch
     off the blur. Also set "Clear Fire Source" option to false.



HOW DOES POWER PLUGIN ANALYSE AND OPTIMIZE A SKIN:
--------------------------------------------------

After a Skin has been loaded, Power PlugIn will analyse it
and try to optimize it for faster drawing operations. Normally,
animations with images will be drawn internally like that: For
images with a mask, the background image will be drawn into a
temporary image, then the non-transparent parts of the animation-
image will be drawn into the temprary image. Finally the temporary
image will be drawn into the plugin-window. The usage of a temporary
image is necessary to prevent flickering.

The disadvantage is that for drawing one image, 3 drawing operations
have to be done.

But in certain cases, Power PlugIn will be able to optimize the
skin's images for speed. Currently this is possible only for
animations of type "single" (for a description of animation
types, see the option "Anim Type" in section
"SYNTAX AND CONTENTS OF FILE SKIN.TXT" above).
An animation of type single means that only one of the images will
be visible at any time (this is used for ie. jumping speakers).

Power PlugIn will try to optimize in two passes:
( Please do not forget, that this works only with animations
of type "single" ).

1/  First it will analyse all loaded animtions of type "single".
    The optimization for an animation will not be possible, if:
    - one or more of its images overlap with images of other animations, or
    - if one image of the animation is used multiple times (no matter
      if it used multiple times in the same anim or in different anims)
      and that image is not always over the same background image (if the
      same image is in different plugin-windows) and at the same offset
      position.
      The background images will be different, if even only their
      index defined by "Image ? Index" is different.
      If you have background images which only differ by the
      "Image ? Index" and you have animation images which are the same
      each one over one of the backgrounds, you should also define
      different "Image ? Index" indices for these animation images.
      Then again, Power PlugIn will be able to optimize the images.

    After images have been optimized with pass 1, they internally are
    stored only as rectangular images. The advantage is, that
    Power PlugIn will not need to handle non-rectangular areas when
    drawing these images.
    But nevertheless, it will have to use a temporary image (as
    described above) to clear the old image and draw the new
    one. Still, it will have to do 3 drawing operations to do
    one animation frame.

    With pass 2, it will try to reduce this to only one drawing
    operation for each anim frame.

2/  If all requirements of pass 1 are met, then Power PlugIn will try
    to do pass 2. In this pass, it will check (only for anims
    of type "single"), if all its images bounding rects completely
    lies inside of the bouding rect of its largest image.
    If only one pixel of only one of the rects lies outside of
    the largest rect, Power PlugIn will not be able to do pass 2.

    If it is able to do pass 2, it will enlarge all images to the
    largest rect, filling the new borders with the background image.
    The result will be that Power PlugIn only needs to draw one of
    the images into the plugin-window to clear the old one and
    draw the new one. (When doing so, Power PlugIn will nevertheless
    calculate the smallest necessary rect for that draw opertion to
    hold the execution as low as possible).
    In that case, Power PlugIn will not need a temporary image for
    the drawing operation.

If you, the skin designer, want to see, which images Power PlugIn
can optimize, open the Power PlugIn configuration and enable
the test-optimization option.
The images will then be drawn with red borders (which will be visible
only if the images have been non-rectangular, else for rectangular
images, the red borders will not be visible, but these images
are optimized with pass 1 automatically since pass 1 does nothing
else as making non-rectangular images rectangular).
If an image has been optimized with pass 2, there will also be visible
a green border (but the red one can be visible nevertheless).

A Hint:
-------
If you see that images for an animation of type "single"
have not been optimized, but you believe Power PlugIn should have
optimized them, try to define a differen index for the animation
images using "Image n Index". Also if the background image is used
in another plugin-window as well, try to set the index of the
background image (I mean that one below the anim you want to
be optimized) to a different value using "Image ? Index".
Be sure that you really define index values, which are not used
elsewhere.
Power PlugIn should now optimize the images using pass 1.
If pass 2 still does not work, then the reason can be that one
of the anim's images lies (partially) outside of the bounding
rect of the largest image. Sorry, but for this, the only solutions
will be that you have to move that image or use a different one
so that it lies inside the largest rect.



Now there are still some other optimizations
which will be done for *all* types of animations where possible:

- If an image has a mask (regardless if the mask is defined by a
  seperate mask image, or by setting the glass-color), and if
  the mask has some transparent borders, then Power PlugIn will
  automatically load only that part of the image which is obscured
  by the smallest possible bounding rectangle.
- If an image has a mask, and Power PlugIn finds that the mask is
  only one rectangle, it will automatically loads only that
  rectangle of the image. The image then will be handled internally
  as having no mask (because it is just one rect) since this will
  decrease CPU-usage.
- For animations of type "thermometer": Power PlugIn will not always draw
  all visible images of the animation. It will only draw the images
  which have been added since the last animation frame, or it will
  clear the images which have been removed since the last animation
  frame.



HOW TO DESIGN A PLUGIN FOR SPEED:
---------------------------------

- First of all you should prevent animations in the same plugin-window
  from overlapping each other (redardless of the "Anim Type" of the
  animations, even if an animation is of type "Drawing").
  If an animation overlaps with other(s), then, when one frame of the
  animation is drawn, the overlapping parts of the other animation(s)
  will have to be drawn as well. This concerns to all overlapping
  animations (in the same plugin-window of course).
  In addition, Power PlugIn will not be able to optimize animations
  which do overlap.
  You see, overlapping animations can increase CPU usage dramatically.
  So if you really need overlapping animations, be sure to make
  their images or drawings as small as possible, and set a timer
  for these animations to make them to be drawn not so often.
  The higher the timer the better it is for CPU-usage (but of
  course the animation will run more jerky).

  Note: An animation is interpreted as overlapping with another if
  the bounding rectangle of one or more of its images overlap
  with the bounding rectangle of images of another animation.
  (For animations with drawings, the rectangle defined by
  "Drawing Rect" will be used to check for overlapping with other
  animations).
  So DO NOT FORGET: It can be that 2 circular images (I mean images
  with mask images containing a circle) do not overlap but their
  bounding rectangles *do* overlap. In that case, the 2 animations
  *will* be interpreted as overlapping animations.

  Note: Animations in different plugin-windows are independent and
  therefore can never be interpreted as overlapping animations, even
  if the plugin-windows do overlap.

- For animations of type "thermometer", you should ensure that none
  of its images (or only as few as possible) do overlap with each other.
  I am speaking only of the images of the *same* animation.

  Similar to the overlapping animations explained above, a thermometer-
  animation will have to draw overlapping parts of its own images
  multiple times.

  THE WORST CASE would be if there are animations of type "thermometer"
  having overlapping images as well as being overlapped with other
  animations (maybe also of type "thermometer"). As you can imagine
  this can increase CPU-usage dramatically.

- For animations of type "thermometer", you should try to use images
  *without* any mask (or with a mask with just one single rectangle).

  Images with non-rectangular masks or with masks with more than one
  rectangle will cause Power PlugIn to use a temporary image for
  drawing which can increase CPU-usage (especially if the thermometer-
  animations contains many images).

- For animations using blur or alpha-blending you should try to
  make their rectangles (defined by "Drawing Rect") as small
  as possible since these operations (especiall alpha-blending)
  can increase CPU-usage dramatically.
Download Driver Pack

How To Update Drivers Manually

After your driver has been downloaded, follow these simple steps to install it.

  • Expand the archive file (if the download file is in zip or rar format).

  • If the expanded file has an .exe extension, double click it and follow the installation instructions.

  • Otherwise, open Device Manager by right-clicking the Start menu and selecting Device Manager.

  • Find the device and model you want to update in the device list.

  • Double-click on it to open the Properties dialog box.

  • From the Properties dialog box, select the Driver tab.

  • Click the Update Driver button, then follow the instructions.

Very important: You must reboot your system to ensure that any driver updates have taken effect.

For more help, visit our Driver Support section for step-by-step videos on how to install drivers for every file type.

server: web1, load: 0.90