#############################################################################
## Name:        XS/DC.xs
## Purpose:     XS for Wx::DC and derived classes
## Author:      Mattia Barbon
## Modified by:
## Created:     29/10/2000
## RCS-ID:      $Id: DC.xs,v 1.25 2005/10/16 21:03:41 mbarbon Exp $
## Copyright:   (c) 2000-2005 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%{
#include <wx/dc.h>
#include <wx/dcmemory.h>
#include <wx/dcclient.h>
#include <wx/dcscreen.h>
#include <wx/dcbuffer.h>

#define wxNullBitmapPtr (wxBitmap*) &wxNullBitmap

MODULE=Wx PACKAGE=Wx::DC

void
DESTROY( THIS )
    wxDC* THIS
  CODE:
    if( wxPli_object_is_deleteable( aTHX_ ST(0) ) )
        delete THIS;

void
wxDC::BeginDrawing()

bool
wxDC::Blit( xdest, ydest, width, height, source, xsrc, ysrc, logicalFunc = wxCOPY, useMask = false )
    wxCoord xdest
    wxCoord ydest
    wxCoord width
    wxCoord height
    wxDC* source
    wxCoord xsrc
    wxCoord ysrc
    int logicalFunc
    bool useMask

void
wxDC::CalcBoundingBox( x, y )
    wxCoord x
    wxCoord y

void
wxDC::Clear()

void
wxDC::CrossHair( x, y )
    wxCoord x
    wxCoord y

void
wxDC::DestroyClippingRegion()

wxCoord
wxDC::DeviceToLogicalX( x )
    wxCoord x

wxCoord
wxDC::DeviceToLogicalXRel( x )
    wxCoord x

wxCoord
wxDC::DeviceToLogicalY( y )
    wxCoord y

wxCoord
wxDC::DeviceToLogicalYRel( y )
    wxCoord y

void
wxDC::DrawArc( x1, y1, x2, y2, xc, yc )
    wxCoord x1
    wxCoord y1
    wxCoord x2
    wxCoord y2
    wxCoord xc
    wxCoord yc

void
wxDC::DrawBitmap( bitmap, x, y, transparent )
    wxBitmap* bitmap
    wxCoord x
    wxCoord y
    bool transparent
  CODE:
    THIS->DrawBitmap( *bitmap, x, y, transparent );

