1 // Copyright (C) 2015  Phil Rosenberg
2 // Copyright (C) 2005  Werner Smekal
3 //
4 // This file is part of PLplot.
5 //
6 // PLplot is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU Library General Public License as published
8 // by the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // PLplot is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU Library General Public License for more details.
15 //
16 // You should have received a copy of the GNU Library General Public License
17 // along with PLplot; if not, write to the Free Software
18 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 //
20 
21 // wxwidgets headers
22 #include "wx/wx.h"
23 
24 // plplot headers
25 #include "plplotP.h"
26 
27 #include "wxPLplotstream.h"
28 
29 //! Constructor of wxPLplotstream class which is inherited from plstream.
30 //  Here we set the driver (wxwidgets :), and tell plplot in which dc to
31 //  plot to and the size of the canvas. We also check and set several
32 //  device style options.
33 //
wxPLplotstream(wxDC * dc,int width,int height,int style)34 wxPLplotstream::wxPLplotstream( wxDC *dc, int width, int height, int style ) : plstream()
35 {
36     m_created = false;
37     Create( dc, width, height, style );
38 }
39 
40 
wxPLplotstream()41 wxPLplotstream::wxPLplotstream() : plstream()
42 {
43     m_created = false;
44 }
45 
46 //! Called from the constructor or can be called by the user if the default constructor is used
47 //  We set the driver to be wxwidgets, set the page size, set the driver options and initialize
48 //  the plot.
Create(wxDC * dc,int width,int height,int style)49 void wxPLplotstream::Create( wxDC *dc, int width, int height, int style )
50 {
51     if ( m_created )
52     {
53         plabort( "wxPLplotstream::Create - Stream already created" );
54         return;
55     }
56     const size_t bufferSize = 256;
57 
58     m_width  = width;
59     m_height = height;
60     m_style  = style;
61 
62     sdev( "wxwidgets" );
63     spage( 90.0, 90.0, m_width, m_height, 0, 0 );
64 
65     char drvopt[bufferSize], buffer[bufferSize];
66     drvopt[0] = '\0';
67 
68     sprintf( buffer, "hrshsym=%d,text=%d",
69         m_style & wxPLPLOT_USE_HERSHEY_SYMBOLS ? 1 : 0,
70         m_style & wxPLPLOT_DRAW_TEXT ? 1 : 0 );
71     strncat( drvopt, buffer, bufferSize - strlen( drvopt ) );
72 
73     setopt( "-drvopt", drvopt );
74 
75     sdevdata( (void *) dc );
76 
77     init();
78 }
79 
80 //! Set the DC to be used by the stream. This will initiate a replot, unless
81 //  the device is NULL
SetDC(wxDC * dc)82 void wxPLplotstream::SetDC( wxDC *dc )
83 {
84     set_stream();
85     cmd( PLESC_DEVINIT, (void *) dc );
86 }
87 
88 //! Destructor, although we have no resources to free
~wxPLplotstream()89 wxPLplotstream::~wxPLplotstream()
90 {
91 }
92 
93 
94 //! This is the overloaded set_stream() function, where we could have some
95 //  code processed before every call of a plplot functions, since set_stream()
96 //  is called before every plplot function. Not used in the moment.
97 //
set_stream()98 void wxPLplotstream::set_stream()
99 {
100     plstream::set_stream();
101 }
102 
103 
104 //! Call this method if the size of the dc changed (because of resizing)
105 //  to set the new size. You need to call RenewPlot afterwards.
106 //
SetSize(int width,int height)107 void wxPLplotstream::SetSize( int width, int height )
108 {
109     wxSize size( width, height );
110     cmd( PLESC_RESIZE, (void *) &size );
111     m_width  = width;
112     m_height = height;
113 }
114 
115 
116 //! Replot everything.
117 //
RenewPlot()118 void wxPLplotstream::RenewPlot()
119 {
120     replot();
121 }
122 
ImportBuffer(void * buffer,size_t size)123 void wxPLplotstream::ImportBuffer( void *buffer, size_t size )
124 {
125     plbuffer buf;
126     buf.buffer = buffer;
127     buf.size   = size;
128     cmd( PLESC_IMPORT_BUFFER, &buf );
129     RenewPlot();
130 }
131 
AppendBuffer(void * buffer,size_t size)132 void wxPLplotstream::AppendBuffer( void *buffer, size_t size )
133 {
134     plbuffer buf;
135     buf.buffer = buffer;
136     buf.size   = size;
137     cmd( PLESC_APPEND_BUFFER, &buf );
138     cmd( PLESC_FLUSH_REMAINING_BUFFER, NULL );
139 }
140 
SetFixedAspectRatio(bool fixed)141 void wxPLplotstream::SetFixedAspectRatio( bool fixed )
142 {
143     PLBOOL f = fixed ? 1 : 0;
144     cmd( PLESC_FIXASPECT, &f );
145 }
146 
IsValid()147 bool wxPLplotstream::IsValid()
148 {
149     return m_created;
150 }