OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [insight/] [itcl/] [iwidgets3.0.0/] [generic/] [colors.itcl] - Rev 1782

Go to most recent revision | Compare with Previous | Blame | View Log

#
# colors
# ----------------------------------------------------------------------
# The colors class encapsulates several color related utility functions.
# Class level scope resolution must be used inorder to access the static
# member functions.
#
#   USAGE:
#     set hsb [colors::rgbToHsb [winfo rgb . bisque]]
#
# ----------------------------------------------------------------------
#  AUTHOR: Mark L. Ulferts               EMAIL: mulferts@spd.dsccc.com
#
#  @(#) $Id: colors.itcl,v 1.1.1.1 2002-01-16 10:24:50 markom Exp $
# ----------------------------------------------------------------------
#                   Copyright (c) 1995  Mark L. Ulferts
# ======================================================================
# Permission is hereby granted, without written agreement and without
# license or royalty fees, to use, copy, modify, and distribute this
# software and its documentation for any purpose, provided that the
# above copyright notice and the following two paragraphs appear in
# all copies of this software.
# 
# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 
# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 
# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 
# DAMAGE.
#
# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
# FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
# ======================================================================

namespace eval iwidgets::colors {

    # ------------------------------------------------------------------
    # PROCEDURE: rgbToNumeric
    #
    # Returns the numeric value for a list of red, green, and blue.
    # ------------------------------------------------------------------
    proc rgbToNumeric {rgb} {
        if {[llength $rgb] != 3} {
            error "bad arg: \"$rgb\", should be list of red, green, and blue"
        }

        return [format "#%04x%04x%04x" \
                [lindex $rgb 0] [lindex $rgb 1] [lindex $rgb 2]]
    }

    # ------------------------------------------------------------------
    # PROCEDURE: rgbToHsb
    #
    # The procedure below converts an RGB value to HSB.  It takes red, 
    # green, and blue components (0-65535) as arguments, and returns a 
    # list containing HSB components (floating-point, 0-1) as result.  
    # The code here is a copy of the code on page 615 of "Fundamentals
    # of Interactive Computer Graphics" by Foley and Van Dam.
    # ------------------------------------------------------------------
    proc rgbToHsb {rgb} {
        if {[llength $rgb] != 3} {
            error "bad arg: \"$rgb\", should be list of red, green, and blue"
        }

        set r [expr [lindex $rgb 0]/65535.0]
        set g [expr [lindex $rgb 1]/65535.0]
        set b [expr [lindex $rgb 2]/65535.0]

        set max 0
        if {$r > $max} {set max $r}
        if {$g > $max} {set max $g}
        if {$b > $max} {set max $b}

        set min 65535
        if {$r < $min} {set min $r}
        if {$g < $min} {set min $g}
        if {$b < $min} {set min $b}

        if {$max != 0} {
            set sat  [expr ($max-$min)/$max]
        } else {
            set sat 0
        }
        if {$sat == 0} {
            set hue 0
        } else {
            set rc [expr ($max-$r)/($max-$min)]
            set gc [expr ($max-$g)/($max-$min)]
            set bc [expr ($max-$b)/($max-$min)]

            if {$r == $max} {
                set hue [expr $bc-$gc]
            } elseif {$g == $max} {
                set hue [expr 2+$rc-$bc]
            } elseif {$b == $max} {
                set hue [expr 4+$gc-$rc]
            }
            set hue [expr $hue*0.1666667]
            if {$hue < 0} {set hue [expr $hue+1.0]}
        }
        return [list $hue $sat $max]
    }

    # ------------------------------------------------------------------
    # PROCEDURE: hsbToRgb
    #
    # The procedure below converts an HSB value to RGB.  It takes hue, 
    # saturation, and value components (floating-point, 0-1.0) as 
    # arguments, and returns a list containing RGB components (integers, 
    # 0-65535) as result.  The code here is a copy of the code on page 
    # 616 of "Fundamentals of Interactive Computer Graphics" by Foley 
    # and Van Dam.
    # ------------------------------------------------------------------
    proc hsbToRgb {hsb} {

        if {[llength $hsb] != 3} {
            error "bad arg: \"$hsb\", should be list of hue, saturation, and brightness"
        }

        set hue [lindex $hsb 0]
        set sat [lindex $hsb 1]
        set value [lindex $hsb 2]

        set v [format %.0f [expr 65535.0*$value]]
        if {$sat == 0} {
            return "$v $v $v"
        } else {
            set hue [expr $hue*6.0]
            if {$hue >= 6.0} {
                set hue 0.0
            }
            scan $hue. %d i
            set f [expr $hue-$i]
            set p [format %.0f [expr {65535.0*$value*(1 - $sat)}]]
            set q [format %.0f [expr {65535.0*$value*(1 - ($sat*$f))}]]
            set t [format %.0f [expr {65535.0*$value*(1 - ($sat*(1 - $f)))}]]
            case $i \
                    0 {return "$v $t $p"} \
                    1 {return "$q $v $p"} \
                    2 {return "$p $v $t"} \
                    3 {return "$p $q $v"} \
                    4 {return "$t $p $v"} \
                    5 {return "$v $p $q"}
            error "i value $i is out of range"
        }
    }

    # ------------------------------------------------------------------
        #
        # PROCEDURE: topShadow bgColor
        #
        # This method computes a lighter shadow variant of bgColor.
        # It wants to decrease the saturation to 25%. But if there is
        # no saturation (as in gray colors) it tries to turn the 
        # brightness up by 10%. It maxes the brightness at 1.0 to
        # avoid bogus colors...
        #
        # bgColor is converted to HSB where the calculations are 
        # made. Then converted back to an rgb color number (hex fmt)
        #
    # ------------------------------------------------------------------
        proc topShadow { bgColor } {

                set hsb [rgbToHsb [winfo rgb . $bgColor]]

                set saturation [lindex $hsb 1]
                set brightness [lindex $hsb 2]

                if { $brightness < 0.9 } {
                        # try turning the brightness up first.
                        set brightness [expr $brightness * 1.1]
                } else {
                        # otherwise fiddle with saturation
                        set saturation [expr $saturation * 0.25]
                }

                set hsb [lreplace $hsb 1 1 [set saturation]]
                set hsb [lreplace $hsb 2 2 [set brightness]]

                set rgb [hsbToRgb $hsb]
                set color [rgbToNumeric $rgb]
                return $color
        }

        
    # ------------------------------------------------------------------
        #
        # PROC: bottomShadow bgColor
        #
        #
        # This method computes a darker shadow variant of bg color.
        # It takes the brightness and decreases it to 80% of its
        # original value.
        #
        # bgColor is converted to HSB where the calculations are 
        # made. Then converted back to an rgb color number (hex fmt)
        #
    # ------------------------------------------------------------------
        proc bottomShadow { bgColor } {

                set hsb [rgbToHsb [winfo rgb . $bgColor]]
                set hsb [lreplace $hsb 2 2 [expr [lindex $hsb 2] * 0.8]]
                set rgb [hsbToRgb $hsb]
                set color [rgbToNumeric $rgb]
                return $color
        }
}

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.