{- - Fulsom (The Solid Modeller, written in Haskell) - - Copyright 1990,1991,1992,1993 Duncan Sinclair - - Permissiom to use, copy, modify, and distribute this software for any - purpose and without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies, and - that my name not be used in advertising or publicity pertaining to this - software without specific, written prior permission. I makes no - representations about the suitability of this software for any purpose. - It is provided ``as is'' without express or implied warranty. - - Duncan Sinclair 1993. - - Quad-tree to raster-format processing. - -} module Raster(draw,cdraw) where import Interval import Kolor import Quad import Types {- Description of raster protocol: Each value is a "Word", which is a two byte value, MSB, then LSB. Flags, Dimensions, (Location, Value)* Flags : F (defined below.) Dimensions : XX,YY (If not square.) : S (If square.) Location : X,Y,H,W (If not square.) : X,Y,D (If square.) Value : V (If mono.) : R,G,B (If colour.) Flags: 0x0001 = square - expect only one dimension. 0x0002 = colour - expect triples. Background is defined as values unassigned at end. -} -- square, colour... cdraw :: Int -> Quad -> [Char] cdraw depth q = (wordy (3:w:(cout (0,0) w q [])) ) where w :: Int w = 2 ^ (depth::Int) cout :: (Int,Int) -> Int -> Quad -> [Int] -> [Int] cout xy w (Q_Empty ) = \ints -> ints cout xy w (Q_Full a ) = \ints -> (coutlines xy w a) ints -- cout xy@(x,y) w (Q_Sub a l) = (coutlines xy w a) . e . f . g . h cout (x,y) w (Q_Sub a l) = e . f . g . h where (l0:ll1) = l ; (l1:ll2) = ll1 (l2:ll3) = ll2 ; (l3:ll4) = ll3 e = cout (x ,y ) n (l0) f = cout (x+n,y ) n (l1) g = cout (x ,y+n) n (l2) h = cout (x+n,y+n) n (l3) n = w `div` 2 coutlines :: (Int,Int) -> Int -> Color -> [Int] -> [Int] coutlines (x,y) l colour = \next -> x:y:l:r:g:b:next where (r,g,b) = unmkcolor colour -- non-square, monochrome... draw :: Int -> Quad -> [Char] draw depth q = (wordy (0:w:w:(out (0,0) w q [])) ) where w :: Int w = 2 ^ (depth::Int) out :: (Int,Int) -> Int -> Quad -> [Int] -> [Int] out xy w (Q_Empty ) = \ints -> ints out xy w (Q_Full a ) = \ints -> (outlines xy w a) ints -- out xy@(x,y) w (Q_Sub a l) = (outlines xy w a) . e . f . g . h out (x,y) w (Q_Sub a l) = e . f . g . h where (l0:ll1) = l ; (l1:ll2) = ll1 (l2:ll3) = ll2 ; (l3:ll4) = ll3 e = out (x ,y ) n (l0) f = out (x+n,y ) n (l1) g = out (x ,y+n) n (l2) h = out (x+n,y+n) n (l3) n = w `div` 2 outlines :: (Int,Int) -> Int -> Color -> [Int] -> [Int] outlines (x,y) l s = \n -> x:y:l:l:(shade s):n shade :: Color -> Int shade (RGB r g b) = round ((sqrt r)*255) -- and (<256) (wordy x) = True wordy :: [Int] -> [Char] wordy [] = [] wordy (a:bs) = (toEnum b):(toEnum c):(wordy bs) where (b,c) = a `divMod` 256