void
wxDC::DrawCheckMark( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP( wxPliOvl_n_n_n_n, DrawCheckMarkXYWH )
        MATCH_REDISP( wxPliOvl_wrec, DrawCheckMarkRect )
    END_OVERLOAD( Wx::DC::DrawCheckMark )

void
wxDC::DrawCheckMarkXYWH( x, y, width, height )
    wxCoord x
    wxCoord y
    wxCoord width
    wxCoord height
  CODE:
    THIS->DrawCheckMark( x, y, width, height );

void
wxDC::DrawCheckMarkRect( rect )
    wxRect* rect
  CODE:
    THIS->DrawCheckMark( *rect );

void
wxDC::DrawCircle( x, y, radius )
    wxCoord x
    wxCoord y
    wxCoord radius

void
wxDC::DrawEllipse( x, y, width, height )
    wxCoord x
    wxCoord y
    wxCoord width
    wxCoord height

void
wxDC::DrawEllipticArc( x, y, width, height, start, end )
    wxCoord x
    wxCoord y
    wxCoord width
    wxCoord height
    double start
    double end

void
wxDC::DrawIcon( icon, x, y )
    wxIcon* icon
    wxCoord x
    wxCoord y
  CODE:
    THIS->DrawIcon( *icon, x, y );

void
wxDC::DrawLine( x1, y1, x2, y2 )
    wxCoord x1
    wxCoord y1
    wxCoord x2
    wxCoord y2

void
wxDC::DrawLines( list, xoffset = 0, yoffset = 0 )
    SV* list
    wxCoord xoffset
    wxCoord yoffset
  PREINIT:
    wxList points;
    wxPoint* pts;
  CODE:
    wxPli_av_2_pointlist( aTHX_ list, &points, &pts );
    THIS->DrawLines( &points, xoffset, yoffset );
    delete [] pts;

void
wxDC::DrawObject( object )
    wxDrawObject* object

void
wxDC::DrawPoint( x, y )
    wxCoord x
    wxCoord y

void
wxDC::DrawPolygon( list, xoffset, yoffset, fill_style = wxODDEVEN_RULE )
    SV* list
    wxCoord xoffset
    wxCoord yoffset
    int fill_style
  PREINIT:
    wxList points;
    wxPoint* pts;
  CODE:
    wxPli_av_2_pointlist( aTHX_ list, &points, &pts );
    THIS->DrawPolygon( &points, xoffset, yoffset, fill_style );
    delete [] pts;


void
wxDC::DrawRectangle( x, y, width, height )
    wxCoord x
    wxCoord y
    wxCoord width
    wxCoord height

void
wxDC::DrawRotatedText( text, x, y, angle )
    wxString text
    wxCoord x
    wxCoord y
    double angle

void
wxDC::DrawRoundedRectangle( x, y, width, height, radius = 20 )
    wxCoord x
    wxCoord y
    wxCoord width
    wxCoord height
    wxCoord radius

void
wxDC::DrawSpline( list )
    SV* list
  PREINIT:
    wxList points;
    wxPoint* pts;
  CODE:
    wxPli_av_2_pointlist( aTHX_ list, &points, &pts );
    THIS->DrawSpline( &points );
    delete [] pts;

void
wxDC::DrawText( text, x, y )
    wxString text
    wxCoord x
    wxCoord y

void
wxDC::EndDoc()

void
wxDC::EndDrawing()

void
wxDC::EndPage()

void
wxDC::FloodFill( x, y, colour, style =  wxFLOOD_SURFACE )
    wxCoord x
    wxCoord y
    wxColour* colour
    int style
  CODE:
    THIS->FloodFill( x, y, *colour, style );

wxBrush*
wxDC::GetBackground()
  CODE:
    RETVAL = new wxBrush( THIS->GetBackground() );
  OUTPUT:
    RETVAL

int
wxDC::GetBackgroundMode()

wxBrush*
wxDC::GetBrush()
  CODE:
    RETVAL = new wxBrush( THIS->GetBrush() );
  OUTPUT:
    RETVAL

wxCoord
wxDC::GetCharHeight()

wxCoord
wxDC::GetCharWidth()

void
wxDC::GetClippingBox()
  PREINIT:
    wxCoord x, y, width, height;
  PPCODE:
    THIS->GetClippingBox( &x, &y, &width, &height );
    EXTEND( SP, 4 );
    PUSHs( sv_2mortal( newSViv( x ) ) );
    PUSHs( sv_2mortal( newSViv( y ) ) );
    PUSHs( sv_2mortal( newSViv( width ) ) );
    PUSHs( sv_2mortal( newSViv( height ) ) );

wxFont*
wxDC::GetFont()
  CODE:
    RETVAL = new wxFont( THIS->GetFont() );
  OUTPUT:
    RETVAL

int
wxDC::GetLogicalFunction()

int
wxDC::GetMapMode()

#if !defined( __WXMAC__ ) && WXPERL_W_VERSION_LE( 2, 5, 3 )

bool
wxDC::GetOptimization()

#endif

wxPen*
wxDC::GetPen()
  CODE:
    RETVAL = new wxPen( THIS->GetPen() );
  OUTPUT:
    RETVAL

wxColour*
wxDC::GetPixel( x, y )
    wxCoord x
    wxCoord y
  PREINIT:
    wxColour c;
  CODE:
    THIS->GetPixel( x, y, &c );
    RETVAL = new wxColour( c );
  OUTPUT:
    RETVAL

wxSize*
wxDC::GetSize()
  CODE:
    RETVAL = new wxSize( THIS->GetSize() );
  OUTPUT:
    RETVAL

void
wxDC::GetSizeWH()
  PREINIT:
    wxCoord x, y;
  PPCODE:
    THIS->GetSize( &x, &y );
    EXTEND( SP, 2 );
    PUSHs( sv_2mortal( newSViv( x ) ) );
    PUSHs( sv_2mortal( newSViv( y ) ) );

wxColour*
wxDC::GetTextBackground()
  CODE:
    RETVAL = new wxColour( THIS->GetTextBackground() );
  OUTPUT:
    RETVAL

void
wxDC::GetTextExtent( string, font = 0 )
    wxString string
    wxFont* font
  PREINIT:
    wxCoord x;
    wxCoord y;
    wxCoord descent;
    wxCoord externalLeading;
  PPCODE:
    THIS->GetTextExtent( string, &x, &y, &descent, &externalLeading,
        font );
    EXTEND( SP, 4 );
    PUSHs( sv_2mortal( newSViv( x ) ) );
    PUSHs( sv_2mortal( newSViv( y ) ) );
    PUSHs( sv_2mortal( newSViv( descent ) ) );
    PUSHs( sv_2mortal( newSViv( externalLeading ) ) );

wxColour*
wxDC::GetTextForeground()
  CODE:
    RETVAL = new wxColour( THIS->GetTextForeground() );
  OUTPUT:
    RETVAL

void
wxDC::GetUserScale()
  PREINIT:
    double x, y;
  PPCODE:
    THIS->GetUserScale( &x, &y );
    EXTEND( SP, 2 );
    PUSHs( sv_2mortal( newSVnv( x ) ) );
    PUSHs( sv_2mortal( newSVnv( y ) ) );

wxCoord
wxDC::LogicalToDeviceX( x )
    wxCoord x

wxCoord
wxDC::LogicalToDeviceXRel( x )
    wxCoord x

wxCoord
wxDC::LogicalToDeviceY( y )
    wxCoord y

wxCoord
wxDC::LogicalToDeviceYRel( y )
    wxCoord y

wxCoord
wxDC::MaxX()

wxCoord
wxDC::MaxY()

wxCoord
wxDC::MinX()

wxCoord
wxDC::MinY()

bool
wxDC::Ok()

void
wxDC::ResetBoundingBox()

void
wxDC::SetAxisOrientation( xLeftRight, yBottomUp )
    bool xLeftRight
    bool yBottomUp

wxPoint*
wxDC::GetDeviceOrigin()
  CODE:
    RETVAL = new wxPoint( THIS->GetDeviceOrigin() );
  OUTPUT: RETVAL

void
wxDC::SetDeviceOrigin( x, y )
    wxCoord x
    wxCoord y

void
wxDC::SetBackground( brush )
    wxBrush* brush
  CODE:
    THIS->SetBackground( *brush );

void
wxDC::SetBackgroundMode( mode )
    int mode

void
wxDC::SetBrush( brush )
    wxBrush* brush
  CODE:
    THIS->SetBrush( *brush );

void
wxDC::SetClippingRegion( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP( wxPliOvl_n_n_n_n, SetClippingRegionXYWH )
        MATCH_REDISP( wxPliOvl_wreg, SetClippingRegionRegion )
    END_OVERLOAD( Wx::DC::SetClippingRegion )

void
wxDC::SetClippingRegionXYWH( x, y, w, h )
    wxCoord x
    wxCoord y
    wxCoord w
    wxCoord h
  CODE:
    THIS->SetClippingRegion( x, y, w, h );

void
wxDC::SetClippingRegionRegion( region )
    wxRegion* region
  CODE:
    THIS->SetClippingRegion( *region );

void
wxDC::SetFont( font )
    wxFont* font
  CODE:
    THIS->SetFont( *font );

void
wxDC::SetLogicalFunction( function )
    int function

void
wxDC::SetMapMode( mode )
    int mode

#if !defined( __WXMAC__ ) && WXPERL_W_VERSION_LE( 2, 5, 3 )

void
wxDC::SetOptimization( optimize )
    bool optimize

#endif 

void
wxDC::SetPalette( palette )
    wxPalette* palette
  CODE:
    THIS->SetPalette( *palette );

void
wxDC::SetPen( pen )
    wxPen* pen
  CODE:
    THIS->SetPen( *pen );

void
wxDC::SetTextBackground( colour )
    wxColour* colour
  CODE:
    THIS->SetTextBackground( *colour );

void
wxDC::SetTextForeground( colour )
    wxColour* colour
  CODE:
    THIS->SetTextForeground( *colour );

void
wxDC::SetUserScale( xScale, yScale )
    double xScale
    double yScale

bool
wxDC::StartDoc( message )
    wxString message

void
wxDC::StartPage()

MODULE=Wx PACKAGE=Wx::ScreenDC

wxScreenDC*
wxScreenDC::new()

bool
wxScreenDC::EndDrawingOnTop()

void
wxScreenDC::StartDrawingOnTop( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP( wxPliOvl_wwin, StartDrawingOnTopWindow )
        MATCH_REDISP( wxPliOvl_wrec, StartDrawingOnTopRect )
    END_OVERLOAD( Wx::ScreenDC::StartDrawingOnTop )

bool
wxScreenDC::StartDrawingOnTopWindow( window )
    wxWindow* window
  CODE:
    RETVAL = THIS->StartDrawingOnTop( window );
  OUTPUT:
    RETVAL

bool
wxScreenDC::StartDrawingOnTopRect( rect )
    wxRect* rect
  CODE:
    RETVAL = THIS->StartDrawingOnTop( rect );
  OUTPUT:
    RETVAL

MODULE=Wx PACKAGE=Wx::WindowDC

wxWindowDC*
wxWindowDC::new( window )
    wxWindow* window

MODULE=Wx PACKAGE=Wx::PaintDC

wxPaintDC*
wxPaintDC::new( window )
    wxWindow* window

MODULE=Wx PACKAGE=Wx::MemoryDC

wxMemoryDC*
wxMemoryDC::new()

void
wxMemoryDC::SelectObject( bitmap )
    wxBitmap* bitmap
  CODE:
    THIS->SelectObject( *bitmap );

MODULE=Wx PACKAGE=Wx::ClientDC

wxClientDC*
wxClientDC::new( window )
    wxWindow* window

%}

%module{Wx};

%typemap{wxBufferedDC*}{simple};
%typemap{wxBufferedPaintDC*}{simple};

%name{Wx::BufferedDC} class wxBufferedDC
{
    %name{newDefault} wxBufferedDC();
    %name{newBitmap} wxBufferedDC( wxDC *dc,
                                   const wxBitmap &buffer = wxNullBitmapPtr,
                                   int style = wxBUFFER_CLIENT_AREA );
    %name{newSize} wxBufferedDC( wxDC *dc, const wxSize &area,
                                 int style = wxBUFFER_CLIENT_AREA );

    %name{InitBitmap} void Init( wxDC *dc,
                                 const wxBitmap &buffer = wxNullBitmapPtr,
                                 int style = wxBUFFER_CLIENT_AREA );
    %name{InitSize} void Init( wxDC *dc, const wxSize &area,
                               int style = wxBUFFER_CLIENT_AREA );

    void UnMask();

    void SetStyle( int style );
    int GetStyle();
};

%name{Wx::BufferedPaintDC} class wxBufferedPaintDC
{
    %name{newBitmap} wxBufferedPaintDC( wxWindow* window,
                                        const wxBitmap& buffer,
                                        int style = wxBUFFER_CLIENT_AREA );
    %name{newWindow} wxBufferedPaintDC( wxWindow* window,
                                        int style = wxBUFFER_CLIENT_AREA );
};

%{

MODULE=Wx PACKAGE=Wx::BufferedDC

void
new( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_VOIDM_REDISP( newDefault )
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_wsiz_n, newSize, 2 )
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_wbmp_n, newBitmap, 1 )
    END_OVERLOAD( "Wx::BufferedDC::new" )

void
Init( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_wsiz_n, InitSize, 2 )
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_wbmp_n, InitBitmap, 1 )
    END_OVERLOAD( "Wx::BufferedDC::Init" )

MODULE=Wx PACKAGE=Wx::BufferedPaintDC

void
new( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_wbmp_n, newBitmap, 2 )
        MATCH_REDISP_COUNT_ALLOWMORE( wxPliOvl_wdc_n, newBitmap, 1 )
    END_OVERLOAD( "Wx::BufferedPaintDC::new" )

%}