DIRECTORY ImagerColor, Real; ImagerColorImpl: CEDAR PROGRAM IMPORTS Real EXPORTS ImagerColor ~ BEGIN OPEN ImagerColor; black: PUBLIC ConstantColor _ NEW[ColorRep[constant] _[constant[x: Card[0.3101], y: Card[0.3163], Y: Card[0]]]]; white: PUBLIC ConstantColor _ NEW[ColorRep[constant] _[constant[x: Card[0.3101], y: Card[0.3163], Y: Card[1.0]]]]; Card: PROC [real: REAL] RETURNS [card: CARDINAL] ~ { int: INT _ Real.RoundLI[real*LAST[CARDINAL]]; card _ MAX[MIN[int, LAST[CARDINAL]], 0]; }; MakeGray: PUBLIC PROC [intensity: REAL] RETURNS [Color] ~ { IF intensity <= 0 THEN RETURN [black]; IF intensity >= 1 THEN RETURN [white]; RETURN [NEW[ColorRep[constant] _ [constant[x: Card[0.3101], y: Card[0.3163], Y: Card[intensity]]]]]; }; ToByte: PROC[v: REAL] RETURNS[Byte] = INLINE { RETURN[Real.RoundC[ToRange[v]*255]] }; -- assumes v IN[0..1] MakeRGB: PROC[r, g, b: Byte] RETURNS[Color] = INLINE { RETURN[[tag: rgb, r: r, g: g, b: b]] }; ColorToIntensity: PUBLIC PROC[color: Color] RETURNS[intensity: REAL] = { SELECT color.tag FROM rgb => { i: REAL; IF color.b=color.r AND color.g=color.r THEN i _ color.r ELSE i _ 0.30*color.r+0.11*color.b+0.59*color.g; intensity _ i/255.0 }; stipple => intensity _ StippleToIntensity[color]; ENDCASE => intensity _ 0; RETURN[intensity]; }; IntensityToColor: PUBLIC PROC[intensity: REAL] RETURNS[Color] = { i: Byte _ ToByte[ToRange[intensity]]; RETURN[MakeRGB[i, i, i]] }; RGBToColor: PUBLIC PROC[r,g,b: REAL] RETURNS[Color] = { red: Byte _ ToByte[ToRange[r]]; grn: Byte _ ToByte[ToRange[g]]; blu: Byte _ ToByte[ToRange[b]]; RETURN[MakeRGB[red, grn, blu]] }; HSVToColor: PUBLIC PROC[h,s,v: REAL] RETURNS[Color] = { r,g,b: REAL; [r,g,b] _ HSVToRGB[h, s, v]; RETURN[MakeRGB[ToByte[r],ToByte[g],ToByte[b]]] }; ColorToHSV: PUBLIC PROC[color: Color] RETURNS[h, s, v: REAL] = { SELECT color.tag FROM rgb => [h,s,v] _ RGBToHSV[color.r/255.0, color.g/255.0, color.b/255.0]; stipple => { h _ s _ 0; v _ StippleToIntensity[color] }; ENDCASE => h _ s _ v _ 0; RETURN[h,s,v]; }; ColorToRGB: PUBLIC PROC[color: Color] RETURNS[r, g, b: REAL] = { SELECT color.tag FROM rgb => RETURN[r: color.r/255.0, g: color.g/255.0, b: color.b/255.0]; stipple => { i: REAL _ StippleToIntensity[color]; RETURN[i, i, i] }; ENDCASE => RETURN[0, 0, 0]; }; StippleToIntensity: PROC[color: Color] RETURNS[intensity: REAL] = { -- assumes color.tag = stipple bits: CARDINAL _ NewCGColor.GetStipple[color]; count: NAT _ 0; FOR i: CARDINAL IN[0..16) DO TRUSTED { IF Inline.BITAND[bits,1]=0 THEN count _ count+1; -- count "white" bits bits _ Inline.BITSHIFT[bits,-1] }; ENDLOOP; intensity _ count/16.0; }; END. ”ImagerColorImpl.mesa Michael Plass, August 1, 1983 11:43 am Last Edited by: Stone, October 18, 1983 2:20 pm Color: TYPE ~ ImagerBasic.Color; Κ’˜J™J™&J™/šΟk ˜ J˜ Jšœ˜—J˜šœ ˜Jšœ˜ Jšœ ˜Jšœœœ ˜—Jšœ ™ JšœœœAœ ˜pJšœœœAœ˜rš Οnœœœœœ˜4Jšœœœœ˜-Jš œœœœœ˜(Jšœ˜—š žœœœ œœ ˜;Jšœœœ ˜&Jšœœœ ˜&JšœœY˜dJšœ˜—Iprocš žœœœœ œœ ˜UKšΟc˜Kš žœœœ œœ"˜_š žœœœœ œ˜Hšœ ˜šœ œ˜Kšœœœ ˜7Kšœ,˜0Kšœ˜—Kšœ1˜1Kšœ˜—Kšœ ˜Kšœ˜—š žœœœ œœ ˜AKšœ%˜%Kšœ˜—š ž œœœœœ ˜7Kšœ˜Kšœ˜Kšœ˜Kšœ˜!—š œž œœœœœ ˜8Kšœœ˜)Kšœ+˜1—š ž œœœœ œ˜@šœ ˜KšœG˜GKšœ8˜8Kšœ˜—Kšœ˜Kšœ˜—š œž œœœœ œ˜Ašœ ˜Kšœœ7˜DKšœœœ ˜DKšœœ ˜—Kšœ˜—š œžœœœ œŸ˜cKšœœ ˜.Kšœœ˜š œœœœœ˜&Kšœœ œŸ˜FKšœœ ˜"Kšœ˜—Kšœ˜Kšœ˜—Jšœ˜J˜—…— 8n