#! @@AWK@@ -f
BEGIN { 

ID    =    "cdclps2kdraw 0.7"
DATE  =                               "95/03/19(numaguti)" 

EX    =    "convert dcl.ps file into kdraw ps"

USAGE =  "% cdclps2kdraw <file>"

#----------------------------------------------------------------------------
# NO OPTION

    if (ARGV[1] == "-help" || ARGV[1] == "help") { 
        exithelp=1
        print "  " ID,DATE
        print " --- " EX
        print " usage : " USAGE
        exit
    }
    exithelp=0

    p = -1
    linew = 1
    pmax=256
    cr=0; cg=0; cb=0
    colorname = "black"
    mono = 0; nopat = 0
    ipat = 0; pat = 0

    xmax=5600
    yofs=360
    xrot=0

    print_header()

    "echo $DCLDIR" | getline dcldir
    dbasedir = dcldir "/lib/dcldbase/" 

    bmap = "bitmap.x11"
    if (read_bitmap(bmap) == 0) {
        bmap = dbasedir bmap
        if (read_bitmap(bmap) == 0) nopat = 1
    }
}

/^%%Orientation: Landscape/ {
    xrot=0
}
/^%%Orientation: Portrait/ {
    xrot=1
}

/^N/ {
    p = 0; next
}

{
    if ($NF == "S") {
        if (p != 0) {
            pps = 0
            for (ppe=1; ppe<p; ppe++) {
                if (morl[ppe] == "M") {
                    draw(0, pps, ppe-1)
                    pps = ppe
                } else if (ppe-pps >= pmax || ppe == p-1) {
                    draw(0, pps, ppe)
                    pps = ppe
                }
            }
        }
        p = 0
    } else if ($NF == "F") {
        if (p != 0) draw(1, 0, p-1)
        p = 0
    } else if ($NF == "W") {
        linew = int($1/2)
    } else if (NF == 3 && ($NF == "M" || $NF == "L")) {
        x[p] = $1; y[p] = $2; morl[p] = $NF; p++
    } else if ($NF == "RGB") {
        rgb = $1
        if (mono) {
            if (rgb >= 4095) {
                cr = 1; cg = 1; cb = 1; colorname = "white"
            } else {
                cr = 0; cg = 0; cb = 0; colorname = "black"
            }
        } else {
            cr = int(rgb/256)/15.
            cg  = int(mod(rgb,256)/16)/15.
            cb  = mod(rgb,16) /15.
            colorname = sprintf("#%2.2x%2.2x%2.2x", cr*255, cg*255, cb*255)
        }
    } else if ($NF == "PAT") {
        ipat = $2
    } else if ($NF == "G") {
        if ($1 == 0 || nopat || ipat == 999) {
            pat = 0
        } else {
            pat = "< " bit[ipat] " > -1"
        }
    } else if (NF >= 2 && p >= 0) {
        print "%" $0
    }
}

END {
    if (exithelp == 0) {
        print "End %I eop"; print
        print "showpage"  ; print
        print "%%Trailer" ; print
        print "end"
    }
}

function mod(i,j) {
    k = int(i/j)
    return i-j*k
}

function read_bitmap(bmap, i, ipat, bitl, pat, j, kpat) {
    i = 0
    getline < bmap 
    while (getline < bmap > 0) {
        ipat = $2+0
	bitl = $4
	pat = $5
        kpat = ""
        if (bitl == 16) {
            for (j=0; j<16; j++) kpat = kpat substr(pat, j*4+1, 4) " "
        } else if (bitl == 8) {
            for (j=0; j<8; j++) kpat = kpat substr(pat, j*4+1, 2) " "
        } else if (bitl == 4) {
   	    for (j=0; j<4; j++) kpat = kpat substr(pat, j*4+1, 1)
        } else if (bitl == 2) {
            for (j=0; j<2; j++) kpat = kpat substr(pat, j*4+1, 1) 
            kpat = kpat kpat
        } else {
            kpat = pat
        }
	bit[ipat] = kpat
	i = 1
    }
    return i
}

function draw(fill, ps, pe) {					
    print "Begin %I MLine"
    if (fill) {
        print "none SetB %I b n"
    } else {
        print "%I b 65535"
        print linew " 0 0 [] 0 SetB"
    }
    print "%I cfg " colorname
    print cr " " cg " " cb " SetCFg"
    print "%I cbg White"
    print "1 1 1 SetCBg"
    if (fill) {
        print "%I p"
        print pat " SetP"
    } else {
        print "none SetP %I p n"
    }
    print "%I t"
    print "[ 0.5 0 0 0.5 0 0 ] concat"
    print "%I " pe-ps+1
    if (xrot == 0)
        for (i=ps; i<=pe; i++) print x[i] " " y[i]
    else
        for (i=ps; i<=pe; i++) print xmax-y[i] " " yofs+x[i]
    print pe-ps+1 " MLine"
    print "End"; print ""
}

