21.2 ColorConverter Interface

ORIGIN '~beta/basiclib/betaenv';
BODY 'private/colorConverterBody'
(* 
 * ColorConverter:
 *    This file implements conversion routines between the different
 *    color models.  Currently, three color models are supported:
 *    RGB, CMY and HSV.
 *
 *    The implementation of HSVtoRGB and RGBtoHSV routines
 *    are based on the Bifrost implementation (PaintImpl.bet)
 * 
 * Usage:
 *    converter: @colorConverter;
 *    ...
 *    RGBcolor->converter.RGBtoHSV->HSVcolor;
 *    ...
 *    HSVcolor->converter.HSVtoRGB->RGBcolor;
 *  
 * You can costumize this converter to convert into RGB and HSV
 * color models with different ranges for the dimensions in the
 * color models by further binding the maxRGB, MaxHue, MaxSat, and
 * maxVal virtuale in colorConverter.  E.g. to use a 256 RGB cube,
 * declare:
 * 
 *    converter: @colorConverter(# maxRGB:: (# do 256->value #);
 * 
 * Please note, that due to the duality of the RGB and CMY color models,
 * they use the same MaxRGB constant.
 *)
--- LIB: attributes ---

colorConverter:
  (# (* Contants specifying the range for RGB, hue, saturation and value *)
     MaxRGB:< IntegerValue(# do 65535->value; INNER #);
     MaxHue:< IntegerValue(# do   360->value; INNER #);
     MaxSat:< IntegerValue(# do 32768->value; INNER #); (* (2^15) *)
     MaxVal:< IntegerValue(# do 32768->value; INNER #); (* (2^15) *)
    
     HSVtoRGB: 
       (* Convert h in [0, MaxHue], s in [0, MaxSat], V in [0, MaxVal]
        * to RGB-values in [0, MaxRGB].
        * Adapted from algorithm in
        * "Foley and van Dam: Fundamentals of Interactive Computer Graphics"
        *)
       (# H, S, V: @integer;
          R, G, B: @integer;
          convert: @...
       enter (H, S, V)
       do convert
       exit (r, g, b)
       #);
     RGBtoHSV: 
       (* Obtain HSV from RGB *)
       (# R, G, B: @integer;
          H, S, V: @integer;
          convert: @...
       enter (r, g, b)
       do convert
       exit (H, S, V)
       #);
     CMYtoRGB:
       (* convert CMY color to RGB color *)
       (# C, M, Y: @integer;
          R, G, B: @integer;
          max: (* private *) @integer;
       enter (C, M, Y)
       do maxRGB->max; (max-C, max-M, max-Y)->(R, G, B)
       exit (R, G, B)
       #);
     RGBtoCMY:
       (* convert RGB color to CMY color *)
       (# R, G, B: @integer;
          C, M, Y: @integer;
          max: (* private *) @integer;
       enter (R, G, B)
       do maxRGB->max; (max-R, max-G, max-Y)->(C, M, Y)
       exit (C, M, Y)
       #);
  #)


21.2 ColorConverter Interface
© 1994-2004 Mjølner Informatics
[Modified: Thursday April 23rd 1998 at 14:56]