00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "a2dprec.h"
00012
00013 #ifdef __BORLANDC__
00014 #pragma hdrstop
00015 #endif
00016
00017 #ifndef WX_PRECOMP
00018 #include "wx/wx.h"
00019 #endif
00020
00021 #include <wx/wfstream.h>
00022 #include "wx/editor/sttool.h"
00023
00024 #include "wx/canextobj/rendimg.h"
00025
00026 #include "wx/canvas/canobj.h"
00027 #include "wx/canvas/candoc.h"
00028 #include "wx/canvas/drawer.h"
00029 #include "wx/artbase/dcdrawer.h"
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 IMPLEMENT_CLASS(a2dRenderImage,a2dCanvasObject)
00040
00041 a2dRenderImage::a2dRenderImage( a2dCanvasDocument* root, a2dCanvasObject* top, double xc, double yc, double w, double h )
00042 {
00043 int iw = 100;
00044 int ih = 100;
00045 if ( w > 1 )
00046 iw = Round( w );
00047 if ( h > 1 )
00048 ih = Round( h );
00049
00050 m_drawer = new a2dCanvasView( iw, ih );
00051 a2dDrawer2D* drawer2d = new a2dMemDcDrawer( iw, ih );
00052 m_drawer->SetDrawer2D( drawer2d );
00053
00054 m_drawer->SetDocument( root );
00055 m_drawer->SetShowObject( top );
00056
00057 m_scaleonresize = false;
00058
00059 m_lworld.Translate( xc, yc );
00060
00061 m_width = w;
00062 m_height = h;
00063
00064 m_is_cached = false;
00065 m_b_is_cached = false;
00066 }
00067
00068 a2dRenderImage::~a2dRenderImage()
00069 {
00070 m_drawer->SetClosed();
00071 }
00072
00073 a2dRenderImage::a2dRenderImage( const a2dRenderImage &other, CloneOptions options )
00074 :a2dCanvasObject( other, options)
00075 {
00076 m_drawer = new a2dCanvasView( *(other.m_drawer) );
00077 a2dDrawer2D* drawer2d = new a2dMemDcDrawer( *((a2dMemDcDrawer*) other.m_drawer->GetDrawer2D()->GetHeight()) );
00078 m_drawer->SetDrawer2D( drawer2d );
00079
00080 m_scaleonresize = other.m_scaleonresize;
00081
00082 m_width = other.m_width;
00083 m_height = other.m_height;
00084
00085 m_is_cached = false;
00086 m_b_is_cached = false;
00087 #if defined(_DEBUG) && defined (SMART_POINTER_DEBUG)
00088
00089 CurrentSmartPointerOwner = this;
00090 #endif
00091 }
00092
00093 a2dObject* a2dRenderImage::Clone( CloneOptions options ) const
00094 {
00095 return new a2dRenderImage( *this, options );
00096 }
00097
00098 a2dCanvasDocument* a2dRenderImage::GetCanvasDocument()
00099 {
00100 return m_drawer->GetCanvasDocument();
00101 }
00102
00103 a2dCanvasObject* a2dRenderImage::GetShowObject() const
00104 {
00105 return m_drawer->GetShowObject();
00106 }
00107
00108 a2dCanvasObject* a2dRenderImage::SetShowObject( const wxString& name )
00109 {
00110 return m_drawer->SetShowObject( name );
00111 }
00112
00113 bool a2dRenderImage::SetShowObject( a2dCanvasObject* obj )
00114 {
00115 return m_drawer->SetShowObject( obj );
00116 }
00117
00118 void a2dRenderImage::SetWidth(double width)
00119 {
00120 m_width = width;
00121 m_is_cached = false;
00122 Update( updatemask_force );
00123 SetPending(true);
00124 }
00125
00126 void a2dRenderImage::SetHeight( double height )
00127 {
00128 m_height = height;
00129 Update( updatemask_force );
00130 m_is_cached = false;
00131 SetPending(true);
00132 }
00133
00134 bool a2dRenderImage::DoIsHitWorld( a2dIterC& WXUNUSED(ic), a2dHitEvent& hitEvent )
00135 {
00136 return true;
00137 }
00138
00139 a2dBoundingBox a2dRenderImage::DoGetUnTransformedBbox( a2dBboxFlags flags ) const
00140 {
00141 a2dBoundingBox bbox;
00142 bbox.Expand( -m_width/2, -m_height/2 );
00143 bbox.Expand( +m_width/2, +m_height/2 );
00144 return bbox;
00145 }
00146
00147 bool a2dRenderImage::DoUpdate( UpdateMode mode, const a2dBoundingBox& childbox, const a2dBoundingBox& clipbox, const a2dBoundingBox& propbox )
00148 {
00149 if ( !m_bbox.GetValid() )
00150 {
00151 m_drawer->GetShowObject()->Update( mode );
00152 m_bbox.Expand( -m_width/2, -m_height/2 );
00153 m_bbox.Expand( +m_width/2, +m_height/2 );
00154 m_bbox.MapBbox( m_lworld );
00155 return true;
00156 }
00157 return false;
00158 }
00159
00160 void a2dRenderImage::SetMappingWidthHeight( double vx1, double vy1, double width, double height)
00161 {
00162 m_drawer->GetDrawer2D()->SetMappingWidthHeight( vx1, vy1, width, height);
00163 m_is_cached = false;
00164 SetPending(true);
00165 }
00166
00167 void a2dRenderImage::SetMappingUpp( double vx1, double vy1, double xpp, double ypp)
00168 {
00169 m_drawer->GetDrawer2D()->SetMappingDeviceRect( 0, 0, m_drawer->GetDrawer2D()->GetBuffer().GetWidth(), m_drawer->GetDrawer2D()->GetBuffer().GetHeight() );
00170 m_drawer->GetDrawer2D()->SetMappingUpp( vx1, vy1, xpp, ypp);
00171 m_is_cached = false;
00172 SetPending(true);
00173 }
00174
00175 void a2dRenderImage::SetMappingAbs( a2dIterC& ic, double vx1, double vy1, double width, double height)
00176 {
00177 double xs = m_drawer->GetDrawer2D()->GetBuffer().GetWidth() / (double)m_cW;
00178 double ys = m_drawer->GetDrawer2D()->GetBuffer().GetHeight() / (double)m_cH;
00179
00180 double x = m_drawer->GetDrawer2D()->DeviceToWorldX( ic.GetDrawer2D()->WorldToDeviceXRel( vx1-GetBboxMinX())*xs );
00181 double y;
00182 if (ic.GetDrawer2D()->GetYaxis())
00183 y = m_drawer->GetDrawer2D()->DeviceToWorldY( ic.GetDrawer2D()->WorldToDeviceYRel( vy1 - GetBboxMaxY())*ys );
00184 else
00185 y = m_drawer->GetDrawer2D()->DeviceToWorldY( ic.GetDrawer2D()->WorldToDeviceYRel( vy1 - GetBboxMinY())*ys );
00186 double w = m_drawer->GetDrawer2D()->DeviceToWorldXRel(ic.GetDrawer2D()->WorldToDeviceXRel( width*xs ) );
00187 double h = fabs(m_drawer->GetDrawer2D()->DeviceToWorldYRel(ic.GetDrawer2D()->WorldToDeviceYRel( height*ys ) ));
00188
00189 m_drawer->GetDrawer2D()->SetMappingWidthHeight( x, y, w, h );
00190
00191 m_is_cached = false;
00192 SetPending(true);
00193 }
00194
00195 void a2dRenderImage::SetRenderCanvasDocument( a2dCanvasDocument* aroot )
00196 {
00197 m_drawer->SetDocument( aroot );
00198 m_is_cached = false;
00199 SetPending(true);
00200 }
00201
00202 void a2dRenderImage::DoRender( a2dIterC& ic, OVERLAP WXUNUSED(clipparent) )
00203 {
00204 if ( !m_drawer->GetCanvasDocument() ) return;
00205
00206 int dw, dh;
00207
00208 dw = ic.GetDrawer2D()->WorldToDeviceXRel( ic.GetTransform().Get_scaleX()*m_width );
00209 dh = abs(ic.GetDrawer2D()->WorldToDeviceYRel( ic.GetTransform().Get_scaleY()*m_height ));
00210
00211 if ( dw==0 || dh ==0 )
00212 return;
00213
00214 double x;
00215 double y;
00216 ic.GetTransform().TransformPoint( 0.0, 0.0, x, y );
00217 x = ic.GetDrawer2D()->WorldToDeviceX( x );
00218 y = ic.GetDrawer2D()->WorldToDeviceY( y );
00219
00220 wxImage tmp;
00221
00222 if (m_is_cached && m_cImage.Ok() && (m_cW == dw) && (m_cH == dh))
00223 {
00224
00225 tmp = m_cImage;
00226 }
00227 else
00228 {
00229 if ( (dw == m_drawer->GetDrawer2D()->GetBuffer().GetWidth()) &&
00230 (dh == m_drawer->GetDrawer2D()->GetBuffer().GetHeight()))
00231 {
00232 tmp = m_drawer->GetDrawer2D()->GetBuffer().ConvertToImage();
00233 }
00234 else
00235 {
00236
00237 m_drawer->GetDrawer2D()->SetMappingDeviceRect( 0, 0, (int) m_width, (int) m_height );
00238
00239 m_drawer->UpdateArea( 0, 0, m_drawer->GetDrawer2D()->GetBuffer().GetWidth(), m_drawer->GetDrawer2D()->GetBuffer().GetHeight() );
00240
00241 m_cImage.Destroy();
00242
00243 m_cImage = m_drawer->GetDrawer2D()->GetBuffer().ConvertToImage();
00244 m_cImage = m_cImage.Scale( dw, dh);
00245 m_is_cached = true;
00246 m_cW = m_cImage.GetWidth();
00247 m_cH = m_cImage.GetHeight();
00248 m_b_is_cached = false;
00249 tmp = m_cImage;
00250 }
00251 }
00252
00253 wxPoint centr( dw/2, dh/2 );
00254
00255
00256 if ( ic.GetDrawer2D()->GetDrawStyle() != a2dWIREFRAME_INVERT )
00257 {
00258 ic.GetDrawer2D()->DrawImage( tmp, 0, 0, m_width, m_height, 255 );
00259 }
00260 else
00261 {
00262 if ( GetStroke() != *a2dTRANSPARENT_STROKE || GetFill() != *a2dTRANSPARENT_FILL )
00263 ic.GetDrawer2D()->DrawCenterRoundedRectangle( 0.0, 0.0, (int) m_width, (int) m_height, 0);
00264 }
00265 if (m_flags.m_selected)
00266 {
00267 ic.GetDrawer2D()->DrawCenterRoundedRectangle( 0.0, 0.0, m_width, m_height, 0);
00268 }
00269 else if ( GetStroke() != *a2dTRANSPARENT_STROKE || GetFill() != *a2dTRANSPARENT_FILL )
00270 {
00271 ic.GetDrawer2D()->DrawCenterRoundedRectangle( 0.0, 0.0, m_width, m_height, 0);
00272
00273 }
00274 }
00275
00276
00277
00278
00279
00280
00281
00282