\documentclass{article} \usepackage{open-axiom} \title{src/algebra color.spad} \begin{document} \author{Gabriel Dos~Reis \and Jim Wen} \maketitle \begin{abstract} \end{abstract} \tableofcontents \eject \section{The category of RGB Color Model} <>= )abbrev category RGBCMDL RGBColorModel ++ Author: Gabriel Dos Reis ++ Date Created: October 06, 2008 ++ Related Constructor: ++ Description: ++ This category defines the common interface for RGB color models. RGBColorModel(T: AbelianMonoid): Category == AbelianMonoid with red: % -> T ++ red(c) returns the `red' component of `c'. green: % -> T ++ green(c) returns the `green' component of `c'. blue: % -> T ++ blue(c) returns the `blue' component of `c'. componentUpperBound: T ++ componentUpperBound is an upper bound for all component values. @ \section{The category of RGB Color Space} <>= )abbrev category RGBCSPC RGBColorSpace ++ Author: Gabriel Dos Reis ++ Date Created: October 06, 2008 ++ Related Constructor: ++ Description: ++ This category defines the common interface for RGB color spaces. RGBColorSpace(T: AbelianMonoid): Category == RGBColorModel T with whitePoint: % ++ whitePoint is the contant indicating the white point ++ of this color space. @ \section{domain COLOR Color} <>= )abbrev domain COLOR Color ++ Author: Jim Wen ++ Date Created: 10 May 1989 ++ Date Last Updated: 19 Mar 1991 by Jon Steinbach ++ Basic Operations: red, yellow, green, blue, hue, numberOfHues, color, +, *, = ++ Related Constructors: ++ Also See: ++ AMS Classifications: ++ Keywords: ++ References: ++ Description: Color() specifies a domain of 27 colors provided in the ++ \Language{} system (the colors mix additively). Color(): Exports == Implementation where I ==> Integer PI ==> PositiveInteger SF ==> DoubleFloat Exports ==> AbelianSemiGroup with * : (PI, %) -> % ++ s * c, returns the color c, whose weighted shade has been scaled by s. * : (SF, %) -> % ++ s * c, returns the color c, whose weighted shade has been scaled by s. + : (%, %) -> % ++ c1 + c2 additively mixes the two colors c1 and c2. red : () -> % ++ red() returns the position of the red hue from total hues. yellow : () -> % ++ yellow() returns the position of the yellow hue from total hues. green : () -> % ++ green() returns the position of the green hue from total hues. blue : () -> % ++ blue() returns the position of the blue hue from total hues. hue : % -> I ++ hue(c) returns the hue index of the indicated color c. numberOfHues : () -> PI ++ numberOfHues() returns the number of total hues, set in totalHues. color : Integer -> % ++ color(i) returns a color of the indicated hue i. Implementation ==> add totalHues ==> 27 --see (header.h file) for the current number Rep := Record(hue:I, weight:SF) f:SF * c:% == -- s * c returns the color c, whose weighted shade has been scaled by s zero? f => c -- 0 is the identitly function...or maybe an error is better? [c.hue, f * c.weight] x + y == x.hue = y.hue => [x.hue, x.weight + y.weight] if y.weight > x.weight then -- let x be color with bigger weight c := x x := y y := c diff := x.hue - y.hue if (xHueSmaller:= negative? diff) then diff := -diff if (moreThanHalf:=(diff > totalHues quo 2)) then diff := totalHues-diff offset : I := wholePart(round (diff::SF/(2::SF)**(x.weight/y.weight)) ) if (xHueSmaller and not moreThanHalf) or (not xHueSmaller and moreThanHalf) then ans := x.hue + offset else ans := x.hue - offset if negative? ans then ans := totalHues + ans else if (ans > totalHues) then ans := ans - totalHues [ans,1] x = y == (x.hue = y.hue) and (x.weight = y.weight) red() == [1,1] yellow() == [11::I,1] green() == [14::I,1] blue() == [22::I,1] sample == red() hue c == c.hue i:PositiveInteger * c:% == i::SF * c numberOfHues() == totalHues color i == if negative? i or (i>totalHues) then error concat("Color should be in the range 1..",totalHues::String) [i::I, 1] coerce(c:%):OutputForm == hconcat ["Hue: "::OutputForm, (c.hue)::OutputForm, " Weight: "::OutputForm, (c.weight)::OutputForm] @ \section{domain PALETTE Palette} <>= )abbrev domain PALETTE Palette ++ Author: Jim Wen ++ Date Created: May 10th 1989 ++ Date Last Updated: Jan 19th 1990 ++ Basic Operations: dark, dim, bright, pastel, light, hue, shade, coerce ++ Related Constructors: ++ Also See: ++ AMS Classifications: ++ Keywords: dim,bright,pastel,coerce ++ References: ++ Description: This domain describes four groups of color shades (palettes). Palette(): Exports == Implementation where I ==> Integer C ==> Color SHADE ==> ["Dark","Dim","Bright","Pastel","Light"] Exports ==> Join(SetCategory,CoercibleFrom C) with dark : C -> % ++ dark(c) sets the shade of the indicated hue of c to it's lowest value. dim : C -> % ++ dim(c) sets the shade of a hue, c, above dark, but below bright. bright : C -> % ++ bright(c) sets the shade of a hue, c, above dim, but below pastel. pastel : C -> % ++ pastel(c) sets the shade of a hue, c, above bright, but below light. light : C -> % ++ light(c) sets the shade of a hue, c, to it's highest value. hue : % -> C ++ hue(p) returns the hue field of the indicated palette p. shade : % -> I ++ shade(p) returns the shade index of the indicated palette p. Implementation ==> add import I import C Rep := Record(shadeField:I, hueField:C) dark c == [1,c] dim c == [2,c] bright c == [3,c] pastel c == [4,c] light c == [5,c] hue p == p.hueField shade p == p.shadeField -- sample() == bright(sample()) coerce(c:Color):% == bright c coerce(p:%):OutputForm == hconcat ["[",coerce(p.hueField),"] from the ",SHADE.(p.shadeField)," palette"] @ \section{License} <>= --Copyright (c) 1991-2002, The Numerical Algorithms Group Ltd. --All rights reserved. -- --Copyright (C) 2007-2008, Gabriel Dos Reis. --All rights reserved. -- --Redistribution and use in source and binary forms, with or without --modification, are permitted provided that the following conditions are --met: -- -- - Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- -- - Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in -- the documentation and/or other materials provided with the -- distribution. -- -- - Neither the name of The Numerical Algorithms Group Ltd. nor the -- names of its contributors may be used to endorse or promote products -- derived from this software without specific prior written permission. -- --THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS --IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED --TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER --OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, --EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, --PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR --PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF --LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING --NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS --SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @ <<*>>= <> <> <> <> <> @ \eject \begin{thebibliography}{99} \bibitem{1} nothing \end{thebibliography} \end{document}