/*
 * Xailer source code:
 *
 * EnhMetaFile.prg
 * Clase TEnhMetaFile()
 *
 * Copyright 2003, 2007 Ignacio Ortiz de Zúñiga
 * Copyright 2003, 2007 Xailer.com
 * All rights reserved
 *
 */

#include "Xailer.ch"

//--------------------------------------------------------------------------

CLASS XEnhMetaFile FROM TWinObject

PUBLIC:
   PROPERTY cName    INIT "" WRITE METHOD Load

   PROPERTY nWidth   READ INLINE Round( (::nMmsWidth * ::aDevicePixRes[ 1 ] /;
                                       ( ::aDeviceMmsRes[ 1 ] * 100 ) ) + 1, 0 )
   PROPERTY nHeight  READ INLINE Round( (::nMmsHeight * ::aDevicePixRes[ 2 ] /;
                                       ( ::aDeviceMmsRes[ 2 ] * 100 ) ) + 1,  0 )

   DATA hNewDC          INIT 0        READONLY
   DATA cDescription    INIT ""       READONLY

RESERVED:
   DATA nType           INIT 0        READONLY
   DATA nBytes          INIT 0        READONLY
   DATA nGdiWidth       INIT 0        READONLY
   DATA nGdiHeight      INIT 0        READONLY
   DATA nMmsWidth       INIT 0        READONLY
   DATA nMmsHeight      INIT 0        READONLY
   DATA nVersion        INIT 0        READONLY
   DATA nRecords        INIT 0        READONLY
   DATA aDevicePixRes   INIT { 0, 0 } READONLY
   DATA aDeviceMmsRes   INIT { 0, 0 } READONLY

PUBLIC:
   METHOD Create( hDC, cName, nWidth, nHeight, cDescription ) CONSTRUCTOR
   METHOD Load( cName ) CONSTRUCTOR

   METHOD Close() // --> lSuccess
   METHOD Play( hDC, aRect ) INLINE ::Paint( hDC, aRect[ 1 ], aRect[ 2 ], aRect[ 3 ], aRect[ 4 ] ) // --> lSuccess
   METHOD Paint( hDC, nLeft, nTop, nRight, nBottom ) // --> lSuccess
   METHOD Destroy() // --> Nil

   METHOD Copy( cFileName ) INLINE CopyEnhMetafile( ::Handle, cFileName ) // --> hEnhMetafile

RESERVED:
   METHOD GetInfo()

ENDCLASS

//--------------------------------------------------------------------------

METHOD Create( hDC, cName, nWidth, nHeight, cDescription ) CLASS XEnhMetaFile

   ::hNewDC := CreateEnHMetaFile( hDC, cName, { 0, 0, nWidth, nHeight }, Application:cTitle + Chr( 0 ) + cDescription + Chr( 0 ) + Chr( 0 ) )

   IF ! Empty( ::hNewDC )
      IF ! Empty( ::Handle )
         DeleteEnhMetaFile( ::Handle )
         ::Handle := 0
      ENDIF
      ::FcName := cName
   ENDIF

RETURN Self

//--------------------------------------------------------------------------

METHOD Close() CLASS XEnhMetaFile

   IF Empty( ::hNewDC )
      RETURN .F.
   ENDIF

   ::Handle := CloseEnhMetaFile( ::hNewDC )
   ::hNewDC := 0

   ::GetInfo()

RETURN .T.

//--------------------------------------------------------------------------

METHOD Load( cName ) CLASS XEnhMetaFile

   IF ::FcName == cName .AND. ::Handle != 0
      RETURN Self
   ENDIF

   ::FcName := cName

   IF ! Empty( ::Handle )
      DeleteEnhMetaFile( ::Handle )
      ::Handle := 0
   ENDIF

   IF Empty( cName ) .OR. ! File( cName )
      RETURN Self
   ENDIF

   IF ! Empty( ::hNewDC )
      CloseEnhMetaFile( ::hNewDC )
      ::hNewDC := 0
   ENDIF

   ::Handle := GetEnhMetafile( ::FcName )

   ::GetInfo()

RETURN Self

//--------------------------------------------------------------------------

METHOD Paint( hDC, nLeft, nTop, nRight, nBottom ) CLASS XEnhMetaFile

   LOCAL lRet := .F.

   IF ! Empty(::Handle ) .AND. ! Empty( hDC )
      lRet := PlayEnhMetaFile( hDC, ::Handle, { nLeft, nTop, nRight, nBottom } )
   ENDIF

RETURN lRet

//--------------------------------------------------------------------------

METHOD GetInfo() CLASS XEnhMetaFile

   LOCAL aInfo

   IF ::Handle != 0 .AND. ( aInfo := GetEnhMetaFileHeader( ::Handle ) ) != Nil
      ::nType         := aInfo[ 1 ]
      ::nBytes        := aInfo[ 2 ]
      ::nGdiWidth     := aInfo[ 3 ]
      ::nGdiHeight    := aInfo[ 4 ]
      ::nMmsWidth     := aInfo[ 5 ]
      ::nMmsHeight    := aInfo[ 6 ]
      ::nVersion      := aInfo[ 7 ]
      ::nRecords      := aInfo[ 8 ]
      ::cDescription  := aInfo[ 9 ]
      ::aDevicePixRes := { aInfo[ 10 ], aInfo[ 11 ] }
      ::aDeviceMmsRes := { aInfo[ 12 ], aInfo[ 13 ] }
   ELSE
      ::nType         := 0
      ::nBytes        := 0
      ::nGdiWidth     := 0
      ::nGdiHeight    := 0
      ::nMmsWidth     := 0
      ::nMmsHeight    := 0
      ::nVersion      := 0
      ::nRecords      := 0
      ::cDescription  := ""
      ::aDevicePixRes := { 0, 0 }
      ::aDeviceMmsRes := { 0, 0 }
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

