I need the capability print a bmp inside a harbour application
who print plc . is a old clipper application

I Have found a routine who Print .PCX To Laserjet, but need BMP


I search a conversion BMP2PCX or printing BMP in pcl
(I need also rotate image)


http://www.karland.com/code/clipper/
function LoadPCX(cFile)

   
//----------------------------------------------------------------------------
   // AUTHOR:     Denis A. Sarrazin (Tue 10-11-1994)
   // PURPOSE:    to load the PCX into a special array
   // PARAMETERS: cFile <-- the name of the PCX file to load
   // RETURNS:    array (see list of #define in MINIPCX.CH and format below)
   // NOTES:      Format of a .PCX header shown below:
   //
   //        Byte  Item            Size Description/Comments
   //        ----  --------------- ----
-----------------------------------------
   //        0     Manufacturer      1  Constant Flag  10 = ZSoft .PCX
   //        1     Version           1  Version information:
   //                                     0 = Version 2.5
   //                                     2 = Version 2.8 w/palette information
   //                                     3 = Version 2.8 w/o palette
information
   //                                     5 = Version 3.0
   //        2     Encoding          1  1 = .PCX run length encoding
   //        3     Bits per pixel    1  Number of bits/pixel per plane
   //        4     Window            8  Picture Dimensions
   //                                     (Xmin, Ymin) - (Xmax - Ymax)
   //                                     in pixels, inclusive
   //        12    HRes              2  Horizontal Resolution of creating device
   //        14    VRes              2  Vertical Resolution of creating device
   //        16    Colormap         48  Color palette setting, see text
   //        64    Reserved          1
   //        65    NPlanes           1  Number of color planes
   //        66    Bytes per Line    2  Number of bytes per scan line per
   //                                     color plane (always even for
.PCX files)
   //        68    Palette Info      2  How to interpret palette - 1 = color/BW,
   //                                                              2 = grayscale
   //        70    Filler           58  blank to fill out 128 byte header
   //
   //        IMPORTANT:
   //          All sizes are measured in BYTES.
   //          All variables of size 2 are integers.
   //
   
//----------------------------------------------------------------------------
   local aPCX
   local cBuffer
   local hPCX
   local nRead
   local nFileLength

   if !file(cFile)

      aPCX := {}

   else

      aPCX        := array(PCX_LENGTH)
      hPCX        := fopen(cFile)
      nFileLength := FLEN(hPCX)

      cBuffer := space(HEADER_SIZE)
      nRead   := fread(hPCX,@cBuffer,HEADER_SIZE)           // load PCX header

      aPCX[ PCX_MANUFACTURER ]   := asc(substr(cBuffer,1,1))
      aPCX[ PCX_VERSION ]        := asc(substr(cBuffer,2,1))
      aPCX[ PCX_ENCODING ]       := asc(substr(cBuffer,3,1))
      aPCX[ PCX_BITS_PER_PIXEL ] := asc(substr(cBuffer,4,1))
      aPCX[ PCX_WINDOW ]         := {bin2i(substr(cBuffer,5,2)),;
                                          bin2i(substr(cBuffer,7,2)),;
                                          bin2i(substr(cBuffer,9,2)),;
                                          bin2i(substr(cBuffer,11,2))}
      aPCX[ PCX_HRES ]           := bin2i(substr(cBuffer,13,2))
      aPCX[ PCX_VRES ]           := bin2i(substr(cBuffer,15,2))
      aPCX[ PCX_COLORMAP ]       := substr(cbuffer,17,48)
      aPCX[ PCX_RESERVED ]       := asc(substr(cBuffer,65,1))
      aPCX[ PCX_NPLANES ]        := asc(substr(cBuffer,66,1))
      aPCX[ PCX_BYTES_PER_LINE ] := bin2i(substr(cBuffer,67,2))
      aPCX[ PCX_PALETTE_INFO ]   := bin2i(substr(cBuffer,69,2))
      aPCX[ PCX_FILLER ]         := substr(cBuffer,71,58)

      cBuffer := space(nFileLength - HEADER_SIZE)
      nRead   := fread(hPCX,@cBuffer,nFileLength - HEADER_SIZE)
      if (nRead != (nFileLength - HEADER_SIZE))
         messaggio("Attenzione  File TROPPO GRANDE","T")
      endif

      aPCX[ PCX_PIXELS ] := cBuffer

      fclose(hPCX)

   endif

