1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/gnome/gprint.cpp 
   3 // Author:      Robert Roebling 
   4 // Purpose:     Implement GNOME printing support 
   7 // Copyright:   Robert Roebling 
   8 // Licence:     wxWindows Licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  11 // For compilers that support precompilation, includes "wx/wx.h". 
  12 #include "wx/wxprec.h" 
  18 #if wxUSE_LIBGNOMEPRINT 
  20 #include "wx/gtk/gnome/gprint.h" 
  24     #include "wx/dcmemory.h" 
  28     #include "wx/module.h" 
  32 #include "wx/fontutil.h" 
  33 #include "wx/gtk/private.h" 
  34 #include "wx/dynlib.h" 
  36 #include "wx/dcprint.h" 
  38 #include <libgnomeprint/gnome-print.h> 
  39 #include <libgnomeprint/gnome-print-pango.h> 
  40 #include <libgnomeprint/gnome-print-config.h> 
  41 #include <libgnomeprintui/gnome-print-dialog.h> 
  42 #include <libgnomeprintui/gnome-print-job-preview.h> 
  43 #include <libgnomeprintui/gnome-print-paper-selector.h> 
  46 wxFORCE_LINK_THIS_MODULE(gnome_print
) 
  48 //---------------------------------------------------------------------------- 
  49 // wxGnomePrintLibrary 
  50 //---------------------------------------------------------------------------- 
  52 class wxGnomePrintLibrary
 
  55     wxGnomePrintLibrary(); 
  56     ~wxGnomePrintLibrary(); 
  60     bool InitializeMethods(); 
  62     wxDynamicLibrary m_libGnomePrint
; 
  63     wxDynamicLibrary m_libGnomePrintUI
; 
  65     // only true if we successfully loaded both libraries 
  67     // don't rename this field, it's used by wxDL_XXX macros internally 
  71     wxDL_METHOD_DEFINE( gint
, gnome_print_newpath
, 
  72         (GnomePrintContext 
*pc
), (pc
), 0 ) 
  73     wxDL_METHOD_DEFINE( gint
, gnome_print_moveto
, 
  74         (GnomePrintContext 
*pc
, gdouble x
, gdouble y
), (pc
, x
, y
), 0 ) 
  75     wxDL_METHOD_DEFINE( gint
, gnome_print_lineto
, 
  76         (GnomePrintContext 
*pc
, gdouble x
, gdouble y
), (pc
, x
, y
), 0 ) 
  77     wxDL_METHOD_DEFINE( gint
, gnome_print_arcto
, 
  78         (GnomePrintContext 
*pc
, gdouble x
, gdouble y
, gdouble radius
, gdouble angle1
, gdouble angle2
, gint direction 
), (pc
, x
, y
, radius
, angle1
, angle2
, direction
), 0 ) 
  79     wxDL_METHOD_DEFINE( gint
, gnome_print_curveto
, 
  80         (GnomePrintContext 
*pc
, gdouble x1
, gdouble y1
, gdouble x2
, gdouble y2
, gdouble x3
, gdouble y3
), (pc
, x1
, y1
, x2
, y2
, x3
, y3
), 0 ) 
  81     wxDL_METHOD_DEFINE( gint
, gnome_print_closepath
, 
  82         (GnomePrintContext 
*pc
), (pc
), 0 ) 
  83     wxDL_METHOD_DEFINE( gint
, gnome_print_stroke
, 
  84         (GnomePrintContext 
*pc
), (pc
), 0 ) 
  85     wxDL_METHOD_DEFINE( gint
, gnome_print_fill
, 
  86         (GnomePrintContext 
*pc
), (pc
), 0 ) 
  87     wxDL_METHOD_DEFINE( gint
, gnome_print_setrgbcolor
, 
  88         (GnomePrintContext 
*pc
, gdouble r
, gdouble g
, gdouble b
), (pc
, r
, g
, b
), 0 ) 
  89     wxDL_METHOD_DEFINE( gint
, gnome_print_setlinewidth
, 
  90         (GnomePrintContext 
*pc
, gdouble width
), (pc
, width
), 0 ) 
  91     wxDL_METHOD_DEFINE( gint
, gnome_print_setdash
, 
  92         (GnomePrintContext 
*pc
, gint n_values
, const gdouble 
*values
, gdouble offset
), (pc
, n_values
, values
, offset
), 0 ) 
  94     wxDL_METHOD_DEFINE( gint
, gnome_print_rgbimage
, 
  95         (GnomePrintContext 
*pc
, const guchar 
*data
, gint width
, gint height
, gint rowstride
), (pc
, data
, width
, height
, rowstride 
), 0 ) 
  96     wxDL_METHOD_DEFINE( gint
, gnome_print_rgbaimage
, 
  97         (GnomePrintContext 
*pc
, const guchar 
*data
, gint width
, gint height
, gint rowstride
), (pc
, data
, width
, height
, rowstride 
), 0 ) 
  99     wxDL_METHOD_DEFINE( gint
, gnome_print_concat
, 
 100         (GnomePrintContext 
*pc
, const gdouble 
*matrix
), (pc
, matrix
), 0 ) 
 101     wxDL_METHOD_DEFINE( gint
, gnome_print_scale
, 
 102         (GnomePrintContext 
*pc
, gdouble sx
, gdouble sy
), (pc
, sx
, sy
), 0 ) 
 103     wxDL_METHOD_DEFINE( gint
, gnome_print_rotate
, 
 104         (GnomePrintContext 
*pc
, gdouble theta
), (pc
, theta
), 0 ) 
 105     wxDL_METHOD_DEFINE( gint
, gnome_print_translate
, 
 106         (GnomePrintContext 
*pc
, gdouble x
, gdouble y
), (pc
, x
, y
), 0 ) 
 108     wxDL_METHOD_DEFINE( gint
, gnome_print_gsave
, 
 109         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 110     wxDL_METHOD_DEFINE( gint
, gnome_print_grestore
, 
 111         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 113     wxDL_METHOD_DEFINE( gint
, gnome_print_clip
, 
 114         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 115     wxDL_METHOD_DEFINE( gint
, gnome_print_eoclip
, 
 116         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 118     wxDL_METHOD_DEFINE( gint
, gnome_print_beginpage
, 
 119         (GnomePrintContext 
*pc
, const guchar
* name
), (pc
, name
), 0 ) 
 120     wxDL_METHOD_DEFINE( gint
, gnome_print_showpage
, 
 121         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 122     wxDL_METHOD_DEFINE( gint
, gnome_print_end_doc
, 
 123         (GnomePrintContext 
*pc
), (pc
), 0 ) 
 125     wxDL_METHOD_DEFINE( PangoLayout
*, gnome_print_pango_create_layout
, 
 126         (GnomePrintContext 
*gpc
), (gpc
), NULL 
) 
 127     wxDL_VOIDMETHOD_DEFINE( gnome_print_pango_layout
, 
 128         (GnomePrintContext 
*gpc
, PangoLayout 
*layout
), (gpc
, layout
)  ) 
 130     wxDL_METHOD_DEFINE( GnomePrintJob
*, gnome_print_job_new
, 
 131         (GnomePrintConfig 
*config
), (config
), NULL 
) 
 132     wxDL_METHOD_DEFINE( GnomePrintContext
*, gnome_print_job_get_context
, 
 133         (GnomePrintJob 
*job
), (job
), NULL 
) 
 134     wxDL_METHOD_DEFINE( gint
, gnome_print_job_close
, 
 135         (GnomePrintJob 
*job
), (job
), 0 ) 
 136     wxDL_METHOD_DEFINE( gint
, gnome_print_job_print
, 
 137         (GnomePrintJob 
*job
), (job
), 0 ) 
 138     wxDL_METHOD_DEFINE( gboolean
, gnome_print_job_get_page_size
, 
 139         (GnomePrintJob 
*job
, gdouble 
*width
, gdouble 
*height
), (job
, width
, height
), 0 ) 
 141     wxDL_METHOD_DEFINE( GnomePrintUnit
*, gnome_print_unit_get_by_abbreviation
, 
 142         (const guchar 
*abbreviation
), (abbreviation
), NULL 
) 
 143     wxDL_METHOD_DEFINE( gboolean
, gnome_print_convert_distance
, 
 144         (gdouble 
*distance
, const GnomePrintUnit 
*from
, const GnomePrintUnit 
*to
), (distance
, from
, to
), false ) 
 146     wxDL_METHOD_DEFINE( GnomePrintConfig
*, gnome_print_config_default
, 
 148     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_set
, 
 149         (GnomePrintConfig 
*config
, const guchar 
*key
, const guchar 
*value
), (config
, key
, value
), false ) 
 150     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_set_double
, 
 151         (GnomePrintConfig 
*config
, const guchar 
*key
, gdouble value
), (config
, key
, value
), false ) 
 152     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_set_int
, 
 153         (GnomePrintConfig 
*config
, const guchar 
*key
, gint value
), (config
, key
, value
), false ) 
 154     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_set_boolean
, 
 155         (GnomePrintConfig 
*config
, const guchar 
*key
, gboolean value
), (config
, key
, value
), false ) 
 156     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_set_length
, 
 157         (GnomePrintConfig 
*config
, const guchar 
*key
, gdouble value
, const GnomePrintUnit 
*unit
), (config
, key
, value
, unit
), false ) 
 159     wxDL_METHOD_DEFINE( guchar
*, gnome_print_config_get
, 
 160         (GnomePrintConfig 
*config
, const guchar 
*key
), (config
, key
), NULL 
) 
 161     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_get_length
, 
 162         (GnomePrintConfig 
*config
, const guchar 
*key
, gdouble 
*val
, const GnomePrintUnit 
**unit
), (config
, key
, val
, unit
), false ) 
 163     wxDL_METHOD_DEFINE( gboolean
, gnome_print_config_get_boolean
, 
 164         (GnomePrintConfig 
*config
, const guchar 
*key
, gboolean 
*val
), (config
, key
, val
), false ) 
 166     wxDL_METHOD_DEFINE( GtkWidget
*, gnome_print_dialog_new
, 
 167         (GnomePrintJob 
*gpj
, const guchar 
*title
, gint flags
), (gpj
, title
, flags
), NULL 
) 
 168     wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_construct_range_page
, 
 169         (GnomePrintDialog 
*gpd
, gint flags
, gint start
, gint end
, 
 170         const guchar 
*currentlabel
, const guchar 
*rangelabel
), 
 171         (gpd
, flags
, start
, end
, currentlabel
, rangelabel
) ) 
 172     wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_get_copies