function print_header() {
    print "%!PS-Adobe-2.0 EPSF-1.2"
    print "%%DocumentFonts:"
    print "%%Pages: 1"
    print "%%BoundingBox: 5 -2 744 532"
    print "%%EndComments"
    print ""
    print " 50 dict begin"
    print "1 setlinecap"
    print "1 setlinejoin"
    print "10 setmiterlimit"
    print ""
    print "/none null def"
    print "/numGraphicParameters 17 def"
    print "/stringLimit 65535 def"
    print ""
    print "/Begin {"
    print "save"
    print "numGraphicParameters dict begin"
    print "} def"
    print ""
    print "/End {"
    print "end"
    print "restore"
    print "} def"
    print ""
    print "/SetB {"
    print "dup type /nulltype eq {"
    print "pop"
    print "false /brushRightArrow idef"
    print "false /brushLeftArrow idef"
    print "true /brushNone idef"
    print "} {"
    print "pop pop pop pop "
    print "/brushWidth idef"
    print "false /brushNone idef"
    print "} ifelse"
    print "} def"
    print ""
    print "/SetCFg {"
    print "/fgblue idef"
    print "/fggreen idef"
    print "/fgred idef"
    print "} def"
    print ""
    print "/SetCBg {"
    print "/bgblue idef"
    print "/bggreen idef"
    print "/bgred idef"
    print "} def"
    print ""
    print "/SetP {"
    print "dup type /nulltype eq {"
    print "pop true /patternNone idef"
    print "} {"
    print "/patternGrayLevel idef"
    print "patternGrayLevel -1 eq {"
    print "/patternString idef"
    print "} if"
    print "false /patternNone idef"
    print "} ifelse"
    print "} def"
    print ""
    print "/MLine {"
    print "0 begin"
    print "storexyn"
    print "newpath"
    print "n 1 gt {"
    print "x 0 get y 0 get moveto"
    print "1 1 n 1 sub {"
    print "/i exch def"
    print "x i get y i get lineto"
    print "} for"
    print "patternNone not { ifill } if"
    print "brushNone not { istroke } if"
    print "} if"
    print "end"
    print "} dup 0 4 dict put def"
    print ""
    print "/idef {"
    print "dup where { pop pop pop } { exch def } ifelse"
    print "} def"
    print ""
    print "/ifill {"
    print "0 begin"
    print "gsave"
    print "patternGrayLevel -1 ne {"
    print "fgred bgred fgred sub patternGrayLevel mul add"
    print "fggreen bggreen fggreen sub patternGrayLevel mul add"
    print "fgblue bgblue fgblue sub patternGrayLevel mul add setrgbcolor"
    print "eofill"
    print "} {"
    print " eoclip"
    print "originalCTM setmatrix"
    print "[ 2 0 0 2 0 0 ] concat"
    print "pathbbox /t exch def /r exch def /b exch def /l exch def"
    print "/l l cvi 16 idiv 16 mul cvi store"
    print "/b b cvi 16 idiv 16 mul cvi store"
    print "/w r l sub 16 div ceiling 16 mul cvi def"
    print "/h t b sub 16 div ceiling 16 mul cvi def"
    print "/imageByteWidth w 8 div ceiling cvi def"
    print "/imageHeight h def"
    print "bgred bggreen bgblue setrgbcolor"
    print "eofill"
    print "fgred fggreen fgblue setrgbcolor"
    print "w 0 gt h 0 gt and {"
    print "l b translate w h scale"
    print "w h true [w 0 0 h neg 0 h] { patternproc } imagemask"
    print "} if"
    print "} ifelse"
    print "grestore"
    print "end"
    print "} dup 0 8 dict put def"
    print ""
    print "/istroke {"
    print "gsave"
    print "fgred fggreen fgblue setrgbcolor"
    print "brushWidth setlinewidth"
    print "originalCTM setmatrix"
    print "stroke"
    print "grestore"
    print "} def"
    print ""
    print ""
    print "/patternproc {"
    print "0 begin"
    print "/patternByteLength patternString length def"
    print "/patternHeight patternByteLength 8 mul sqrt cvi def"
    print "/patternWidth patternHeight def"
    print "/patternByteWidth patternWidth 8 idiv def"
    print "/imageByteMaxLength imageByteWidth imageHeight mul"
    print "stringLimit patternByteWidth sub min def"
    print "/imageMaxHeight imageByteMaxLength imageByteWidth idiv patternHeight idiv"
    print "patternHeight mul patternHeight max def"
    print "/imageHeight imageHeight imageMaxHeight sub store"
    print "/imageString imageByteWidth imageMaxHeight mul patternByteWidth add string def"
    print "0 1 imageMaxHeight 1 sub {"
    print "/y exch def"
    print "/patternRow y patternByteWidth mul patternByteLength mod def"
    print "/patternRowString patternString patternRow patternByteWidth getinterval def"
    print "/imageRow y imageByteWidth mul def"
    print "0 patternByteWidth imageByteWidth 1 sub {"
    print "/x exch def"
    print "imageString imageRow x add patternRowString putinterval"
    print "} for"
    print "} for"
    print "imageString"
    print "end"
    print "} dup 0 12 dict put def"
    print ""
    print "/min {"
    print "dup 3 2 roll dup 4 3 roll lt { exch } if pop"
    print "} def"
    print ""
    print "/max {"
    print "dup 3 2 roll dup 4 3 roll gt { exch } if pop"
    print "} def"
    print ""
    print ""
    print "/storexyn {"
    print "/n exch def"
    print "/y n array def"
    print "/x n array def"
    print "n 1 sub -1 0 {"
    print "/i exch def"
    print "y i 3 2 roll put"
    print "x i 3 2 roll put"
    print "} for"
    print "} def"
    print ""
    print "%%EndProlog"
    print ""
    print "%I Idraw 9 Grid 8 "
    print ""
    print "%%Page: 1 1"
    print ""
    print "Begin"
    print "%I b u"
    print "%I cfg u"
    print "%I cbg u"
    print "%I f u"
    print "%I k u"
    print "%I p u"
    print "%I t"
    print "[ 0.2 0 0 0.2 0 0 ] concat"
    print "/originalCTM matrix currentmatrix def"
}