METHOD Destroy() CLASS XEnhMetaFile

   IF ! Empty( ::Handle )
      DeleteEnhMetaFile( ::Handle )
      ::Handle := 0
      ::cName  :=""
   ENDIF

RETURN Nil

//--------------------------------------------------------------------------

#pragma BEGINDUMP

#include <windows.h>
#include <xailer.h>

//--------------------------------------------------------------------------

XA_FUNC( GETENHMETAFILE )  // GetEnhMetafile( <cFilename> ) --> hEnhMetafile
{
   hb_retnl( (LONG) GetEnhMetaFile( hb_parc( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( DELETEENHMETAFILE )  // DeleteEnhMetafile( <hEnhMetafile> ) --> lSuccess
{
   hb_retl( DeleteEnhMetaFile( (HENHMETAFILE) hb_parnl( 1 ) ));
}

//--------------------------------------------------------------------------

XA_FUNC( CREATEENHMETAFILE )  // CreateEnhMetafile( <hDC>, <cFilename>, <aRect>, <cDescription> ) --> hEnhMetafile
{
   RECT rect;

   rect.left = hb_parvnl( 3, 1 );
   rect.top = hb_parvnl( 3, 2 );
   rect.right = hb_parvnl( 3, 3 );
   rect.bottom = hb_parvnl( 3, 4 );

   hb_retnl( (LONG) CreateEnhMetaFile( (HDC) hb_parnl( 1 ), HB_ISCHAR( 2 ) ? hb_parc( 2 ) : NULL, &rect, hb_parc( 4 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( CLOSEENHMETAFILE )   // CloseEnhMetafile( <hDC> ) --> hEnhMetafile
{
   hb_retnl( (LONG) CloseEnhMetaFile( (HDC) hb_parnl( 1 ) ) );
}

//--------------------------------------------------------------------------

XA_FUNC( PLAYENHMETAFILE ) // PlayEnhMetafile( <hDC>, <hEnhMetafile>, <aRect> ) --> lSuccess
{
   RECT rect;

   rect.left = hb_parvnl( 3, 1 );
   rect.top = hb_parvnl( 3, 2 );
   rect.right = hb_parvnl( 3, 3 );
   rect.bottom = hb_parvnl( 3, 4 );

   hb_retl( PlayEnhMetaFile( (HDC) hb_parnl( 1 ), (HENHMETAFILE) hb_parnl( 2 ), &rect ) );
}

//--------------------------------------------------------------------------

XA_FUNC( GETENHMETAFILEHEADER )  // GetEnhMetafileHeader( <hEnhMetafile> ) --> aEnhMetaHeader
{
   HENHMETAFILE hMeta;
   LPENHMETAHEADER pBuffer;
   LPRECTL pRectB;
   LPRECTL pRectF;
   LPSIZEL pSiPix;
   LPSIZEL pSiMms;

   pBuffer = ( LPENHMETAHEADER ) hb_xgrab( sizeof( ENHMETAHEADER ) );

   hMeta = (HENHMETAFILE) hb_parnl( 1 );

   if ( GetEnhMetaFileHeader( hMeta, sizeof( ENHMETAHEADER ), pBuffer ) )
      {
      pRectB = (LPRECTL) &pBuffer->rclBounds;
      pRectF = (LPRECTL) &pBuffer->rclFrame;
      pSiPix = (LPSIZEL) &pBuffer->szlDevice;
      pSiMms = (LPSIZEL) &pBuffer->szlMillimeters;
      hb_reta(13);
      hb_storvnl( pBuffer->iType, -1, 1 );
      hb_storvnl( pBuffer->nBytes, -1, 2 );
      hb_storvnl( pRectB->right - pRectB->left, -1, 3 );
      hb_storvnl( pRectB->bottom - pRectB->top, -1, 4 );
      hb_storvnl( pRectF->right - pRectF->left, -1, 5 );
      hb_storvnl( pRectF->bottom - pRectF->top, -1, 6 );
      hb_storvnl( pBuffer->nVersion, -1, 7 );
      hb_storvnl( pBuffer->nRecords, -1, 8 );
      if ( pBuffer->nDescription )
         {
         LPSTR cBuffer;
         cBuffer = ( LPSTR ) hb_xgrab( pBuffer->nDescription );
         GetEnhMetaFileDescription( hMeta, pBuffer->nDescription, cBuffer );
         if( lstrlen( cBuffer ) > 1 )
               cBuffer[lstrlen(cBuffer)] = '#';
         hb_storvc( cBuffer, -1, 9 );
         hb_xfree( ( void * ) cBuffer );
         }
      else
         hb_storvc( "", -1, 9 );
      hb_storvnl( pSiPix->cx, -1, 10 );
      hb_storvnl( pSiPix->cy, -1, 11 );
      hb_storvnl( pSiMms->cx, -1, 12 );
      hb_storvnl( pSiMms->cy, -1, 13 );
      }

   hb_xfree( ( void * ) pBuffer );
}

//--------------------------------------------------------------------------

XA_FUNC( COPYENHMETAFILE ) // CopyEnhMetafile( <hEnhMetafile>, <cFilename> ) --> hEnhMetafile
{
   hb_retnl( (LONG) CopyEnhMetaFile( (HENHMETAFILE) hb_parnl( 1 ),
                                     HB_ISCHAR( 2 ) ? hb_parc( 2 ) : NULL ) );
}

#pragma ENDDUMP

//--------------------------------------------------------------------------