return (aPCX)



procedure PrintPCX(nRow,nCol,aPCX)
   
//----------------------------------------------------------------------------
   // AUTHOR:     Denis A. Sarrazin (Tue 10-11-1994)
   // PURPOSE:
   // PARAMETERS:
   // RETURNS:
   // EXAMPLES:
   
//----------------------------------------------------------------------------
   local nNumCol     := aPCX[PCX_WINDOW,3] - aPCX[PCX_WINDOW,1]+1
   local nTotalBytes := aPCX[PCX_NPLANES] * aPCX[PCX_BYTES_PER_LINE]
   local nStartCol
   local cRasterData := ""
   local nCount
   local nNumBytes
   local cByte
   local nBytePos
   local nPixel
   local nDiff
   nRow      := int(nRow * 300)
   nCol      := int(nCol * 300)
   nStartCol := nCol
   //   X_graph=""
   if SetPrinter()  // set the proper codes depending on type of printer
      //  PrnGrSet( nRow, nCol ) // cGrSet ; PrnGrMove( <r>, <c> )C
      //    X_graph=X_graph+CHR(K_ESC)+"*t300R" + ;  // raster
graphics at 300 dpi
      //        CHR(K_ESC)+"*r1A" +;       // start graphics at current position
      //                CHR(K_ESC)+"*p"+Cnum(nRow)+"Y"+;
      //                CHR(K_ESC)+"*p"+Cnum(nStartCol)+"X"
      ?? chr(K_ESC)+"*t300R"            // raster graphics at 300 dpi
      ? chr(K_ESC)+"*p"+cNUM(nRow)+"Y"
      ?? chr(K_ESC)+"*p"+cNUM(nCol)+"X"
      ?? chr(K_ESC)+"*r1A"              // start graphics at current position

      ? chr(K_ESC)+"*p"+cNUM(nRow)+"Y"
      ??
      ?? chr(K_ESC)+"*p"+cNUM(nCol)+"X"
      ??
      nBytePos  := 1
      nNumBytes := 1
      while (nBytePos < len(aPCX[PCX_PIXELS]))
         cByte := BYTE2BIN(subst(aPCX[PCX_PIXELS],nBytePos,1))
         if (left(cByte,2) == "11")
            nCount := BIN2NUM("00"+substr(cByte,3))
            nBytePos ++
            cByte := BYTE2BIN(subst(aPCX[PCX_PIXELS],nBytePos,1))
         else
            nCount := 1
         endif
         while (nCount > 0)
            // display all bits in byte (or parts thereof)
            if ((nCol+8) > (nNumCol+nStartCol - 1))         // chop
off the excess
               nDiff := (nCol+8) - (nNumCol+nStartCol - 1) - 1
               cByte := padr(left(cByte,8 - nDiff),8,"1")   // clear any at end
            endif
            cRasterData += chr(XOR(BIN2NUM(cByte),255))     // invert
'1's and '0's
            nCol        += 8
            if (nNumBytes >= nTotalBytes)
               //          X_graph=X_graph+CHR(K_ESC)+"*p"+cNUM(nRow)+"Y"+;
               //                     +CHR(K_ESC)+"*p"+cNUM(nStartCol)+"X"+;
               //
+CHR(K_ESC)+"*b"+cNUM(LEN(cRasterData))+"W"+cRasterData
               ? chr(K_ESC)+"*p"+cNUM(nRow)+"Y"
               ??
               ?? chr(K_ESC)+"*p"+cNUM(nStartCol)+"X"
               ??
               ?? chr(K_ESC)+"*b"+cNUM(len(cRasterData))+"W"+cRasterData
               ??
               // PrnGrMove( nRow, nStartCol )
               // PrnGrLine( cRasterData )
               cRasterData := ""
               nNumBytes   := 0
               nCol        := nStartCol
               nRow ++
            endif
            nNumBytes ++
            nCount --
         end
         nBytePos ++
      end
      ? chr(K_ESC)+"*rB"+;              // end raster graphics
                 chr(K_ESC)+"&a0R"+;    // move to text row 1
                 chr(K_ESC)+"&a0C"      // move to text column 1
   endif

return



-- 
Massimo Belgrano
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to