, 
 173         (GnomePrintDialog 
*gpd
, gint 
*copies
, gboolean 
*collate
), (gpd
, copies
, collate
)  ) 
 174     wxDL_VOIDMETHOD_DEFINE( gnome_print_dialog_set_copies
, 
 175         (GnomePrintDialog 
*gpd
, gint copies
, gint collate
), (gpd
, copies
, collate
)  ) 
 176     wxDL_METHOD_DEFINE( GnomePrintRangeType
, gnome_print_dialog_get_range
, 
 177         (GnomePrintDialog 
*gpd
), (gpd
), GNOME_PRINT_RANGETYPE_NONE 
) 
 178     wxDL_METHOD_DEFINE( int, gnome_print_dialog_get_range_page
, 
 179         (GnomePrintDialog 
*gpd
, gint 
*start
, gint 
*end
), (gpd
, start
, end
), 0 ) 
 181     wxDL_METHOD_DEFINE( GtkWidget
*, gnome_paper_selector_new_with_flags
, 
 182         (GnomePrintConfig 
*config
, gint flags
), (config
, flags
), NULL 
) 
 184     wxDL_METHOD_DEFINE( GtkWidget
*, gnome_print_job_preview_new
, 
 185         (GnomePrintJob 
*gpm
, const guchar 
*title
), (gpm
, title
), NULL 
) 
 187     wxDECLARE_NO_COPY_CLASS(wxGnomePrintLibrary
); 
 190 wxGnomePrintLibrary::wxGnomePrintLibrary() 
 194     m_libGnomePrint
.Load("libgnomeprint-2-2.so.0"); 
 195     m_ok 
= m_libGnomePrint
.IsLoaded(); 
 199     m_libGnomePrintUI
.Load("libgnomeprintui-2-2.so.0"); 
 200     m_ok 
= m_libGnomePrintUI
.IsLoaded(); 
 203         m_libGnomePrint
.Unload(); 
 207     m_ok 
= InitializeMethods(); 
 210 wxGnomePrintLibrary::~wxGnomePrintLibrary() 
 214 bool wxGnomePrintLibrary::IsOk() 
 219 bool wxGnomePrintLibrary::InitializeMethods() 
 221     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_newpath 
); 
 222     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_moveto 
); 
 223     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_lineto 
); 
 224     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_curveto 
); 
 225     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_arcto 
); 
 226     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_closepath 
); 
 227     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_stroke 
); 
 228     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_fill 
); 
 229     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_setrgbcolor 
); 
 230     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_setlinewidth 
); 
 231     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_setdash 
); 
 233     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_rgbimage 
); 
 234     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_rgbaimage 
); 
 236     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_concat 
); 
 237     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_scale 
); 
 238     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_rotate 
); 
 239     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_translate 
); 
 241     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_gsave 
); 
 242     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_grestore 
); 
 244     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_clip 
); 
 245     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_eoclip 
); 
 247     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_beginpage 
); 
 248     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_showpage 
); 
 249     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_end_doc 
); 
 251     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_pango_create_layout 
); 
 252     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_pango_layout 
); 
 254     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_job_new 
); 
 255     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_job_get_context 
); 
 256     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_job_close 
); 
 257     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_job_print 
); 
 258     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_job_get_page_size 
); 
 260     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_unit_get_by_abbreviation 
); 
 261     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_convert_distance 
); 
 263     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_default 
); 
 264     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_set 
); 
 265     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_set_boolean 
); 
 266     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_set_double 
); 
 267     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_set_int 
); 
 268     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_set_length 
); 
 270     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_get 
); 
 271     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_get_length 
); 
 272     wxDL_METHOD_LOAD( m_libGnomePrint
, gnome_print_config_get_boolean 
); 
 274     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_new 
); 
 275     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_construct_range_page 
); 
 276     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_get_copies 
); 
 277     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_set_copies 
); 
 278     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_get_range 
); 
 279     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_dialog_get_range_page 
); 
 281     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_paper_selector_new_with_flags 
); 
 283     wxDL_METHOD_LOAD( m_libGnomePrintUI
, gnome_print_job_preview_new 
); 
 288 static wxGnomePrintLibrary
* gs_libGnomePrint 
= NULL
; 
 290 //---------------------------------------------------------------------------- 
 291 // wxGnomePrintNativeData 
 292 //---------------------------------------------------------------------------- 
 294 IMPLEMENT_CLASS(wxGnomePrintNativeData
, wxPrintNativeDataBase
) 
 296 wxGnomePrintNativeData::wxGnomePrintNativeData() 
 298     m_config 
= gs_libGnomePrint
->gnome_print_config_default(); 
 299     m_job 
= gs_libGnomePrint
->gnome_print_job_new( m_config 
); 
 302 wxGnomePrintNativeData::~wxGnomePrintNativeData() 
 304     g_object_unref (m_config
); 
 307 bool wxGnomePrintNativeData::TransferTo( wxPrintData 
&data 
) 
 309     guchar 
*res 
= gs_libGnomePrint
->gnome_print_config_get( m_config
, 
 310             (guchar
*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION 
); 
 311     if (g_ascii_strcasecmp((const gchar 
*)res
,"R90") == 0) 
 312         data
.SetOrientation( wxLANDSCAPE 
); 
 314         data
.SetOrientation( wxPORTRAIT 
); 
 317     res 
= gs_libGnomePrint
->gnome_print_config_get( m_config
, 
 318             (guchar
*)(char*)GNOME_PRINT_KEY_OUTPUT_FILENAME 
); 
 321         data
.SetFilename( wxConvFile
.cMB2WX( (const char*) res 
) ); 
 322         wxPrintf( "filename %s\n", data
.GetFilename() ); 
 327         data
.SetFilename( wxEmptyString 
); 
 331     if (gs_libGnomePrint
->gnome_print_config_get_boolean( m_config
, 
 332             (guchar
*)(char*)GNOME_PRINT_KEY_COLLATE
, &ret
)) 
 334         data
.SetCollate( ret 
); 
 342 bool wxGnomePrintNativeData::TransferFrom( const wxPrintData 
&data 
) 
 344     if (data
.GetOrientation() == wxLANDSCAPE
) 
 346         gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 347             (guchar
*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION
, 
 348             (guchar
*)(char*)"R90" ); 
 352         gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 353             (guchar
*)(char*)GNOME_PRINT_KEY_PAGE_ORIENTATION
, 
 354             (guchar
*)(char*)"R0" ); 
 357     if (data
.GetCollate()) 
 359         gs_libGnomePrint
->gnome_print_config_set_boolean( m_config
, 
 360             (guchar
*)(char*)GNOME_PRINT_KEY_COLLATE
, 
 365         gs_libGnomePrint
->gnome_print_config_set_boolean( m_config
, 
 366             (guchar
*)(char*)GNOME_PRINT_KEY_COLLATE
, 
 370     switch (data
.GetPaperId()) 
 372         case wxPAPER_A3
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 373                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 374                                     (guchar
*)(char*)"A3" ); 
 376         case wxPAPER_A5
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 377                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 378                                     (guchar
*)(char*)"A5" ); 
 380         case wxPAPER_B4
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 381                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 382                                     (guchar
*)(char*)"B4" ); 
 384         case wxPAPER_B5
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 385                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 386                                     (guchar
*)(char*)"B5" ); 
 388         case wxPAPER_LETTER
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 389                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 390                                     (guchar
*)(char*)"USLetter" ); 
 392         case wxPAPER_LEGAL
:     gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 393                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 394                                     (guchar
*)(char*)"USLegal" ); 
 396         case wxPAPER_EXECUTIVE
: gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 397                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 398                                     (guchar
*)(char*)"Executive" ); 
 400         case wxPAPER_ENV_C5
:    gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 401                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 402                                     (guchar
*)(char*)"C5" ); 
 404         case wxPAPER_ENV_C6
:    gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 405                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 406                                     (guchar
*)(char*)"C6" ); 
 408         case wxPAPER_NONE
:      break; 
 411         case wxPAPER_A4
:        gs_libGnomePrint
->gnome_print_config_set( m_config
, 
 412                                     (guchar
*)(char*)GNOME_PRINT_KEY_PAPER_SIZE
, 
 413                                     (guchar
*)(char*)"A4" ); 
 420 //---------------------------------------------------------------------------- 
 421 // wxGnomePrintFactory 
 422 //---------------------------------------------------------------------------- 
 424 wxPrinterBase
* wxGnomePrintFactory::CreatePrinter( wxPrintDialogData 
*data 
) 
 426     return new wxGnomePrinter( data 
); 
 429 wxPrintPreviewBase 
*wxGnomePrintFactory::CreatePrintPreview( wxPrintout 
*preview
, 
 430                                                     wxPrintout 
*printout
, 
 431                                                     wxPrintDialogData 
*data 
) 
 433     return new wxGnomePrintPreview( preview
, printout
, data 
); 
 436 wxPrintPreviewBase 
