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