#! /usr/bin/mawk -f
BEGIN { 

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

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

USAGE =  "% dclps2kdraw <file>"

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

	  if (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)
{
	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"

}

