#############################################################################
## Name:        XS/GraphicsRenderer.xsp
## Purpose:     XS for Wx::GraphicsRenderer
## Author:      Mattia Barbon
## Modified by:
## Created:     30/09/2007
## RCS-ID:      $Id: GraphicsRenderer.xsp 2952 2010-08-15 10:38:47Z mbarbon $
## Copyright:   (c) 2007, 2010 Klaas Hartmann
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%module{Wx};

%loadplugin{build::Wx::XSP::Overload};

#if wxUSE_GRAPHICS_CONTEXT

#include <wx/graphics.h>

## DECLARE_OVERLOAD( wmdc, Wx::MemoryDC )
## DECLARE_OVERLOAD( wwdc, Wx::WindowDC )
## DECLARE_OVERLOAD( wpdc, Wx::PrinterDC )

#if WXPERL_W_VERSION_GE( 2, 9, 1 )

%typemap{wxColour}{parsed}{%wxColour%};

%name{Wx::GraphicsGradientStop} class wxGraphicsGradientStop
{
public:
    wxGraphicsGradientStop( wxColour col = wxTransparentColour,
                            float pos = 0.);

%{
static void
wxGraphicsGradientStop::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );

## // thread OK
void
wxGraphicsGradientStop::DESTROY()
  CODE:
    wxPli_thread_sv_unregister( aTHX_ "Wx::GraphicsGradientStop", THIS, ST(0) );
    delete THIS;
%}

    const wxColour& GetColour() const;
    void SetColour( const wxColour& col );

    float GetPosition() const;
    void SetPosition( float pos );
};

%typemap{const wxGraphicsGradientStop&}{reference};

%name{Wx::GraphicsGradientStops} class wxGraphicsGradientStops
{
public:
    wxGraphicsGradientStops( wxColour startCol = wxTransparentColour,
                             wxColour endCol = wxTransparentColour );

%{
static void
wxGraphicsGradientStops::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );

## // thread OK
void
wxGraphicsGradientStops::DESTROY()
  CODE:
    wxPli_thread_sv_unregister( aTHX_ "Wx::GraphicsGradientStop", THIS, ST(0) );
    delete THIS;
%}

    // Add a stop in correct order.
    %name{AddStop} void Add( const wxGraphicsGradientStop& stop ) %Overload;
    %name{AddColour} void Add( wxColour col, float pos ) %Overload;

    // Get the number of stops.
    unsigned GetCount() const;

    // Return the stop at the given index (which must be valid).
    const wxGraphicsGradientStop& Item( unsigned n ) const;

    // Get/set start and end colours.
    void SetStartColour( wxColour col );
    const wxColour& GetStartColour() const;
    void SetEndColour( wxColour col );
    const wxColour& GetEndColour() const;
};

%typemap{const wxGraphicsGradientStops&}{reference};

#endif

%name{Wx::GraphicsRenderer} class wxGraphicsRenderer
{
%{
wxGraphicsRenderer*
GetDefaultRenderer()
  CODE:
    RETVAL = wxGraphicsRenderer::GetDefaultRenderer();
  OUTPUT: RETVAL

void
CreateContext( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_REDISP( wxPliOvl_wwin, CreateFromWindow )   
#if defined(__WXMSW__) || WXPERL_W_VERSION_GE( 2, 9, 0 )       
        MATCH_REDISP( wxPliOvl_wmdc, CreateFromMemoryDC)
#endif     
#if wxPERL_USE_PRINTING_ARCHITECTURE && WXPERL_W_VERSION_GE( 2, 9, 0 )     
        MATCH_REDISP( wxPliOvl_wpdc, CreateFromPrinterDC)
#endif                  
        MATCH_REDISP( wxPliOvl_wwdc, CreateFromWindowDC )
    END_OVERLOAD( "Wx::GraphicsRenderer::CreateContext" )

%}

    %name{CreateFromWindowDC} wxGraphicsContext* CreateContext( const wxWindowDC& dc );
    %name{CreateFromWindow} wxGraphicsContext* CreateContext( wxWindow* window );
#if defined(__WXMSW__) || WXPERL_W_VERSION_GE( 2, 9, 0 )           
    %name{CreateFromMemoryDC} wxGraphicsContext* CreateContext( const wxMemoryDC& dc );
#endif
#if wxPERL_USE_PRINTING_ARCHITECTURE && WXPERL_W_VERSION_GE( 2, 9, 0 )     
    %name{CreateFromPrinterDC} wxGraphicsContext* CreateContext( const wxPrinterDC& dc );
#endif
    wxGraphicsContext* CreateMeasuringContext();
    const wxGraphicsPath& CreatePath();
    const wxGraphicsMatrix& CreateMatrix( wxDouble a=1.0, wxDouble b=0.0,
                                          wxDouble c=0.0, wxDouble d=1.0,
                                          wxDouble tx=0.0, wxDouble ty=0.0 );
    const wxGraphicsPen& CreatePen( const wxPen& pen );
    const wxGraphicsBrush& CreateBrush( const wxBrush& brush );

#if WXPERL_W_VERSION_LT( 2, 9, 1 )
    const wxGraphicsBrush& CreateLinearGradientBrush( wxDouble x1, wxDouble y1,
                                                      wxDouble x2, wxDouble y2,
                                                      const wxColour&c1, const wxColour&c2 );
    const wxGraphicsBrush& CreateRadialGradientBrush( wxDouble xo, wxDouble yo,
                                                      wxDouble xc, wxDouble yc,
                                                      wxDouble radius,
                                                      const wxColour &oColor, const wxColour &cColor );
#else
    const wxGraphicsBrush& CreateLinearGradientBrush( wxDouble x1, wxDouble y1,
                                                      wxDouble x2, wxDouble y2,
                                                      const wxGraphicsGradientStops& stops );
    const wxGraphicsBrush& CreateRadialGradientBrush( wxDouble xo, wxDouble yo,
                                                      wxDouble xc, wxDouble yc,
                                                      wxDouble radius,
                                                      const wxGraphicsGradientStops& stops );
#endif

#define wxBLACKPtr (wxColour*)wxBLACK
    const wxGraphicsFont& CreateFont( const wxFont& font,
                                      const wxColour& col = wxBLACKPtr );
};

#endif
