2010-01-24 19:40 UTC+0100 Xavi (jarabal/at/gmail.com)

* contrib/hbwin/win_prn1.c
    + Added support for printing RAW compressed formats JPEG and PNG BitMaps.
    + Added new PRGs functions: win_TypeBitMap() and win_CheckPrnDrvFormat()
      Example of use in the class win_BMP()
    * Changes in WIN_LOADBITMAPFILE, WIN_DRAWBITMAP to support new formats.

  * contrib/hbwin/win_tprn.prg
    + Extended the class win_BMP() to allow printing compressed formats JPEG and PNG
      if the printer driver allows.
    + Added method CheckPrnDrvFormat( oPrn, @cErrMsg ) for check printer driver.
    + New VAR INT Type. Type of BitMap: 1 == BM, 2 == JPEG, 3 == PNG
    + New VAR array DimXY. Original Image Dimensions X Y in pixels.
    * New parameter aDimXY in LoadFile( cFileName, aDimXY )
    * New parameter aDimXY in Draw( oPrn, aRectangle, aDimXY )
      to introduce the original image dimensions in pixels X Y.
      Some printer drivers may require the insertion of the original image dimensions
      for processing, others read from the data source and by default only need have
      aDimXY := { 1, 1 }
    * Use DimXY VAR of win_BMP() in method DrawBitMap( oBmp ) of win_PRN()

  * src/compiler/hbusage.c
    + Added author ID mail
This commit is contained in:
Xavi
2010-01-24 18:39:16 +00:00
parent 812ad02df6
commit 64dba82b85
4 changed files with 186 additions and 36 deletions

View File

@@ -17,6 +17,30 @@
past entries belonging to author(s): Viktor Szakats.
*/
2010-01-24 19:40 UTC+0100 Xavi (jarabal/at/gmail.com)
* contrib/hbwin/win_prn1.c
+ Added support for printing RAW compressed formats JPEG and PNG BitMaps.
+ Added new PRGs functions: win_TypeBitMap() and win_CheckPrnDrvFormat()
Example of use in the class win_BMP()
* Changes in WIN_LOADBITMAPFILE, WIN_DRAWBITMAP to support new formats.
* contrib/hbwin/win_tprn.prg
+ Extended the class win_BMP() to allow printing compressed formats JPEG and PNG
if the printer driver allows.
+ Added method CheckPrnDrvFormat( oPrn, @cErrMsg ) for check printer driver.
+ New VAR INT Type. Type of BitMap: 1 == BM, 2 == JPEG, 3 == PNG
+ New VAR array DimXY. Original Image Dimensions X Y in pixels.
* New parameter aDimXY in LoadFile( cFileName, aDimXY )
* New parameter aDimXY in Draw( oPrn, aRectangle, aDimXY )
to introduce the original image dimensions in pixels X Y.
Some printer drivers may require the insertion of the original image dimensions
for processing, others read from the data source and by default only need have
aDimXY := { 1, 1 }
* Use DimXY VAR of win_BMP() in method DrawBitMap( oBmp ) of win_PRN()
* src/compiler/hbusage.c
+ Added author ID mail
2010-01-24 14:30 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* utils/hbmk2/hbmk2.prg
+ Added support to recognize .C (uppercase .c) extension as C++ file.

View File

