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/canextobj/imageioh.h"
00022
00023
00024
00025
00026
00027
00028 a2dCanvasDocumentIOHandlerImageIn::a2dCanvasDocumentIOHandlerImageIn( wxBitmapType type )
00029 {
00030 m_type = type;
00031 m_imageSize = wxSize( 1000, 1000 );
00032 m_docClassInfo = &a2dCanvasDocument::ms_classInfo;
00033 }
00034
00035 a2dCanvasDocumentIOHandlerImageIn::~a2dCanvasDocumentIOHandlerImageIn()
00036 {
00037 }
00038
00039 wxBitmapType a2dCanvasDocumentIOHandlerImageIn::DetectImageType()
00040 {
00041 wxASSERT_MSG( m_streami , wxT("m_stream not set") );
00042
00043 wxImageHandler* handlerfound = NULL;
00044 wxList::compatibility_iterator node = wxImage::GetHandlers().GetFirst();
00045 while (node)
00046 {
00047 SeekI( 0 );
00048 wxImageHandler *handler = (wxImageHandler*)node->GetData();
00049 #if wxUSE_STD_IOSTREAM
00050 wxASSERT_MSG( 0 , wxT("this type of stream, not implemented") );
00051 #else
00052 if ( handler->CanRead( *m_streami ) )
00053 #endif
00054 {
00055 handlerfound = handler;
00056 break;
00057 }
00058 node = node->GetNext();
00059 }
00060 SeekI( 0 );
00061 if ( handlerfound )
00062 return (wxBitmapType) handlerfound->GetType();
00063 return wxBITMAP_TYPE_ANY;
00064 }
00065
00066 bool a2dCanvasDocumentIOHandlerImageIn::CanLoad( a2dDocumentInputStream& stream, const wxObject* obj, wxClassInfo* docClassInfo )
00067 {
00068 if ( obj && !wxDynamicCast( obj, a2dCanvasDocument) )
00069 return false;
00070
00071 if ( docClassInfo && m_docClassInfo && !docClassInfo->IsKindOf( m_docClassInfo ) )
00072 return false;
00073
00074 m_streami = &stream;
00075
00076 wxImageHandler* handlerfound = NULL;
00077 if ( m_type == wxBITMAP_TYPE_ANY )
00078 {
00079 long type = DetectImageType();
00080 m_streami = NULL;
00081 if ( type == wxBITMAP_TYPE_ANY )
00082 return false;
00083 }
00084 else
00085 {
00086 m_streami = NULL;
00087 if ( !wxImage::FindHandler( m_type ) )
00088 return false;
00089 }
00090
00091 m_streami = NULL;
00092 return true;
00093 }
00094
00095 bool a2dCanvasDocumentIOHandlerImageIn::Load( a2dDocumentInputStream& stream , wxObject* obj )
00096 {
00097 m_streami = &stream;
00098 m_doc = wxStaticCast( obj, a2dCanvasDocument);
00099
00100 bool oke = true;
00101
00102 wxImageHandler* handler = NULL;
00103 if ( m_type == wxBITMAP_TYPE_ANY )
00104 {
00105 wxBitmapType type = DetectImageType();
00106 if ( type == wxBITMAP_TYPE_ANY )
00107 return false;
00108 handler = wxImage::FindHandler( type );
00109 }
00110 else
00111 handler = wxImage::FindHandler( m_type );
00112
00113 if ( !handler )
00114 return false;
00115
00116 try
00117 {
00118 InitializeLoad();
00119
00120 wxImage image;
00121
00122 #if !wxUSE_STD_IOSTREAM
00123 if ( handler->LoadFile( &image, stream ) )
00124 {
00125 m_doc->Append( new a2dImage(image, 0, 0, m_imageSize.GetWidth(), m_imageSize.GetHeight() ) );
00126 return true;
00127 }
00128 #else
00129 return false;
00130 #endif
00131
00132 }
00133 catch ( ... )
00134 {
00135 oke = false;
00136 a2dDocviewGlobals->ReportErrorF( a2dError_NotSpecified, _("error in Image file reading\n %s \n"),_(""));
00137 }
00138
00139 ResetLoad();
00140
00141 return oke;
00142 }
00143
00144
00145
00146
00147
00148 void a2dCanvasDocumentIOHandlerImageOut::SetViewRectangle( double minx, double miny, double maxx, double maxy )
00149 {
00150 m_viewBox = a2dBoundingBox( minx, miny, maxx, maxy );
00151 }
00152
00153 void a2dCanvasDocumentIOHandlerImageOut::SetBorder( wxUint16 border, bool percentual )
00154 {
00155 m_border = border;
00156 m_borderpercentual = percentual;
00157 if ( m_borderpercentual )
00158 {
00159 wxASSERT_MSG( m_border >= 0 && m_border <= 100 , wxT("percentage must be >=0 and <= 100") );
00160 }
00161 }
00162
00163 a2dCanvasDocumentIOHandlerImageOut::a2dCanvasDocumentIOHandlerImageOut( wxBitmapType type )
00164 {
00165 m_border = 0;
00166 m_borderpercentual = true;
00167 m_typeDetectedFromFilename = m_type = type;
00168 m_imageSize = wxSize( 0, 0 );
00169 m_showObject = NULL;
00170 m_yaxis = true;
00171 m_drawer2D = NULL;
00172 m_maxWidthHeight = 0;
00173 }
00174
00175 a2dCanvasDocumentIOHandlerImageOut::~a2dCanvasDocumentIOHandlerImageOut()
00176 {
00177 if ( m_drawer2D )
00178 delete m_drawer2D;
00179 }
00180
00181 void a2dCanvasDocumentIOHandlerImageOut::SetDrawer2D( a2dDrawer2D* drawer2d )
00182 {
00183 if ( m_drawer2D )
00184 delete m_drawer2D;
00185
00186 m_drawer2D = drawer2d;
00187 if ( m_drawer2D )
00188 {
00189 m_drawer2D->SetBufferSize( m_imageSize.GetWidth(), m_imageSize.GetHeight() );
00190 }
00191 }
00192
00193 bool a2dCanvasDocumentIOHandlerImageOut::CanSave( const wxObject* obj )
00194 {
00195
00196 wxImageHandler* handler = NULL;
00197 handler = wxImage::FindHandler( wxBITMAP_TYPE_ANY == m_type? (wxBitmapType) -1 : m_type );
00198 if ( !handler )
00199 return false;
00200
00201 m_typeDetectedFromFilename = m_type;
00202 return true;
00203 }
00204
00205 bool a2dCanvasDocumentIOHandlerImageOut::Save( a2dDocumentOutputStream& stream, const wxObject* doc )
00206 {
00207 m_doc = wxStaticCast( doc, a2dCanvasDocument);
00208 m_streamo = &stream;
00209
00210
00211 InitializeSave();
00212
00213 bool res = false;
00214
00215 wxImage image = RenderImage( m_doc );
00216
00217 wxImageHandler* handler = wxImage::FindHandler( wxBITMAP_TYPE_ANY == m_type? m_typeDetectedFromFilename : m_type );
00218 if ( handler )
00219 {
00220 #if wxUSE_STD_IOSTREAM
00221
00222 #else //wxUSE_STD_IOSTREAM
00223 res = image.SaveFile( *m_streamo, m_type );
00224 #endif //wxUSE_STD_IOSTREAM
00225 }
00226 ResetSave();
00227
00228 return res;
00229 }
00230
00231 wxImage a2dCanvasDocumentIOHandlerImageOut::RenderImage( a2dCanvasDocument* document )
00232 {
00233 m_doc = document;
00234
00235 if ( !m_showObject )
00236 {
00237 m_showObject = m_doc->GetRootObject();
00238 }
00239
00240 if ( !m_viewBox.GetValid() )
00241 {
00242 m_viewBox = m_showObject->GetBbox();
00243 a2dAffineMatrix cworld = m_showObject->GetTransformMatrix();
00244 cworld.Invert();
00245 m_viewBox.MapBbox(cworld);
00246 }
00247
00248 double w = m_viewBox.GetWidth();
00249 double h = m_viewBox.GetHeight();
00250
00251 if ( w == 0 )
00252 w=1000;
00253 if ( h== 0 )
00254 h=1000;
00255
00256
00257 double virt_minX;
00258
00259 double virt_minY;
00260
00261 double xpp;
00262
00263 double ypp;
00264
00265
00266 if ( m_imageSize.GetWidth() == 0 || m_imageSize.GetHeight() == 0 )
00267 {
00268 m_maxWidthHeight = wxGetNumberFromUser(_("Give Maximum pixel size in width and height:"), _("Pixels:"), _("Pixel"), m_maxWidthHeight, 0, 50000 );
00269 m_imageSizeCalc = wxSize( m_maxWidthHeight, m_maxWidthHeight );
00270
00271
00272 xpp = w/m_maxWidthHeight;
00273 ypp = h/m_maxWidthHeight;
00274 if ( xpp > ypp )
00275 m_imageSizeCalc = wxSize( m_maxWidthHeight, (int) (h/xpp) );
00276 else
00277 m_imageSizeCalc = wxSize( (int) (w/ypp), m_maxWidthHeight );
00278 }
00279 else
00280 m_imageSizeCalc = m_imageSize;
00281
00282
00283
00284 double uppx;
00285 double uppy;
00286 int clientw = m_imageSizeCalc.GetWidth();
00287 int clienth = m_imageSizeCalc.GetHeight();
00288
00289 int border = m_border;
00290 if ( m_borderpercentual )
00291 border = (int) (wxMin( clientw, clienth ) * m_border/100.0) ;
00292
00293 if ( clientw - border > 0 )
00294 clientw = clientw - border;
00295
00296 if ( clienth - border > 0 )
00297 clienth = clienth - border;
00298
00299 uppx = w/clientw;
00300 uppy = h/clienth;
00301 if ( uppx < uppy )
00302 uppx = uppy;
00303
00304 double middlexworld = m_viewBox.GetMinX()+w/2.0;
00305 double middleyworld = m_viewBox.GetMinY()+h/2.0;
00306 virt_minX = middlexworld - ( clientw + border )/2.0*uppx;
00307 virt_minY = middleyworld - ( clienth + border )/2.0*uppx;
00308 xpp = uppx;
00309 ypp = uppx;
00310
00311 if ( !m_drawer2D )
00312 m_drawer2D = new a2dMemDcDrawer( m_imageSizeCalc.GetWidth(), m_imageSizeCalc.GetHeight() );
00313 else
00314 m_drawer2D->SetBufferSize( m_imageSizeCalc.GetWidth(), m_imageSizeCalc.GetHeight() );
00315 m_drawer2D->SetMappingDeviceRect( 0, 0, m_imageSizeCalc.GetWidth(), m_imageSizeCalc.GetHeight() );
00316
00317 a2dCanvasView* bitmapview = new a2dCanvasView( m_imageSizeCalc.GetWidth(), m_imageSizeCalc.GetHeight(), m_drawer2D );
00318 bitmapview->SetDocument( m_doc );
00319 bitmapview->SetShowObject( m_showObject );
00320 bitmapview->GetDrawer2D()->SetYaxis( m_yaxis );
00321
00322
00323 bitmapview->Update( a2dCANVIEW_UPDATE_OLDNEW );
00324 bitmapview->GetDrawer2D()->SetMappingUpp( virt_minX , virt_minY, xpp, ypp );
00325 bitmapview->Update( a2dCANVIEW_UPDATE_ALL | a2dCANVIEW_UPDATE_AREAS | a2dCANVIEW_UPDATE_BLIT );
00326
00327 wxImage image = bitmapview->GetDrawer2D()->GetBuffer().ConvertToImage();
00328
00329 bitmapview->SetDrawer2D( NULL, true );
00330 bitmapview->SetClosed();
00331
00332 return image;
00333 }
00334
00335