Colormap.st
author Claus Gittinger <cg@exept.de>
Tue, 23 Apr 1996 22:16:07 +0200
changeset 602 f4827cf7d3f9
parent 572 b164eb8a3e6e
child 603 7e2b1e471427
permissions -rw-r--r--
commentary

"
 COPYRIGHT (c) 1994 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"

SequenceableCollection subclass:#Colormap
	instanceVariableNames:'redVector greenVector blueVector'
	classVariableNames:''
	poolDictionaries:''
	category:'Graphics-Images support'
!

!Colormap class methodsFor:'documentation'!

copyright
"
 COPYRIGHT (c) 1994 by Claus Gittinger
	      All Rights Reserved

 This software is furnished under a license and may be used
 only in accordance with the terms of that license and with the
 inclusion of the above copyright notice.   This software may not
 be provided or otherwise made available to, or used by, any
 other person.  No title to or ownership of the software is
 hereby transferred.
"
!

documentation
"
    Colormaps are used with images (and Forms) to keep the byte-to-color
    mapping.
    Externally, either colors or pixel values can be accessed.
    Internally, the values are stored as 3 separate byte-arrays
    (i.e. individual components can be 0..255).
    This was done to avoid overhead due to allocation of many color
    instances.

    [see also:]
        Color
"
! !

!Colormap class methodsFor:'instance creation'!

fromColors:aColorArray
    "given a collection of real colors, return a new instance
     of myself"

    |n rV gV bV|

    n := aColorArray size.
    rV := ByteArray new:n.
    gV := ByteArray new:n.
    bV := ByteArray new:n.
    1 to:n do:[:i |
        |clr|

        clr := aColorArray at:i.
        rV at:i put:(clr red * 255 / 100) rounded.
        bV at:i put:(clr green * 255 / 100) rounded.
        gV at:i put:(clr blue * 255 / 100) rounded.
    ].
    ^ self new redVector:rV greenVector:gV blueVector:bV

    "
     Colormap 
        fromColors:(Array with:Color black
                          with:Color red
                          with:Color white)
    "

    "Modified: 23.4.1996 / 22:15:22 / cg"
!

redVector:r greenVector:g blueVector:b
    "given vectors of red/green/and blue pixelValues,
     return a new instance of myself.
     The values must be in the range 0..255."

    ^ self new redVector:r greenVector:g blueVector:b

    "
     Colormap 
        redVector:#[0 127 255]
        greenVector:#[0 127 255]
        blueVector:#[0 127 255]
    "

    "Modified: 23.4.1996 / 22:16:00 / cg"
! !

!Colormap methodsFor:'accessing'!

at:index 
    "return the color at index - notice, that index is a typically derived
     from an images pixel value which ranges 0..255; while the index here
     starts at 1 (to make colormap look more like a collection)."

    |r g b|
    r := redVector at:index.
    g := greenVector at:index.
    b := blueVector at:index.
    ^ Color
	red:(r * 100 / 255)
	green:(g * 100 / 255)
	blue:(b * 100 / 255)
!

at:index put:aColor
    "set the color at index to aColor. Return aColor (sigh).
     - notice, that a color index is a typically derived
       from an images pixel value which ranges 0..255; 
       while the index here starts at 1 
       (to make colormap look more like a collection).
       Therefore, to modify a colorMap entry for pixel i, change
       the colorMaps slot at i+1."

    |r g b|

    r := (aColor red * 255 / 100) rounded.
    g := (aColor green * 255 / 100) rounded.
    b := (aColor blue * 255 / 100) rounded.
    redVector at:index put:r.
    greenVector at:index put:g.
    blueVector at:index put:b.
    ^ aColor

    "Modified: 19.4.1996 / 11:19:04 / cg"
!

blueAt:index
    "return the blue component at some index.
     The returned value is scaled from the internal 0.. 255 to
     a percentage value 0..100"

    ^ (blueVector at:index) * 100 / 255
!

blueVector
    "return blueVector"

    ^ blueVector
!

blueVector:something
    "set blueVector"

    blueVector := something.
!

colors
    "ST-80 compatibility: return a collection containing the colors I hold"

    ^ self asArray
!

greenAt:index
    "return the green component at some index.
     The returned value is scaled from the internal 0.. 255 to
     a percentage value 0..100"

    ^ (greenVector at:index) * 100 / 255
!

greenVector
    "return greenVector"

    ^ greenVector
!

greenVector:something
    "set greenVector"

    greenVector := something.
!

redAt:index
    "return the red component at some index.
     The returned value is scaled from the internal 0.. 255 to
     a percentage value 0..100"

    ^ (redVector at:index) * 100 / 255
!

redVector
    "return redVector"

    ^ redVector
!

redVector:something
    "set redVector"

    redVector := something.
!

redVector:r greenVector:g blueVector:b
    "set the red, green and blueVectors"

    redVector := r.
    greenVector := g.
    blueVector := b.

    "Modified: 23.4.1996 / 22:13:31 / cg"
!

size
    "return the number of colors in the receiver"

    ^ redVector size

    "Modified: 23.4.1996 / 22:13:43 / cg"
! !

!Colormap methodsFor:'misc'!

scaleValuesBy:scaleFactor
   "multiply all values by scaleFactor; finally round to integer.
    This can be used to brighten/darken an images colormap"

   1 to:redVector size do:[:index |
	redVector at:index put:((redVector at:index) * scaleFactor) rounded.
	greenVector at:index put:((greenVector at:index) * scaleFactor) rounded.
	blueVector at:index put:((blueVector at:index) * scaleFactor) rounded.
   ]
! !

!Colormap class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libview/Colormap.st,v 1.7 1996-04-23 20:16:07 cg Exp $'
! !