@@ -510,6 +510,29 @@ HB_FUNC( WIN_GETDOCUMENTPROPERTIES )
/* Functions for loading & printing bitmaps */
/* Type BitMap: 1 == BM, 2 == JPEG, 3 == PNG [jarabal] */
static int hbwin_TypeBitMap( const void *pImgBuf )
{
int iType = 0;
if( pImgBuf )
{
if( memcmp( pImgBuf, "BM", 2 ) == 0 )
iType = 1;
else if( memcmp( pImgBuf, "\377\330\377", 3 ) == 0 )
iType = 2;
else if( memcmp( pImgBuf, "\211PNG", 4 ) == 0 )
iType = 3;
}
return iType;
}
HB_FUNC( WIN_TYPEBITMAP )
{
hb_retni( hbwin_TypeBitMap( hb_parc( 1 ) ) );
}
HB_FUNC( WIN_LOADBITMAPFILE )
{
HB_FHANDLE fhnd = hb_fsOpen( hb_parcx( 1 ), FO_READ | FO_SHARED );
@@ -526,11 +549,11 @@ HB_FUNC( WIN_LOADBITMAPFILE )
[vszakats] */
if( ulSize > 2 && ulSize <= ( 32 * 1024 * 1024 ) )
{
BITMAPFILEHEADER * pbmfh = ( BITMAPFILEHEADER * ) hb_xgrab( ulSize );
void * pbmfh = hb_xgrab( ulSize );
hb_fsSeek( fhnd, 0, FS_SET );
if( hb_fsReadLarge( fhnd, pbmfh, ulSize ) == ulSize && pbmfh->bfType == *( WORD * ) "BM" )
if( hb_fsReadLarge( fhnd, pbmfh, ulSize ) == ulSize && hbwin_TypeBitMap( pbmfh ) )
hb_retclen_buffer( ( char * ) pbmfh, ( HB_SIZE ) ulSize );
else
hb_xfree( pbmfh );
@@ -540,39 +563,118 @@ HB_FUNC( WIN_LOADBITMAPFILE )
}
}
/* Some compilers don't implement these define [jarabal] */
#ifndef CHECKJPEGFORMAT
#define CHECKJPEGFORMAT 4119
#endif
#ifndef CHECKPNGFORMAT
#define CHECKPNGFORMAT 4120
#endif
static HB_BOOL hbwin_CheckPrnDrvFormat( HDC hDC, int iType, const void *pImgBuf, ULONG ulSize, PHB_ITEM pItmErrMsg )
{
if( hDC && iType && pImgBuf && ulSize >= sizeof( BITMAPCOREHEADER ) )
{
if( iType == 1 )
return HB_TRUE;
else
{
int iRes = iType = (iType == 2 ? CHECKJPEGFORMAT : CHECKPNGFORMAT);
iRes = ExtEscape( hDC, QUERYESCSUPPORT, sizeof(iRes), ( LPCSTR ) &iRes, 0, 0 );
if( iRes > 0 )
{
if( ExtEscape( hDC, iType, ulSize, ( LPCSTR ) pImgBuf, sizeof(iRes), ( LPSTR ) &iRes ) > 0 )
{
if( pItmErrMsg && iRes != 1 )
hb_itemPutC( pItmErrMsg, "CHECKFORMAT failure" );
return iRes == 1;
}
else
{
if( pItmErrMsg )
hb_itemPutC( pItmErrMsg, "Invalid source devmode for ESCSUPPORT" );
return HB_FALSE;
}
}
else
{
if( pItmErrMsg )
hb_itemPutC( pItmErrMsg, "QUERYESCSUPPORT Not Implemented" );
return HB_FALSE;
}
}
}
else
return HB_FALSE;
}
HB_FUNC( WIN_CHECKPRNDRVFORMAT )
{
const char * pImgBuf = hb_parc( 2 );
hb_retl( hbwin_CheckPrnDrvFormat( hbwapi_par_HDC( 1 ), hbwin_TypeBitMap( pImgBuf ), pImgBuf, hb_parclen( 2 ), hb_param( 3, HB_IT_BYREF ) ) );
}
HB_FUNC( WIN_DRAWBITMAP )
{
BITMAPINFO * pbmi;
BYTE * pBits = NULL;
HDC hDC = hbwapi_par_HDC( 1 );
ULONG ulSize = hb_parclen( 2 );
BITMAPFILEHEADER * pbmfh = ( BITMAPFILEHEADER * ) hb_parc( 2 );
int cxDib = hb_parni( 7 ), cyDib = hb_parni( 8 ), iType = hbwin_TypeBitMap( pbmfh );
/* TOFIX: No check is done on 2nd parameter which is a large security hole
and may cause GPF in simple error cases.
[vszakats] */
if( hDC && hb_parclen( 2 ) > 2 )
if( hbwin_CheckPrnDrvFormat( hDC, iType, pbmfh, ulSize, NULL ) )
{
BITMAPFILEHEADER * pbmfh = ( BITMAPFILEHEADER * ) hb_parc( 2 );
BITMAPINFO * pbmi = ( BITMAPINFO * ) ( pbmfh + 1 );
BYTE * pBits;
int cxDib, cyDib;
pBits = ( BYTE * ) pbmfh + pbmfh->bfOffBits;
/* Remember there are 2 types of BitMap File */
if( pbmi->bmiHeader.biSize == sizeof( BITMAPCOREHEADER ) )
if( iType == 1 )
{
cxDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcWidth;
cyDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcHeight;
pbmi = ( BITMAPINFO * ) ( pbmfh + 1 );
pBits = ( BYTE * ) pbmfh + pbmfh->bfOffBits;
/* Remember there are 2 types of BitMap File */
if( pbmi->bmiHeader.biSize == sizeof( BITMAPCOREHEADER ) )
{
cxDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcWidth;
cyDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcHeight;
}
else
{
cxDib = pbmi->bmiHeader.biWidth;
cyDib = abs( pbmi->bmiHeader.biHeight );
}
}
else if( cxDib && cyDib )
{
BITMAPINFO bmi;
memset( &bmi, 0, sizeof( bmi ) );
bmi.bmiHeader.biSize = sizeof( BITMAPINFO );
bmi.bmiHeader.biWidth = cxDib;
bmi.bmiHeader.biHeight = -cyDib; /* top-down image */
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 0;
bmi.bmiHeader.biCompression = (iType == 2 ? BI_JPEG : BI_PNG);
bmi.bmiHeader.biSizeImage = ulSize;
pbmi = &bmi;
pBits = ( BYTE * ) pbmfh;
}
if( pBits )
{
SetStretchBltMode( hDC, COLORONCOLOR );
hb_retl( StretchDIBits( hDC, hb_parni( 3 ), hb_parni( 4 ), hb_parni( 5 ), hb_parni( 6 ),
0, 0, cxDib, cyDib, pBits, pbmi,
DIB_RGB_COLORS, SRCCOPY ) != ( int ) GDI_ERROR );
}
else
{
cxDib = pbmi->bmiHeader.biWidth;
cyDib = abs( pbmi->bmiHeader.biHeight );
}
SetStretchBltMode( hDC, COLORONCOLOR );
hb_retl( StretchDIBits( hDC, hb_parni( 3 ), hb_parni( 4 ), hb_parni( 5 ), hb_parni( 6 ),
0, 0, cxDib, cyDib, pBits, pbmi,
DIB_RGB_COLORS, SRCCOPY ) != ( int ) GDI_ERROR );
hb_retl( HB_FALSE );
}
else
hb_retl( HB_FALSE );
@@ -580,15 +682,16 @@ HB_FUNC( WIN_DRAWBITMAP )
HB_FUNC( WIN_BITMAPDIMENSIONS )
{
if( hb_parclen( 1 ) > 1 )
BITMAPFILEHEADER * pbmfh = ( BITMAPFILEHEADER * ) hb_parc( 1 );
if( hb_parclen( 1 ) >= sizeof( BITMAPCOREHEADER ) && hbwin_TypeBitMap( pbmfh ) == 1 )
{
BITMAPFILEHEADER * pbmfh = ( BITMAPFILEHEADER * ) hb_parc( 1 );
int cxDib, cyDib;
BITMAPINFO * pbmi = ( BITMAPINFO * ) ( pbmfh + 1 );
int cxDib, cyDib;
/* Remember there are 2 types of BitMap File */
if( pbmi->bmiHeader.biSize == sizeof( BITMAPCOREHEADER ) )
{ /* Remember there are 2 types of BitMap File */
{
cxDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcWidth;
cyDib = ( ( BITMAPCOREHEADER * ) pbmi )->bcHeight;
}

View File

@@ -732,7 +732,7 @@ METHOD GetTextHeight( cString ) CLASS WIN_PRN
METHOD DrawBitMap( oBmp ) CLASS WIN_PRN
LOCAL lResult := .F.
IF ::BitMapsOk .AND. ::CheckPage() .AND. ! Empty( oBmp:BitMap )
IF ( lResult := win_DrawBitMap( ::hPrinterDc, oBmp:BitMap, oBmp:Rect[ 1 ], oBmp:Rect[ 2 ], oBmp:rect[ 3 ], oBmp:Rect[ 4 ] ) )
IF ( lResult := win_DrawBitMap( ::hPrinterDc, oBmp:BitMap, oBmp:Rect[ 1 ], oBmp:Rect[ 2 ], oBmp:Rect[ 3 ], oBmp:Rect[ 4 ], oBmp:DimXY[ 1 ], oBmp:DimXY[ 2 ] ) )
::HavePrinted := .T.
ENDIF
ENDIF
@@ -776,11 +776,14 @@ CREATE CLASS WIN_BMP
EXPORTED:
METHOD New()
METHOD LoadFile( cFileName )
METHOD LoadFile( cFileName, aDimXY )
METHOD Create()
METHOD Destroy()
METHOD Draw( oPrn, aRectangle )
METHOD Draw( oPrn, aRectangle, aDimXY )
METHOD CheckPrnDrvFormat( oPrn, cErrMsg )
VAR Type INIT 0 // Type BitMap: 1 == BM, 2 == JPEG, 3 == PNG
VAR DimXY INIT { 0, 0 } // Image Dimensions X Y pixels
VAR Rect INIT { 0, 0, 0, 0 } // Coordinates to print BitMap
// XDest, // x-coord of destination upper-left corner
// YDest, // y-coord of destination upper-left corner
@@ -794,10 +797,21 @@ ENDCLASS
METHOD New() CLASS WIN_BMP
RETURN Self
METHOD LoadFile( cFileName ) CLASS WIN_BMP
METHOD LoadFile( cFileName, aDimXY ) CLASS WIN_BMP
::FileName := cFileName
IF ValType( aDimXY ) == "A"
::DimXY := aDimXY
ELSE
::DimXY := { 1, 1 } // Driver using the original dimensions
ENDIF
::Bitmap := win_LoadBitMapFile( ::FileName )
RETURN ! Empty( ::Bitmap )
IF Empty( ::Bitmap )
::Type := 0
::DimXY := { 0, 0 }
ELSE
::Type := win_TypeBitMap( ::Bitmap )
ENDIF
RETURN ::Type > 0
METHOD Create() CLASS WIN_BMP // Compatibility function for Alaska Xbase++
RETURN Self
@@ -805,10 +819,18 @@ METHOD Create() CLASS WIN_BMP // Compatibility function for Alaska Xbase++
METHOD Destroy() CLASS WIN_BMP // Compatibility function for Alaska Xbase++
RETURN NIL
METHOD Draw( oPrn, aRectangle ) CLASS WIN_BMP // Pass a WIN_PRN object reference & Rectangle array
::Rect := aRectangle
METHOD Draw( oPrn, aRectangle, aDimXY ) CLASS WIN_BMP // Pass a WIN_PRN object reference & Rectangle array [& Image Dimensions X Y pixels array]
IF ValType( aRectangle ) == "A"
::Rect := aRectangle
ENDIF
IF ValType( aDimXY ) == "A"
::DimXY := aDimXY
ENDIF
RETURN oPrn:DrawBitMap( Self )
METHOD CheckPrnDrvFormat( oPrn, cErrMsg ) CLASS WIN_BMP
RETURN win_CheckPrnDrvFormat( oPrn:hPrinterDc, ::Bitmap, @cErrMsg )
#ifdef HB_COMPAT_XPP
/* Compatibility Class for Alaska Xbase++ */

View File

@@ -260,6 +260,7 @@ void hb_compPrintCredits( HB_COMP_DECL )
"Viktor Szakats (harbour.01 syenar.hu)\n"
"Vladimir Kazimirchik <v_kazimirchik yahoo.com>\n"
"Walter Negro <anegro overnet.com.ar>\n"
"Xavi <jarabal gmail.com>\n"
);
}