"
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 $'
! !