*wxGnomePrintFactory::CreatePrintPreview( wxPrintout 
*preview
, 
 437                                                     wxPrintout 
*printout
, 
 440     return new wxGnomePrintPreview( preview
, printout
, data 
); 
 443 wxPrintDialogBase 
*wxGnomePrintFactory::CreatePrintDialog( wxWindow 
*parent
, 
 444                                                   wxPrintDialogData 
*data 
) 
 446     return new wxGnomePrintDialog( parent
, data 
); 
 449 wxPrintDialogBase 
*wxGnomePrintFactory::CreatePrintDialog( wxWindow 
*parent
, 
 452     return new wxGnomePrintDialog( parent
, data 
); 
 455 wxPageSetupDialogBase 
*wxGnomePrintFactory::CreatePageSetupDialog( wxWindow 
*parent
, 
 456                                                           wxPageSetupDialogData 
* data 
) 
 458 //  The native page setup dialog is broken. It 
 459 //  miscalculates newly entered values for the 
 460 //  margins if you have not chose "points" but 
 461 //  e.g. centimerters. 
 462 //  This has been fixed in GNOME CVS (maybe 
 463 //  fixed in libgnomeprintui 2.8.1) 
 465     return new wxGnomePageSetupDialog( parent
, data 
); 
 468 bool wxGnomePrintFactory::HasPrintSetupDialog() 
 474 wxGnomePrintFactory::CreatePrintSetupDialog(wxWindow 
* WXUNUSED(parent
), 
 475                                             wxPrintData 
* WXUNUSED(data
)) 
 483 wxDCImpl
* wxGnomePrintFactory::CreatePrinterDCImpl( wxPrinterDC 
*owner
, const wxPrintData
& data 
) 
 485     return new wxGnomePrinterDCImpl( owner
, data 
); 
 490 wxDC
* wxGnomePrintFactory::CreatePrinterDC( const wxPrintData
& data 
) 
 492     return new wxGnomePrinterDC(data
); 
 497 bool wxGnomePrintFactory::HasOwnPrintToFile() 
 502 bool wxGnomePrintFactory::HasPrinterLine() 
 507 wxString 
wxGnomePrintFactory::CreatePrinterLine() 
 510     return wxEmptyString
; 
 513 bool wxGnomePrintFactory::HasStatusLine() 
 519 wxString 
wxGnomePrintFactory::CreateStatusLine() 
 522     return wxEmptyString
; 
 525 wxPrintNativeDataBase 
*wxGnomePrintFactory::CreatePrintNativeData() 
 527     return new wxGnomePrintNativeData
; 
 530 //---------------------------------------------------------------------------- 
 531 // wxGnomePrintSetupDialog 
 532 //---------------------------------------------------------------------------- 
 534 IMPLEMENT_CLASS(wxGnomePrintDialog
, wxPrintDialogBase
) 
 536 wxGnomePrintDialog::wxGnomePrintDialog( wxWindow 
*parent
, wxPrintDialogData 
*data 
) 
 537                     : wxPrintDialogBase(parent
, wxID_ANY
, _("Print"), 
 538                                wxPoint(0, 0), wxSize(600, 600), 
 539                                wxDEFAULT_DIALOG_STYLE 
| 
 543         m_printDialogData 
= *data
; 
 548 wxGnomePrintDialog::wxGnomePrintDialog( wxWindow 
*parent
, wxPrintData 
*data 
) 
 549                     : wxPrintDialogBase(parent
, wxID_ANY
, _("Print"), 
 550                                wxPoint(0, 0), wxSize(600, 600), 
 551                                wxDEFAULT_DIALOG_STYLE 
| 
 555         m_printDialogData 
= *data
; 
 560 void wxGnomePrintDialog::Init() 
 562     wxPrintData data 
= m_printDialogData
.GetPrintData(); 
 564     data
.ConvertToNative(); 
 566     wxGnomePrintNativeData 
*native 
= 
 567       (wxGnomePrintNativeData
*) data
.GetNativeData(); 
 569     m_widget 
= gs_libGnomePrint
->gnome_print_dialog_new( native
->GetPrintJob(), 
 571                                        GNOME_PRINT_DIALOG_RANGE
|GNOME_PRINT_DIALOG_COPIES 
); 
 574     if (m_printDialogData
.GetEnableSelection()) 
 575         flag 
|= GNOME_PRINT_RANGE_SELECTION
; 
 576     if (m_printDialogData
.GetEnablePageNumbers()) 
 577         flag 
|= GNOME_PRINT_RANGE_ALL
|GNOME_PRINT_RANGE_RANGE
; 
 579     gs_libGnomePrint
->gnome_print_dialog_construct_range_page( (GnomePrintDialog
*) m_widget
, 
 581                                              m_printDialogData
.GetMinPage(), 
 582                                              m_printDialogData
.GetMaxPage(), 
 587 wxGnomePrintDialog::~wxGnomePrintDialog() 
 592 int wxGnomePrintDialog::ShowModal() 
 594     int response 
= gtk_dialog_run (GTK_DIALOG (m_widget
)); 
 596     if (response 
== GNOME_PRINT_DIALOG_RESPONSE_CANCEL
) 
 598         gtk_widget_destroy(m_widget
); 
 604     m_printDialogData
.GetPrintData().ConvertFromNative(); 
 607     gboolean collate 
= false; 
 608     gs_libGnomePrint
->gnome_print_dialog_get_copies( (GnomePrintDialog
*) m_widget
, &copies
, &collate 
); 
 609     m_printDialogData
.SetNoCopies( copies 
); 
 610     m_printDialogData
.SetCollate( collate 
); 
 612     switch (gs_libGnomePrint
->gnome_print_dialog_get_range( (GnomePrintDialog
*) m_widget 
)) 
 614         case GNOME_PRINT_RANGE_SELECTION
: 
 615             m_printDialogData
.SetSelection( true ); 
 617         case GNOME_PRINT_RANGE_ALL
: 
 618             m_printDialogData
.SetAllPages( true ); 
 619             m_printDialogData
.SetFromPage( 0 ); 
 620             m_printDialogData
.SetToPage( 9999 ); 
 622         case GNOME_PRINT_RANGE_RANGE
: 
 625             gs_libGnomePrint
->gnome_print_dialog_get_range_page( (GnomePrintDialog
*) m_widget
, &start
, &end 
); 
 626             m_printDialogData
.SetFromPage( start 
); 
 627             m_printDialogData
.SetToPage( end 
); 
 631     gtk_widget_destroy(m_widget
); 
 634     if (response 
== GNOME_PRINT_DIALOG_RESPONSE_PREVIEW
) 
 640 wxDC 
*wxGnomePrintDialog::GetPrintDC() 
 646 bool wxGnomePrintDialog::Validate() 
 651 bool wxGnomePrintDialog::TransferDataToWindow() 
 656 bool wxGnomePrintDialog::TransferDataFromWindow() 
 661 //---------------------------------------------------------------------------- 
 662 // wxGnomePageSetupDialog 
 663 //---------------------------------------------------------------------------- 
 665 IMPLEMENT_CLASS(wxGnomePageSetupDialog
, wxPageSetupDialogBase
) 
 667 wxGnomePageSetupDialog::wxGnomePageSetupDialog(wxWindow 
* WXUNUSED(parent
), 
 668                                                wxPageSetupDialogData 
*data
) 
 671         m_pageDialogData 
= *data
; 
 673     m_pageDialogData
.GetPrintData().ConvertToNative(); 
 675     wxGnomePrintNativeData 
*native 
= 
 676       (wxGnomePrintNativeData
*) m_pageDialogData
.GetPrintData().GetNativeData(); 
 678     // This *was* required as the page setup dialog 
 679     // calculates wrong values otherwise. 
 681     gs_libGnomePrint
->gnome_print_config_set( native
->GetPrintConfig(), 
 682                             (const guchar
*) GNOME_PRINT_KEY_PREFERED_UNIT
, 
 683                             (const guchar
*) "Pts" ); 
 686     GnomePrintConfig 
*config 
= native
->GetPrintConfig(); 
 688     const GnomePrintUnit 
*mm_unit 
= gs_libGnomePrint
->gnome_print_unit_get_by_abbreviation( (const guchar
*) "mm" ); 
 690     double ml 
= (double) m_pageDialogData
.GetMarginTopLeft().x
; 
 691     double mt 
= (double) m_pageDialogData
.GetMarginTopLeft().y
; 
 692     double mr 
= (double) m_pageDialogData
.GetMarginBottomRight().x
; 
 693     double mb 
= (double) m_pageDialogData
.GetMarginBottomRight().y
; 
 695     gs_libGnomePrint
->gnome_print_config_set_length (config
, 
 696             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT
, ml
, mm_unit 
); 
 697     gs_libGnomePrint
->gnome_print_config_set_length (config
, 
 698             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT
, mr
, mm_unit 
); 
 699     gs_libGnomePrint
->gnome_print_config_set_length (config
, 
 700             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_TOP
, mt
, mm_unit 
); 
 701     gs_libGnomePrint
->gnome_print_config_set_length (config
, 
 702             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM
, mb
, mm_unit 
); 
 704     m_widget 
= gtk_dialog_new(); 
 706     gtk_window_set_title( GTK_WINDOW(m_widget
), wxGTK_CONV( _("Page setup") ) ); 
 708     GtkWidget 
*main 
= gs_libGnomePrint
->gnome_paper_selector_new_with_flags( native
->GetPrintConfig(), 
 709         GNOME_PAPER_SELECTOR_MARGINS
|GNOME_PAPER_SELECTOR_FEED_ORIENTATION 
); 
 710     gtk_container_set_border_width (GTK_CONTAINER (main
), 8); 
 711     gtk_widget_show (main
); 
 713     gtk_container_add( GTK_CONTAINER (GTK_DIALOG (m_widget
)->vbox
), main 
); 
 715     gtk_dialog_set_has_separator (GTK_DIALOG (m_widget
), TRUE
); 
 717     gtk_dialog_add_buttons (GTK_DIALOG (m_widget
), 
 718                             GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
, 
 719                             GTK_STOCK_OK
, GTK_RESPONSE_OK
, 
 722     gtk_dialog_set_default_response (GTK_DIALOG (m_widget
), 
 726 wxGnomePageSetupDialog::~wxGnomePageSetupDialog() 
 730 wxPageSetupDialogData
& wxGnomePageSetupDialog::GetPageSetupDialogData() 
 732     return m_pageDialogData
; 
 735 int wxGnomePageSetupDialog::ShowModal() 
 737     wxGnomePrintNativeData 
*native 
= 
 738       (wxGnomePrintNativeData
*) m_pageDialogData
.GetPrintData().GetNativeData(); 
 740     GnomePrintConfig 
*config 
= native
->GetPrintConfig(); 
 743     int ret 
= gtk_dialog_run( GTK_DIALOG(m_widget
) ); 
 745     if (ret 
== GTK_RESPONSE_OK
) 
 747         // Transfer data back to m_pageDialogData 
 748         m_pageDialogData
.GetPrintData().ConvertFromNative(); 
 750         // I don't know how querying the last parameter works 
 751         double ml
,mr
,mt
,mb
,pw
,ph
; 
 752         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 753             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT
, &ml
, NULL
); 
 754         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 755             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT
, &mr
, NULL
); 
 756         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 757             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_TOP
, &mt
, NULL
); 
 758         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 759             (const guchar
*) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM
, &mb
, NULL
); 
 760         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 761             (const guchar
*) GNOME_PRINT_KEY_PAPER_WIDTH
, &pw
, NULL
); 
 762         gs_libGnomePrint
->gnome_print_config_get_length (config
, 
 763             (const guchar
*) GNOME_PRINT_KEY_PAPER_HEIGHT
, &ph
, NULL
); 
 765         // This code converts correctly from what the user chose 
 766         // as the unit although I query Pts here 
 767         const GnomePrintUnit 
*mm_unit 
= gs_libGnomePrint
->gnome_print_unit_get_by_abbreviation( (const guchar
*) "mm" ); 
 768         const GnomePrintUnit 
*pts_unit 
= gs_libGnomePrint
->gnome_print_unit_get_by_abbreviation( (const guchar
*) "Pts" ); 
 769         gs_libGnomePrint
->gnome_print_convert_distance( &ml
, pts_unit
, mm_unit 
); 
 770         gs_libGnomePrint
->gnome_print_convert_distance( &mr
, pts_unit
, mm_unit 
); 
 771         gs_libGnomePrint
->gnome_print_convert_distance( &mt
, pts_unit
, mm_unit 
); 
 772         gs_libGnomePrint
->gnome_print_convert_distance( &mb
, pts_unit
, mm_unit 
); 
 773         gs_libGnomePrint
->gnome_print_convert_distance( &pw
, pts_unit
, mm_unit 
); 
 774         gs_libGnomePrint
->gnome_print_convert_distance( &ph
, pts_unit
, mm_unit 
); 
 776         m_pageDialogData
.SetMarginTopLeft( wxPoint( (int)(ml
+0.5), (int)(mt
+0.5)) ); 
 777         m_pageDialogData
.SetMarginBottomRight( wxPoint( (int)(mr
+0.5), (int)(mb
+0.5)) ); 
 779         m_pageDialogData
.SetPaperSize( wxSize( (int)(pw
+0.5), (int)(ph
+0.5) ) ); 
 788     gtk_widget_destroy( m_widget 
); 
 794 bool wxGnomePageSetupDialog::Validate() 
 799 bool wxGnomePageSetupDialog::TransferDataToWindow() 
 804 bool wxGnomePageSetupDialog::TransferDataFromWindow() 
 809 //---------------------------------------------------------------------------- 
 811 //---------------------------------------------------------------------------- 
 813 IMPLEMENT_CLASS(wxGnomePrinter
, wxPrinterBase
) 
 815 wxGnomePrinter::wxGnomePrinter( wxPrintDialogData 
*data 
) : 
 816     wxPrinterBase( data 
) 
 818     m_native_preview 
= false; 
 821 wxGnomePrinter::~wxGnomePrinter() 
 825 bool wxGnomePrinter::Print(wxWindow 
*parent
, wxPrintout 
*printout
, bool prompt 
) 
 829         sm_lastError 
= wxPRINTER_ERROR
; 
 833     wxPrintData printdata 
= GetPrintDialogData().GetPrintData(); 
 835     wxGnomePrintNativeData 
*native 
= 
 836         (wxGnomePrintNativeData
*) printdata
.GetNativeData(); 
 838     GnomePrintJob 
*job 
= gs_libGnomePrint
->gnome_print_job_new( native
->GetPrintConfig() ); 
 840     // The GnomePrintJob is temporarily stored in the 
 841     // native print data as the native print dialog 
 842     // needs to access it. 
 843     native
->SetPrintJob( job 
); 
 846     if (m_printDialogData
.GetMinPage() < 1) 
 847         m_printDialogData
.SetMinPage(1); 
 848     if (m_printDialogData
.GetMaxPage() < 1) 
 849         m_printDialogData
.SetMaxPage(9999); 
 853         dc 
= PrintDialog( parent 
); 
 856         dc 
= new wxPrinterDC( printdata 
);  // TODO: check that this works 
 858         dc 
= new wxGnomePrinterDC( printdata 
);  // TODO: check that this works 
 863         gs_libGnomePrint
->gnome_print_job_close( job 
); 
 864         g_object_unref (job
); 
 865         if (sm_lastError 
!= wxPRINTER_CANCELLED
) 
 866             sm_lastError 
= wxPRINTER_ERROR
; 
 870     printout
->SetPPIScreen(wxGetDisplayPPI()); 
 871     printout
->SetPPIPrinter( dc
->GetResolution(), 
 872                              dc
->GetResolution() ); 
 878     printout
->SetPageSizePixels((int)w
, (int)h
); 
 879     printout
->SetPaperRectPixels(wxRect(0, 0, w
, h
)); 
 881     dc
->GetSizeMM(&mw
, &mh
); 
 882     printout
->SetPageSizeMM((int)mw
, (int)mh
); 
 883     printout
->OnPreparePrinting(); 
 885     // Get some parameters from the printout, if defined 
 886     int fromPage
, toPage
; 
 887     int minPage
, maxPage
; 
 888     printout
->GetPageInfo(&minPage
, &maxPage
, &fromPage
, &toPage
); 
 892         gs_libGnomePrint
->gnome_print_job_close( job 
); 
 893         g_object_unref (job
); 
 894         sm_lastError 
= wxPRINTER_ERROR
; 
 898     printout
->OnBeginPrinting(); 
 900     int minPageNum 
= minPage
, maxPageNum 
= maxPage
; 
 902     if ( !m_printDialogData
.GetAllPages() ) 
 904         minPageNum 
= m_printDialogData
.GetFromPage(); 
 905         maxPageNum 
= m_printDialogData
.GetToPage(); 
 911           copyCount 
<= m_printDialogData
.GetNoCopies(); 
 914         if (!printout
->OnBeginDocument(minPageNum
, maxPageNum
)) 
 916             wxLogError(_("Could not start printing.")); 
 917             sm_lastError 
= wxPRINTER_ERROR
; 
 922         for ( pn 
= minPageNum
; 
 923               pn 
<= maxPageNum 
&& printout
->HasPage(pn
); 
 927             printout
->OnPrintPage(pn
); 
 931         printout
->OnEndDocument(); 
 932         printout
->OnEndPrinting(); 
 935     gs_libGnomePrint
->gnome_print_job_close( job 
); 
 936     if (m_native_preview
) 
 938         const wxCharBuffer 
title(wxGTK_CONV_SYS(_("Print preview"))); 
 939         GtkWidget 
*preview 
= gs_libGnomePrint
->gnome_print_job_preview_new
 
 942                                         (const guchar 
*)title
.data() 
 944         gtk_widget_show(preview
); 
 948         gs_libGnomePrint
->gnome_print_job_print( job 
); 
 951     g_object_unref (job
); 
 954     return (sm_lastError 
== wxPRINTER_NO_ERROR
); 
 957 wxDC
* wxGnomePrinter::PrintDialog( wxWindow 
*parent 
) 
 959     wxGnomePrintDialog 
dialog( parent
, &m_printDialogData 
); 
 960     int ret 
= dialog
.ShowModal(); 
 961     if (ret 
== wxID_CANCEL
) 
 963         sm_lastError 
= wxPRINTER_CANCELLED
; 
 967     m_native_preview 
= ret 
== wxID_PREVIEW
; 
 969     m_printDialogData 
= dialog
.GetPrintDialogData(); 
 971     return new wxPrinterDC( m_printDialogData
.GetPrintData() ); 
 973     return new wxGnomePrinterDC( m_printDialogData
.GetPrintData() ); 
 977 bool wxGnomePrinter::Setup(wxWindow 
* WXUNUSED(parent
)) 
 982 //----------------------------------------------------------------------------- 
 984 //----------------------------------------------------------------------------- 
 987 static const double RAD2DEG  
= 180.0 / M_PI
; 
 989 // we don't want to use only 72 dpi from GNOME print 
 990 static const int DPI 
= 600; 
 991 static const double PS2DEV 
= 600.0 / 72.0; 
 992 static const double DEV2PS 
= 72.0 / 600.0; 
 994 #define XLOG2DEV(x)     ((double)(LogicalToDeviceX(x)) * DEV2PS) 
 995 #define XLOG2DEVREL(x)  ((double)(LogicalToDeviceXRel(x)) * DEV2PS) 
 996 #define YLOG2DEV(x)     ((m_pageHeight - (double)LogicalToDeviceY(x)) * DEV2PS) 
 997 #define YLOG2DEVREL(x)  ((double)(LogicalToDeviceYRel(x)) * DEV2PS) 
1000 IMPLEMENT_ABSTRACT_CLASS(wxGnomePrinterDCImpl
, wxDCImpl
) 
1002 IMPLEMENT_ABSTRACT_CLASS(wxGnomePrinterDC
, wxDC
) 
1006 wxGnomePrinterDCImpl::wxGnomePrinterDCImpl( wxPrinterDC 
*owner
, const wxPrintData
& data 
) : 
1009 wxGnomePrinterDC::wxGnomePrinterDC( const wxPrintData
& data 
) 
1014     wxGnomePrintNativeData 
*native 
= 
1015         (wxGnomePrintNativeData
*) m_printData
.GetNativeData(); 
1017     m_job 
= native
->GetPrintJob(); 
1018     m_gpc 
= gs_libGnomePrint
->gnome_print_job_get_context (m_job
); 
1020     m_layout 
= gs_libGnomePrint
->gnome_print_pango_create_layout( m_gpc 
); 
1021     m_fontdesc 
= pango_font_description_from_string( "Sans 12" ); 
1028     // Query page size. This seems to omit the margins 
1030     gs_libGnomePrint
->gnome_print_job_get_page_size( native
->GetPrintJob(), &pw
, &ph 
); 
1032     m_pageHeight 
= ph 
* PS2DEV
; 
1035 wxGnomePrinterDCImpl::~wxGnomePrinterDCImpl() 
1039 bool wxGnomePrinterDCImpl::IsOk() const 
1045 wxGnomePrinterDCImpl::DoFloodFill(wxCoord 
WXUNUSED(x1
), 
1046                             wxCoord 
WXUNUSED(y1
), 
1047                             const wxColour
& WXUNUSED(col
), 
1048                             wxFloodFillStyle 
WXUNUSED(style
)) 
1054 wxGnomePrinterDCImpl::DoGetPixel(wxCoord 
WXUNUSED(x1
), 
1055                            wxCoord 
WXUNUSED(y1
), 
1056                            wxColour 
* WXUNUSED(col
)) const 
1061 void wxGnomePrinterDCImpl::DoDrawLine(wxCoord x1
, wxCoord y1
, wxCoord x2
, wxCoord y2
) 
1063     if  (m_pen
.GetStyle() == wxPENSTYLE_TRANSPARENT
) return; 
1067     gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, XLOG2DEV(x1
), YLOG2DEV(y1
) ); 
1068     gs_libGnomePrint
->gnome_print_lineto ( m_gpc
, XLOG2DEV(x2
), YLOG2DEV(y2
) ); 
1069     gs_libGnomePrint
->gnome_print_stroke ( m_gpc
); 
1071     CalcBoundingBox( x1
, y1 
); 
1072     CalcBoundingBox( x2
, y2 
); 
1075 void wxGnomePrinterDCImpl::DoCrossHair(wxCoord 
WXUNUSED(x
), wxCoord 
WXUNUSED(y
)) 
1079 void wxGnomePrinterDCImpl::DoDrawArc(wxCoord x1
,wxCoord y1
,wxCoord x2
,wxCoord y2
,wxCoord xc
,wxCoord yc
) 
1081     double dx 
= x1 
- xc
; 
1082     double dy 
= y1 
- yc
; 
1083     double radius 
= sqrt((double)(dx
*dx
+dy
*dy
)); 
1084     double alpha1
, alpha2
; 
1085     if (x1 
== x2 
&& y1 
== y2
) 
1090     else if ( wxIsNullDouble(radius
) ) 
1097         alpha1 
= (x1 
- xc 
== 0) ? 
1098             (y1 
- yc 
< 0) ? 90.0 : -90.0 : 
1099             -atan2(double(y1
-yc
), double(x1
-xc
)) * RAD2DEG
; 
1100         alpha2 
= (x2 
- xc 
== 0) ? 
1101             (y2 
- yc 
< 0) ? 90.0 : -90.0 : 
1102             -atan2(double(y2
-yc
), double(x2
-xc
)) * RAD2DEG
; 
1104         while (alpha1 
<= 0)   alpha1 
+= 360; 
1105         while (alpha2 
<= 0)   alpha2 
+= 360; // adjust angles to be between 
1106         while (alpha1 
> 360)  alpha1 
-= 360; // 0 and 360 degree 
1107         while (alpha2 
> 360)  alpha2 
-= 360; 
1110     if (m_brush
.GetStyle() != wxBRUSHSTYLE_TRANSPARENT
) 
1112         SetBrush( m_brush 
); 
1113         gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, XLOG2DEV(xc
), YLOG2DEV(yc
) ); 
1114         gs_libGnomePrint
->gnome_print_arcto( m_gpc
, XLOG2DEV(xc
), YLOG2DEV(yc
), XLOG2DEVREL((int)radius
), alpha1
, alpha2
, 0 ); 
1116         gs_libGnomePrint
->gnome_print_fill( m_gpc 
); 
1119     if (m_pen
.GetStyle() != wxPENSTYLE_TRANSPARENT
) 
1122         gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1123         gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, XLOG2DEV(xc
), YLOG2DEV(yc
) ); 
1124         gs_libGnomePrint
->gnome_print_arcto( m_gpc
, XLOG2DEV(xc
), YLOG2DEV(yc
), XLOG2DEVREL((int)radius
), alpha1
, alpha2
, 0 ); 
1125         gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1127         gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1130     CalcBoundingBox (x1
, y1
); 
1131     CalcBoundingBox (x2
, y2
); 
1132     CalcBoundingBox (xc
, yc
); 
1135 void wxGnomePrinterDCImpl::DoDrawEllipticArc(wxCoord x
,wxCoord y
,wxCoord w
,wxCoord h
,double sa
,double ea
) 
1140     double xx 
= XLOG2DEV(x
); 
1141     double yy 
= YLOG2DEV(y
); 
1143     gs_libGnomePrint
->gnome_print_gsave( m_gpc 
); 
1145     gs_libGnomePrint
->gnome_print_translate( m_gpc
, xx
, yy 
); 
1146     double scale 
= (double)YLOG2DEVREL(h
) / (double) XLOG2DEVREL(w
); 
1147     gs_libGnomePrint
->gnome_print_scale( m_gpc
, 1.0, scale 
); 
1152     if (m_brush
.GetStyle () != wxBRUSHSTYLE_TRANSPARENT
) 
1154         SetBrush( m_brush 
); 
1156         gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, xx
, yy 
); 
1157         gs_libGnomePrint
->gnome_print_arcto( m_gpc
, xx
, yy
, 
1158             XLOG2DEVREL(w
)/2, sa
, ea
, 0 ); 
1159         gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, xx
, yy 
); 
1161         gs_libGnomePrint
->gnome_print_fill( m_gpc 
); 
1164     if (m_pen
.GetStyle () != wxPENSTYLE_TRANSPARENT
) 
1168         gs_libGnomePrint
->gnome_print_arcto( m_gpc
, xx
, yy
, 
1169             XLOG2DEVREL(w
)/2, sa
, ea
, 0 ); 
1171         gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1174     gs_libGnomePrint
->gnome_print_grestore( m_gpc 
); 
1176     CalcBoundingBox( x
, y 
); 
1177     CalcBoundingBox( x
+w
, y
+h 
); 
1180 void wxGnomePrinterDCImpl::DoDrawPoint(wxCoord 
WXUNUSED(x
), wxCoord 
WXUNUSED(y
)) 
1184 void wxGnomePrinterDCImpl::DoDrawLines(int n
, wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
) 
1186     if (m_pen
.GetStyle() == wxPENSTYLE_TRANSPARENT
) return; 
1193     for ( i 
=0; i
<n 
; i
++ ) 
1194         CalcBoundingBox( points
[i
].x
+xoffset
, points
[i
].y
+yoffset
); 
1196     gs_libGnomePrint
->gnome_print_moveto ( m_gpc
, XLOG2DEV(points
[0].x
+xoffset
), YLOG2DEV(points
[0].y
+yoffset
) ); 
1198     for (i 
= 1; i 
< n
; i
++) 
1199         gs_libGnomePrint
->gnome_print_lineto ( m_gpc
, XLOG2DEV(points
[i
].x
+xoffset
), YLOG2DEV(points
[i
].y
+yoffset
) ); 
1201     gs_libGnomePrint
->gnome_print_stroke ( m_gpc
); 
1204 void wxGnomePrinterDCImpl::DoDrawPolygon(int n
, wxPoint points
[], 
1205                                    wxCoord xoffset
, wxCoord yoffset
, 
1206                                    wxPolygonFillMode 
WXUNUSED(fillStyle
)) 
1210     if (m_brush
.GetStyle () != wxBRUSHSTYLE_TRANSPARENT
) 
1212         SetBrush( m_brush 
); 
1214         int x 
= points
[0].x 
+ xoffset
; 
1215         int y 
= points
[0].y 
+ yoffset
; 
1216         CalcBoundingBox( x
, y 
); 
1217         gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1218         gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1220         for (i 
= 1; i 
< n
; i
++) 
1222             x 
= points
[i
].x 
+ xoffset
; 
1223             y 
= points
[i
].y 
+ yoffset
; 
1224             gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1225             CalcBoundingBox( x
, y 
); 
1227         gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1228         gs_libGnomePrint
->gnome_print_fill( m_gpc 
); 
1231     if (m_pen
.GetStyle () != wxPENSTYLE_TRANSPARENT
) 
1235         int x 
= points
[0].x 
+ xoffset
; 
1236         int y 
= points
[0].y 
+ yoffset
; 
1237         gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1238         gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1240         for (i 
= 1; i 
< n
; i
++) 
1242             x 
= points
[i
].x 
+ xoffset
; 
1243             y 
= points
[i
].y 
+ yoffset
; 
1244             gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1245             CalcBoundingBox( x
, y 
); 
1247         gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1248         gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1252 void wxGnomePrinterDCImpl::DoDrawPolyPolygon(int n
, int count
[], wxPoint points
[], wxCoord xoffset
, wxCoord yoffset
, wxPolygonFillMode fillStyle
) 
1255     wxDCImpl::DoDrawPolyPolygon( n
, count
, points
, xoffset
, yoffset
, fillStyle 
); 
1257     wxDC::DoDrawPolyPolygon( n
, count
, points
, xoffset
, yoffset
, fillStyle 
); 
1261 void wxGnomePrinterDCImpl::DoDrawRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
) 
1266     if (m_brush
.GetStyle () != wxBRUSHSTYLE_TRANSPARENT
) 
1268         SetBrush( m_brush 
); 
1270         gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1271         gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1272         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y
) ); 
1273         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y 
+ height
) ); 
1274         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y 
+ height
) ); 
1275         gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1276         gs_libGnomePrint
->gnome_print_fill( m_gpc 
); 
1278         CalcBoundingBox( x
, y 
); 
1279         CalcBoundingBox( x 
+ width
, y 
+ height 
); 
1282     if (m_pen
.GetStyle () != wxPENSTYLE_TRANSPARENT
) 
1286         gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1287         gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1288         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y
) ); 
1289         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y 
+ height
) ); 
1290         gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y 
+ height
) ); 
1291         gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1292         gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1294         CalcBoundingBox( x
, y 
); 
1295         CalcBoundingBox( x 
+ width
, y 
+ height 
); 
1299 void wxGnomePrinterDCImpl::DoDrawRoundedRectangle(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
, double radius
) 
1304     wxCoord rad 
= wxRound( radius 
); 
1306     if (m_brush
.GetStyle() != wxBRUSHSTYLE_TRANSPARENT
) 
1309         gs_libGnomePrint
->gnome_print_newpath(m_gpc
); 
1310         gs_libGnomePrint
->gnome_print_moveto(m_gpc
,XLOG2DEV(x 
+ rad
),YLOG2DEV(y
)); 
1311         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1312                                     XLOG2DEV(x 
+ rad
),YLOG2DEV(y
), 
1313                                     XLOG2DEV(x
),YLOG2DEV(y
), 
1314                                     XLOG2DEV(x
),YLOG2DEV(y 
+ rad
)); 
1315         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x
),YLOG2DEV(y 
+ height 
- rad
)); 
1316         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1317                                     XLOG2DEV(x
),YLOG2DEV(y 
+ height 
- rad
), 
1318                                     XLOG2DEV(x
),YLOG2DEV(y 
+ height
), 
1319                                     XLOG2DEV(x 
+ rad
),YLOG2DEV(y 
+ height
)); 
1320         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y 
+ height
)); 
1321         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1322                                     XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y 
+ height
), 
1323                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ height
), 
1324                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ height 
- rad
)); 
1325         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ rad
)); 
1326         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1327                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ rad
), 
1328                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y
), 
1329                                     XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y
)); 
1330         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ rad
),YLOG2DEV(y
)); 
1331         gs_libGnomePrint
->gnome_print_closepath(m_gpc
); 
1332         gs_libGnomePrint
->gnome_print_fill(m_gpc
); 
1334         CalcBoundingBox(x
,y
); 
1335         CalcBoundingBox(x
+width
,y
+height
); 
1338     if (m_pen
.GetStyle() != wxPENSTYLE_TRANSPARENT
) 
1341         gs_libGnomePrint
->gnome_print_newpath(m_gpc
); 
1342         gs_libGnomePrint
->gnome_print_moveto(m_gpc
,XLOG2DEV(x 
+ rad
),YLOG2DEV(y
)); 
1343         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1344                                     XLOG2DEV(x 
+ rad
),YLOG2DEV(y
), 
1345                                     XLOG2DEV(x
),YLOG2DEV(y
), 
1346                                     XLOG2DEV(x
),YLOG2DEV(y 
+ rad
)); 
1347         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x
),YLOG2DEV(y 
+ height 
- rad
)); 
1348         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1349                                     XLOG2DEV(x
),YLOG2DEV(y 
+ height 
- rad
), 
1350                                     XLOG2DEV(x
),YLOG2DEV(y 
+ height
), 
1351                                     XLOG2DEV(x 
+ rad
),YLOG2DEV(y 
+ height
)); 
1352         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y 
+ height
)); 
1353         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1354                                     XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y 
+ height
), 
1355                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ height
), 
1356                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ height 
- rad
)); 
1357         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ rad
)); 
1358         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1359                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y 
+ rad
), 
1360                                     XLOG2DEV(x 
+ width
),YLOG2DEV(y
), 
1361                                     XLOG2DEV(x 
+ width 
- rad
),YLOG2DEV(y
)); 
1362         gs_libGnomePrint
->gnome_print_lineto(m_gpc
,XLOG2DEV(x 
+ rad
),YLOG2DEV(y
)); 
1363         gs_libGnomePrint
->gnome_print_closepath(m_gpc
); 
1364         gs_libGnomePrint
->gnome_print_stroke(m_gpc
); 
1366         CalcBoundingBox(x
,y
); 
1367         CalcBoundingBox(x
+width
,y
+height
); 
1371 void wxGnomePrinterDCImpl::makeEllipticalPath(wxCoord x
, wxCoord y
, 
1372                                         wxCoord width
, wxCoord height
) 
1374     double r 
= 4 * (sqrt(2.) - 1) / 3; 
1375     double  halfW 
= 0.5 * width
, 
1376             halfH 
= 0.5 * height
, 
1379     wxCoord halfWI 
= (wxCoord
) halfW
, 
1380             halfHI 
= (wxCoord
) halfH
; 
1382     gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1384     // Approximate an ellipse using four cubic splines, clockwise from 0 deg */ 
1385     gs_libGnomePrint
->gnome_print_moveto( m_gpc
, 
1386                 XLOG2DEV(x 
+ width
), 
1387                 YLOG2DEV(y 
+ halfHI
) ); 
1388     gs_libGnomePrint
->gnome_print_curveto( m_gpc
, 
1389                 XLOG2DEV(x 
+ width
), 
1390                 YLOG2DEV(y 
+ (wxCoord
) rint (halfH 
+ halfHR
)), 
1391                 XLOG2DEV(x 
+ (wxCoord
) rint(halfW 
+ halfWR
)), 
1392                 YLOG2DEV(y 
+ height
), 
1393                 XLOG2DEV(x 
+ halfWI
), 
1394                 YLOG2DEV(y 
+ height
) ); 
1395     gs_libGnomePrint
->gnome_print_curveto( m_gpc
, 
1396                 XLOG2DEV(x 
+ (wxCoord
) rint(halfW 
- halfWR
)), 
1397                 YLOG2DEV(y 
+ height
), 
1399                 YLOG2DEV(y 
+ (wxCoord
) rint (halfH 
+ halfHR
)), 
1400                 XLOG2DEV(x
), YLOG2DEV(y
+halfHI
) ); 
1401     gs_libGnomePrint
->gnome_print_curveto( m_gpc
, 
1403                 YLOG2DEV(y 
+ (wxCoord
) rint (halfH 
- halfHR
)), 
1404                 XLOG2DEV(x 
+ (wxCoord
) rint (halfW 
- halfWR
)), 
1406                 XLOG2DEV(x
+halfWI
), YLOG2DEV(y
) ); 
1407     gs_libGnomePrint
->gnome_print_curveto( m_gpc
, 
1408                 XLOG2DEV(x 
+ (wxCoord
) rint(halfW 
+ halfWR
)), 
1410                 XLOG2DEV(x 
+ width
), 
1411                 YLOG2DEV(y 
+ (wxCoord
) rint(halfH 
- halfHR
)), 
1412                 XLOG2DEV(x 
+ width
), YLOG2DEV(y 
+ halfHI
) ); 
1414     gs_libGnomePrint
->gnome_print_closepath(m_gpc
); 
1417 void wxGnomePrinterDCImpl::DoDrawEllipse(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
) 
1422     if (m_brush
.GetStyle () != wxBRUSHSTYLE_TRANSPARENT
) 
1424         SetBrush( m_brush 
); 
1425         makeEllipticalPath( x
, y
, width
, height 
); 
1426         gs_libGnomePrint
->gnome_print_fill( m_gpc 
); 
1427         CalcBoundingBox( x
, y 
); 
1428         CalcBoundingBox( x 
+ width
, y 
+ height 
); 
1431     if (m_pen
.GetStyle () != wxPENSTYLE_TRANSPARENT
) 
1434         makeEllipticalPath( x
, y
, width
, height 
); 
1435         gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1436         CalcBoundingBox( x
, y 
); 
1437         CalcBoundingBox( x 
+ width
, y 
+ height 
); 
1442 void wxGnomePrinterDCImpl::DoDrawSpline(const wxPointList 
*points
) 
1446     double c
, d
, x1
, y1
, x2
, y2
, x3
, y3
; 
1449     wxPointList::compatibility_iterator node 
= points
->GetFirst(); 
1450     p 
= node
->GetData(); 
1454     node 
= node
->GetNext(); 
1455     p 
= node
->GetData(); 
1459          (double)(x1 
+ c
) / 2; 
1461          (double)(y1 
+ d
) / 2; 
1463     gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1464     gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV((wxCoord
)x1
), YLOG2DEV((wxCoord
)y1
) ); 
1465     gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV((wxCoord
)x3
), YLOG2DEV((wxCoord
)y3
) ); 
1467     CalcBoundingBox( (wxCoord
)x1
, (wxCoord
)y1 
); 
1468     CalcBoundingBox( (wxCoord
)x3
, (wxCoord
)y3 
); 
1470     node 
= node
->GetNext(); 
1473         q 
= node
->GetData(); 
1481         x3 
= (double)(x2 
+ c
) / 2; 
1482         y3 
= (double)(y2 
+ d
) / 2; 
1484         gs_libGnomePrint
->gnome_print_curveto(m_gpc
, 
1485             XLOG2DEV((wxCoord
)x1
), YLOG2DEV((wxCoord
)y1
), 
1486             XLOG2DEV((wxCoord
)x2
), YLOG2DEV((wxCoord
)y2
), 
1487             XLOG2DEV((wxCoord
)x3
), YLOG2DEV((wxCoord
)y3
) ); 
1489         CalcBoundingBox( (wxCoord
)x1
, (wxCoord
)y1 
); 
1490         CalcBoundingBox( (wxCoord
)x3
, (wxCoord
)y3 
); 
1492         node 
= node
->GetNext(); 
1495     gs_libGnomePrint
->gnome_print_lineto ( m_gpc
, XLOG2DEV((wxCoord
)c
), YLOG2DEV((wxCoord
)d
) ); 
1497     gs_libGnomePrint
->gnome_print_stroke( m_gpc 
); 
1499 #endif // wxUSE_SPLINES 
1502 wxGnomePrinterDCImpl::DoBlit(wxCoord xdest
, wxCoord ydest
, 
1503                       wxCoord width
, wxCoord height
, 
1505                       wxCoord xsrc
, wxCoord ysrc
, 
1506                       wxRasterOperationMode rop
, 
1507                       bool WXUNUSED(useMask
), 
1508                       wxCoord 
WXUNUSED(xsrcMask
), wxCoord 
WXUNUSED(ysrcMask
)) 
1510     wxCHECK_MSG( source
, false, wxT("invalid source dc") ); 
1512     // blit into a bitmap 
1513     wxBitmap 
bitmap( width
, height 
); 
1515     memDC
.SelectObject(bitmap
); 
1516     memDC
.Blit(0, 0, width
, height
, source
, xsrc
, ysrc
, rop
); /* TODO: Blit transparently? */ 
1517     memDC
.SelectObject(wxNullBitmap
); 
1519     // draw bitmap. scaling and positioning is done there 
1520     GetOwner()->DrawBitmap( bitmap
, xdest
, ydest 
); 
1525 void wxGnomePrinterDCImpl::DoDrawIcon( const wxIcon
& icon
, wxCoord x
, wxCoord y 
) 
1527     DoDrawBitmap( icon
, x
, y
, true ); 
1531 wxGnomePrinterDCImpl::DoDrawBitmap(const wxBitmap
& bitmap
, 
1532                              wxCoord x
, wxCoord y
, 
1533                              bool WXUNUSED(useMask
)) 
1535     if (!bitmap
.Ok()) return; 
1537     if (bitmap
.HasPixbuf()) 
1539         GdkPixbuf 
*pixbuf 
= bitmap
.GetPixbuf(); 
1540         guchar 
*raw_image 
= gdk_pixbuf_get_pixels( pixbuf 
); 
1541         bool has_alpha 
= gdk_pixbuf_get_has_alpha( pixbuf 
); 
1542         int rowstride 
= gdk_pixbuf_get_rowstride( pixbuf 
); 
1543         int height 
= gdk_pixbuf_get_height( pixbuf 
); 
1544         int width 
= gdk_pixbuf_get_width( pixbuf 
); 
1546         gs_libGnomePrint
->gnome_print_gsave( m_gpc 
); 
1548         matrix
[0] = XLOG2DEVREL(width
); 
1551         matrix
[3] = YLOG2DEVREL(height
); 
1552         matrix
[4] = XLOG2DEV(x
); 
1553         matrix
[5] = YLOG2DEV(y
+height
); 
1554         gs_libGnomePrint
->gnome_print_concat( m_gpc
, matrix 
); 
1555         gs_libGnomePrint
->gnome_print_moveto(  m_gpc
, 0, 0 ); 
1557             gs_libGnomePrint
->gnome_print_rgbaimage( m_gpc
, (guchar 
*)raw_image
, width
, height
, rowstride 
); 
1559             gs_libGnomePrint
->gnome_print_rgbimage( m_gpc
, (guchar 
*)raw_image
, width
, height
, rowstride 
); 
1560         gs_libGnomePrint
->gnome_print_grestore( m_gpc 
); 
1564         wxImage image 
= bitmap
.ConvertToImage(); 
1566         if (!image
.Ok()) return; 
1568         gs_libGnomePrint
->gnome_print_gsave( m_gpc 
); 
1570         matrix
[0] = XLOG2DEVREL(image
.GetWidth()); 
1573         matrix
[3] = YLOG2DEVREL(image
.GetHeight()); 
1574         matrix
[4] = XLOG2DEV(x
); 
1575         matrix
[5] = YLOG2DEV(y
+image
.GetHeight()); 
1576         gs_libGnomePrint
->gnome_print_concat( m_gpc
, matrix 
); 
1577         gs_libGnomePrint
->gnome_print_moveto(  m_gpc
, 0, 0 ); 
1578         gs_libGnomePrint
->gnome_print_rgbimage( m_gpc
, (guchar
*) image
.GetData(), image
.GetWidth(), image
.GetHeight(), image
.GetWidth()*3 ); 
1579         gs_libGnomePrint
->gnome_print_grestore( m_gpc 
); 
1583 void wxGnomePrinterDCImpl::DoDrawText(const wxString
& text
, wxCoord x
, wxCoord y 
) 
1585     DoDrawRotatedText( text
, x
, y
, 0.0 ); 
1588 void wxGnomePrinterDCImpl::DoDrawRotatedText(const wxString
& text
, wxCoord x
, wxCoord y
, double angle
) 
1590     double xx 
= XLOG2DEV(x
); 
1591     double yy 
= YLOG2DEV(y
); 
1593     bool underlined 
= m_font
.Ok() && m_font
.GetUnderlined(); 
1595     const wxScopedCharBuffer 
data(text
.utf8_str()); 
1597     size_t datalen 
= strlen(data
); 
1598     pango_layout_set_text( m_layout
, data
, datalen
); 
1602         PangoAttrList 
*attrs 
= pango_attr_list_new(); 
1603         PangoAttribute 
*a 
= pango_attr_underline_new(PANGO_UNDERLINE_SINGLE
); 
1605         a
->end_index 
= datalen
; 
1606         pango_attr_list_insert(attrs
, a
); 
1607         pango_layout_set_attributes(m_layout
, attrs
); 
1608         pango_attr_list_unref(attrs
); 
1611     if (m_textForegroundColour
.Ok()) 
1613         unsigned char red 
= m_textForegroundColour
.Red(); 
1614         unsigned char blue 
= m_textForegroundColour
.Blue(); 
1615         unsigned char green 
= m_textForegroundColour
.Green(); 
1617         if (!(red 
== m_currentRed 
&& green 
== m_currentGreen 
&& blue 
== m_currentBlue
)) 
1619             double redPS 
= (double)(red
) / 255.0; 
1620             double bluePS 
= (double)(blue
) / 255.0; 
1621             double greenPS 
= (double)(green
) / 255.0; 
1623             gs_libGnomePrint
->gnome_print_setrgbcolor( m_gpc
, redPS
, greenPS
, bluePS 
); 
1626             m_currentBlue 
= blue
; 
1627             m_currentGreen 
= green
; 
1632         if ( m_backgroundMode 
== wxSOLID 
) 
1634             gdk_gc_set_foreground(m_textGC
, m_textBackgroundColour
.GetColor()); 
1635             gdk_draw_rectangle(m_window
, m_textGC
, TRUE
, xx
, yy
, w
, h
); 
1636             gdk_gc_set_foreground(m_textGC
, m_textForegroundColour
.GetColor()); 
1641     gs_libGnomePrint
->gnome_print_moveto (m_gpc
, xx
, yy
); 
1643     gs_libGnomePrint
->gnome_print_gsave( m_gpc 
); 
1645     gs_libGnomePrint
->gnome_print_scale( m_gpc
, m_scaleX 
* DEV2PS
, m_scaleY 
* DEV2PS 
); 
1647     if (fabs(angle
) > 0.00001) 
1648         gs_libGnomePrint
->gnome_print_rotate( m_gpc
, angle 
); 
1650     gs_libGnomePrint
->gnome_print_pango_layout( m_gpc
, m_layout 
); 
1653     pango_layout_get_pixel_size( m_layout
, &w
, &h 
); 
1655     gs_libGnomePrint
->gnome_print_grestore( m_gpc 
); 
1659         // undo underline attributes setting: 
1660         pango_layout_set_attributes(m_layout
, NULL
); 
1663     CalcBoundingBox(x
, y
); 
1664     CalcBoundingBox(x 
+ w
, y 
+ h
); 
1667 void wxGnomePrinterDCImpl::Clear() 
1671 void wxGnomePrinterDCImpl::SetFont( const wxFont
& font 
) 
1678             pango_font_description_free( m_fontdesc 
); 
1680         m_fontdesc 
= pango_font_description_copy( m_font
.GetNativeFontInfo()->description 
); 
1682         float size 
= pango_font_description_get_size( m_fontdesc 
); 
1683         size 
= size 
* GetFontPointSizeAdjustment(72.0); 
1684         pango_font_description_set_size( m_fontdesc
, (gint
)size 
); 
1686         pango_layout_set_font_description( m_layout
, m_fontdesc 
); 
1690 void wxGnomePrinterDCImpl::SetPen( const wxPen
& pen 
) 
1692     if (!pen
.Ok()) return; 
1698     if (m_pen
.GetWidth() <= 0) 
1701         width 
= (double) m_pen
.GetWidth(); 
1703     gs_libGnomePrint
->gnome_print_setlinewidth( m_gpc
, width 
* DEV2PS 
* m_scaleX 
); 
1705     static const double dotted
[] =  {2.0, 5.0}; 
1706     static const double short_dashed
[] = {4.0, 4.0}; 
1707     static const double wxCoord_dashed
[] = {4.0, 8.0}; 
1708     static const double dotted_dashed
[] = {6.0, 6.0, 2.0, 6.0}; 
1710     switch (m_pen
.GetStyle()) 
1712         case wxPENSTYLE_DOT
:        gs_libGnomePrint
->gnome_print_setdash( m_gpc
, 2, dotted
, 0 ); break; 
1713         case wxPENSTYLE_SHORT_DASH
: gs_libGnomePrint
->gnome_print_setdash( m_gpc
, 2, short_dashed
, 0 ); break; 
1714         case wxPENSTYLE_LONG_DASH
:  gs_libGnomePrint
->gnome_print_setdash( m_gpc
, 2, wxCoord_dashed
, 0 ); break; 
1715         case wxPENSTYLE_DOT_DASH
:   gs_libGnomePrint
->gnome_print_setdash( m_gpc
, 4, dotted_dashed
, 0 );  break; 
1716         case wxPENSTYLE_USER_DASH
: 
1718             // It may be noted that libgnomeprint between at least 
1719             // versions 2.8.0 and 2.12.1 makes a copy of the dashes 
1720             // and then leak the memory since it doesn't set the 
1721             // internal flag "privatedash" to 0. 
1723             int num 
= m_pen
.GetDashes (&wx_dashes
); 
1724             gdouble 
*g_dashes 
= g_new( gdouble
, num 
); 
1726             for (i 
= 0; i 
< num
; ++i
) 
1727                 g_dashes
[i
] = (gdouble
) wx_dashes
[i
]; 
1728             gs_libGnomePrint 
-> gnome_print_setdash( m_gpc
, num
, g_dashes
, 0); 
1732         case wxPENSTYLE_SOLID
: 
1733         case wxPENSTYLE_TRANSPARENT
: 
1734         default:              gs_libGnomePrint
->gnome_print_setdash( m_gpc
, 0, NULL
, 0 );   break; 
1738     unsigned char red 
= m_pen
.GetColour().Red(); 
1739     unsigned char blue 
= m_pen
.GetColour().Blue(); 
1740     unsigned char green 
= m_pen
.GetColour().Green(); 
1742     if (!(red 
== m_currentRed 
&& green 
== m_currentGreen 
&& blue 
== m_currentBlue
)) 
1744         double redPS 
= (double)(red
) / 255.0; 
1745         double bluePS 
= (double)(blue
) / 255.0; 
1746         double greenPS 
= (double)(green
) / 255.0; 
1748         gs_libGnomePrint
->gnome_print_setrgbcolor( m_gpc
, redPS
, greenPS
, bluePS 
); 
1751         m_currentBlue 
= blue
; 
1752         m_currentGreen 
= green
; 
1756 void wxGnomePrinterDCImpl::SetBrush( const wxBrush
& brush 
) 
1758     if (!brush
.Ok()) return; 
1763     unsigned char red 
= m_brush
.GetColour().Red(); 
1764     unsigned char blue 
= m_brush
.GetColour().Blue(); 
1765     unsigned char green 
= m_brush
.GetColour().Green(); 
1769         // Anything not white is black 
1770         if (! (red 
== (unsigned char) 255 && 
1771                blue 
== (unsigned char) 255 && 
1772                green 
== (unsigned char) 255) ) 
1774             red 
= (unsigned char) 0; 
1775             green 
= (unsigned char) 0; 
1776             blue 
= (unsigned char) 0; 
1781     if (!(red 
== m_currentRed 
&& green 
== m_currentGreen 
&& blue 
== m_currentBlue
)) 
1783         double redPS 
= (double)(red
) / 255.0; 
1784         double bluePS 
= (double)(blue
) / 255.0; 
1785         double greenPS 
= (double)(green
) / 255.0; 
1787         gs_libGnomePrint
->gnome_print_setrgbcolor( m_gpc
, redPS
, greenPS
, bluePS 
); 
1790         m_currentBlue 
= blue
; 
1791         m_currentGreen 
= green
; 
1795 void wxGnomePrinterDCImpl::SetLogicalFunction(wxRasterOperationMode 
WXUNUSED(function
)) 
1799 void wxGnomePrinterDCImpl::SetBackground(const wxBrush
& WXUNUSED(brush
)) 
1803 void wxGnomePrinterDCImpl::DoSetClippingRegion(wxCoord x
, wxCoord y
, wxCoord width
, wxCoord height
) 
1806     m_clipping 
= TRUE
;    // TODO move somewhere else 
1809     m_clipX2 
= x 
+ width
; 
1810     m_clipY2 
= y 
+ height
; 
1812     wxDC::DoSetClippingRegion( x
, y
, width
, height 
); 
1815     gs_libGnomePrint
->gnome_print_gsave( m_gpc 
); 
1817     gs_libGnomePrint
->gnome_print_newpath( m_gpc 
); 
1818     gs_libGnomePrint
->gnome_print_moveto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y
) ); 
1819     gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y
) ); 
1820     gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x 
+ width
), YLOG2DEV(y 
+ height
) ); 
1821     gs_libGnomePrint
->gnome_print_lineto( m_gpc
, XLOG2DEV(x
), YLOG2DEV(y 
+ height
) ); 
1822     gs_libGnomePrint
->gnome_print_closepath( m_gpc 
); 
1823     gs_libGnomePrint
->gnome_print_clip( m_gpc 
); 
1826 void wxGnomePrinterDCImpl::DestroyClippingRegion() 
1829     wxDCImpl::DestroyClippingRegion(); 
1831     wxDC::DestroyClippingRegion(); 
1834     gs_libGnomePrint
->gnome_print_grestore( m_gpc 
); 
1837     // not needed, we set the values in each 
1838     // drawing method anyways 
1840     SetBrush( m_brush 
); 
1845 bool wxGnomePrinterDCImpl::StartDoc(const wxString
& WXUNUSED(message
)) 
1850 void wxGnomePrinterDCImpl::EndDoc() 
1852     gs_libGnomePrint
->gnome_print_end_doc( m_gpc 
); 
1855 void wxGnomePrinterDCImpl::StartPage() 
1857     gs_libGnomePrint
->gnome_print_beginpage( m_gpc
, (const guchar
*) "page" ); 
1860 void wxGnomePrinterDCImpl::EndPage() 
1862     gs_libGnomePrint
->gnome_print_showpage( m_gpc 
); 
1865 wxCoord 
wxGnomePrinterDCImpl::GetCharHeight() const 
1867     pango_layout_set_text( m_layout
, "H", 1 ); 
1870     pango_layout_get_pixel_size( m_layout
, &w
, &h 
); 
1875 wxCoord 
wxGnomePrinterDCImpl::GetCharWidth() const 
1877     pango_layout_set_text( m_layout
, "H", 1 ); 
1880     pango_layout_get_pixel_size( m_layout
, &w
, &h 
); 
1885 void wxGnomePrinterDCImpl::DoGetTextExtent(const wxString
& string
, wxCoord 
*width
, wxCoord 
*height
, 
1887                      wxCoord 
*externalLeading
, 
1888                      const wxFont 
*theFont 
) const 
1896     if ( externalLeading 
) 
1897         *externalLeading 
= 0; 
1904     // Set layout's text 
1906     const wxScopedCharBuffer 
dataUTF8(string
.utf8_str()); 
1911         // scale the font and apply it 
1912         PangoFontDescription 
*desc 
= theFont
->GetNativeFontInfo()->description
; 
1913         oldSize 
= pango_font_description_get_size(desc
); 
1914         float size 
= oldSize 
* GetFontPointSizeAdjustment(72.0); 
1915         pango_font_description_set_size(desc
, (gint
)size
); 
1917         pango_layout_set_font_description(m_layout
, desc
); 
1920     pango_layout_set_text( m_layout
, dataUTF8
, strlen(dataUTF8
) ); 
1923     pango_layout_get_pixel_size( m_layout
, width
, &h 
); 
1929         PangoLayoutIter 
*iter 
= pango_layout_get_iter(m_layout
); 
1930         int baseline 
= pango_layout_iter_get_baseline(iter
); 
1931         pango_layout_iter_free(iter
); 
1932         *descent 
= h 
- PANGO_PIXELS(baseline
); 
1937         // restore font and reset font's size back 
1938         pango_layout_set_font_description(m_layout
, m_fontdesc
); 
1940         PangoFontDescription 
*desc 
= theFont
->GetNativeFontInfo()->description
; 
1941         pango_font_description_set_size(desc
, oldSize
); 
1945 void wxGnomePrinterDCImpl::DoGetSize(int* width
, int* height
) const 
1947     wxGnomePrintNativeData 
*native 
= 
1948       (wxGnomePrintNativeData
*) m_printData
.GetNativeData(); 
1950     // Query page size. This seems to omit the margins 
1952     gs_libGnomePrint
->gnome_print_job_get_page_size( native
->GetPrintJob(), &pw
, &ph 
); 
1955         *width 
= wxRound( pw 
* PS2DEV 
); 
1958         *height 
= wxRound( ph 
* PS2DEV 
); 
1961 void wxGnomePrinterDCImpl::DoGetSizeMM(int *width
, int *height
) const 
1963     wxGnomePrintNativeData 
*native 
= 
1964       (wxGnomePrintNativeData
*) m_printData
.GetNativeData(); 
1966     // This code assumes values in Pts. 
1969     gs_libGnomePrint
->gnome_print_job_get_page_size( native
->GetPrintJob(), &pw
, &ph 
); 
1973     const GnomePrintUnit 
*mm_unit 
= gs_libGnomePrint
->gnome_print_unit_get_by_abbreviation( (const guchar
*) "mm" ); 
1974     const GnomePrintUnit 
*pts_unit 
= gs_libGnomePrint
->gnome_print_unit_get_by_abbreviation( (const guchar
*) "Pts" ); 
1975     gs_libGnomePrint
->gnome_print_convert_distance( &pw
, pts_unit
, mm_unit 
); 
1976     gs_libGnomePrint
->gnome_print_convert_distance( &ph
, pts_unit
, mm_unit 
); 
1979         *width 
= (int) (pw 
+ 0.5); 
1981         *height 
= (int) (ph 
+ 0.5); 
1984 wxSize 
wxGnomePrinterDCImpl::GetPPI() const 
1986     return wxSize(DPI
,DPI
); 
1989 void wxGnomePrinterDCImpl::SetPrintData(const wxPrintData
& data
) 
1994     if (m_printData
.GetOrientation() == wxPORTRAIT
) 
1995         GetOwner()->GetSize( NULL
, &height 
); 
1997         GetOwner()->GetSize( &height
, NULL 
); 
1998     m_deviceLocalOriginY 
= height
; 
2001 // overridden for wxPrinterDC Impl 
2003 int wxGnomePrinterDCImpl::GetResolution() const 
2008 wxRect 
wxGnomePrinterDCImpl::GetPaperRect() const 
2010     // GNOME print doesn't support printer margins 
2013     DoGetSize( &w
, &h 
); 
2014     return wxRect( 0, 0, w
, h 
); 
2017 // ---------------------------------------------------------------------------- 
2018 // wxGnomePrintModule 
2019 // ---------------------------------------------------------------------------- 
2021 bool wxGnomePrintModule::OnInit() 
2023     gs_libGnomePrint 
= new wxGnomePrintLibrary
; 
2024     if (gs_libGnomePrint
->IsOk()) 
2025         wxPrintFactory::SetPrintFactory( new wxGnomePrintFactory 
); 
2029 void wxGnomePrintModule::OnExit() 
2031     wxDELETE(gs_libGnomePrint
); 
2034 IMPLEMENT_DYNAMIC_CLASS(wxGnomePrintModule
, wxModule
) 
2036 // ---------------------------------------------------------------------------- 
2038 // ---------------------------------------------------------------------------- 
2040 IMPLEMENT_CLASS(wxGnomePrintPreview
, wxPrintPreviewBase
) 
2042 void wxGnomePrintPreview::Init(wxPrintout 
* WXUNUSED(printout
), 
2043                                     wxPrintout 
* WXUNUSED(printoutForPrinting
)) 
2048 wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout 
*printout
, 
2049                                                    wxPrintout 
*printoutForPrinting
, 
2050                                                    wxPrintDialogData 
*data
) 
2051                         : wxPrintPreviewBase(printout
, printoutForPrinting
, data
) 
2053     Init(printout
, printoutForPrinting
); 
2056 wxGnomePrintPreview::wxGnomePrintPreview(wxPrintout 
*printout
, 
2057                                                    wxPrintout 
*printoutForPrinting
, 
2059                         : wxPrintPreviewBase(printout
, printoutForPrinting
, data
) 
2061     Init(printout
, printoutForPrinting
); 
2064 wxGnomePrintPreview::~wxGnomePrintPreview() 
2068 bool wxGnomePrintPreview::Print(bool interactive
) 
2070     if (!m_printPrintout
) 
2073     wxPrinter 
printer(& m_printDialogData
); 
2074     return printer
.Print(m_previewFrame
, m_printPrintout
, interactive
); 
2077 void wxGnomePrintPreview::DetermineScaling() 
2079     wxPaperSize paperType 
= m_printDialogData
.GetPrintData().GetPaperId(); 
2080     if (paperType 
== wxPAPER_NONE
) 
2081         paperType 
= wxPAPER_NONE
; 
2083     wxPrintPaperType 
*paper 
= wxThePrintPaperDatabase
->FindPaperType(paperType
); 
2085         paper 
= wxThePrintPaperDatabase
->FindPaperType(wxPAPER_A4
); 
2089         m_previewPrintout
->SetPPIScreen(wxGetDisplayPPI()); 
2091         int resolution 
= DPI
; 
2092         m_previewPrintout
->SetPPIPrinter( resolution
, resolution 
); 
2094         wxSize 
sizeDevUnits(paper
->GetSizeDeviceUnits()); 
2096         // TODO: get better resolution information from wxGnomePrinterDCImpl, if possible. 
2098         sizeDevUnits
.x 
= (wxCoord
)((float)sizeDevUnits
.x 
* resolution 
/ 72.0); 
2099         sizeDevUnits
.y 
= (wxCoord
)((float)sizeDevUnits
.y 
* resolution 
/ 72.0); 
2100         wxSize 
sizeTenthsMM(paper
->GetSize()); 
2101         wxSize 
sizeMM(sizeTenthsMM
.x 
/ 10, sizeTenthsMM
.y 
/ 10); 
2103         // If in landscape mode, we need to swap the width and height. 
2104         if ( m_printDialogData
.GetPrintData().GetOrientation() == wxLANDSCAPE 
) 
2106             m_pageWidth 
= sizeDevUnits
.y
; 
2107             m_pageHeight 
= sizeDevUnits
.x
; 
2108             m_previewPrintout
->SetPageSizeMM(sizeMM
.y
, sizeMM
.x
); 
2112             m_pageWidth 
= sizeDevUnits
.x
; 
2113             m_pageHeight 
= sizeDevUnits
.y
; 
2114             m_previewPrintout
->SetPageSizeMM(sizeMM
.x
, sizeMM
.y
); 
2116         m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
); 
2117         m_previewPrintout
->SetPaperRectPixels(wxRect(0, 0, m_pageWidth
, m_pageHeight
)); 
2119         // At 100%, the page should look about page-size on the screen. 
2120         m_previewScaleX 
= (double)0.8 * 72.0 / (double)resolution
; 
2121         m_previewScaleY 
= m_previewScaleX
; 
2126     // wxUSE_LIBGNOMEPRINT