24#include <tdetempfile.h>
26#include <kgenericfactory.h>
27#include <KoFilterChain.h>
29#include <msodimport.h>
30#include <tqpointarray.h>
32typedef KGenericFactory<MSODImport, KoFilter> MSODImportFactory;
33K_EXPORT_COMPONENT_FACTORY( libmsodimport, MSODImportFactory(
"kofficefilters" ) )
35const
int MSODImport::s_area = 30505;
37MSODImport::MSODImport(
40 const TQStringList&) :
41 KoEmbeddingFilter(), Msod(100)
45MSODImport::~MSODImport()
49KoFilter::ConversionStatus MSODImport::convert(
const TQCString& from,
const TQCString& to )
51 if (to !=
"application/x-karbon" || from !=
"image/x-msod")
52 return KoFilter::NotImplemented;
56 emit commSignalShapeID( shapeId );
57 const char *delayStream = 0L;
58 emit commSignalDelayStream( delayStream );
59 kdDebug( s_area ) <<
"##################################################################" << endl;
60 kdDebug( s_area ) <<
"shape id: " << shapeId << endl;
61 kdDebug( s_area ) <<
"delay stream: " << delayStream << endl;
62 kdDebug( s_area ) <<
"##################################################################" << endl;
89 m_text +=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
90 m_text +=
"<!DOCTYPE DOC>\n";
91 m_text +=
"<DOC mime=\"application/x-karbon\" syntaxVersion=\"0.1\" editor=\"WMF import filter\">\n";
92 m_text +=
" <LAYER name=\"Layer\" visible=\"1\">\n";
94 if (!parse(shapeId, m_chain->inputFile(), delayStream))
95 return KoFilter::WrongFormat;
98 m_text +=
" </LAYER>\n";
101 emit sigProgress(100);
103 KoStoreDevice* dev = m_chain->storageFile(
"root", KoStore::Write );
106 kdError(s_area) <<
"Cannot open output file" << endl;
107 return KoFilter::StorageCreationError;
109 TQCString cstring ( m_text.utf8() );
110 dev->writeBlock(cstring.data(), cstring.size()-1);
115void MSODImport::gotEllipse(
125 m_text +=
"<ellipse angle1=\"" + TQString::number(startAngle) +
126 "\" angle2=\"" + TQString::number(stopAngle) +
127 "\" x=\"" + TQString::number(topLeft.x()) +
128 "\" y=\"" + TQString::number(topLeft.y()) +
129 "\" kind=\"" + type +
130 "\" rx=\"" + TQString::number(halfAxes.width()) +
131 "\" ry=\"" + TQString::number(halfAxes.height()) +
133 m_text +=
" <gobject fillcolor=\"#" + TQString::number(dc.m_brushColour, 16) +
134 "\" fillstyle=\"" + TQString::number(1 ) +
135 "\" linewidth=\"" + TQString::number(dc.m_penWidth) +
136 "\" strokecolor=\"#" + TQString::number(dc.m_penColour, 16) +
137 "\" strokestyle=\"" + TQString::number(dc.m_penStyle) +
139 m_text +=
" <matrix dx=\"0\" dy=\"0\" m21=\"0\" m22=\"1\" m11=\"1\" m12=\"0\"/>\n";
140 m_text +=
" </gobject>\n";
141 m_text +=
"</ellipse>\n";
145static void toRGB(
int c,
double &r,
double &g,
double &b)
147 r = (c >> 16) / 255.0;
148 g = ((c >> 8) & 0xFF) / 255.0;
149 b = (c & 0xFF) / 255.0;
152void MSODImport::gotPicture(
160 kdDebug() <<
"##########################################MSODImport::gotPicture" << endl;
161 kdDebug() <<
"MSODImport::gotPicture -- " << extension << endl;
162 if ((extension ==
"wmf") ||
163 (extension ==
"emf") ||
164 (extension ==
"pict"))
166 int partRef = internalPartReference( TQString::number( key ) );
170 m_embeddeeData = data;
171 m_embeddeeLength = length;
173 TQString srcMime( KoEmbeddingFilter::mimeTypeByExtension( extension ) );
174 if ( srcMime == KMimeType::defaultMimeType() )
175 kdWarning( s_area ) <<
"Couldn't determine the mimetype from the extension" << endl;
178 KoFilter::ConversionStatus status;
179 partRef = embedPart( srcMime.latin1(), destMime, status, TQString::number( key ) );
182 m_embeddeeLength = 0;
184 if ( status != KoFilter::OK ) {
185 kdWarning(s_area) <<
"Couldn't convert the image!" << endl;
189 m_text +=
"<object url=\"" + TQString::number( partRef ) +
"\" mime=\"";
190 m_text += internalPartMimeType( TQString::number( key ) );
191 m_text +=
"\" x=\"0\" y=\"0\" width=\"100\" height=\"200\"/>\n";
196 KTempFile tempFile( TQString(),
'.' + extension );
197 tempFile.file()->writeBlock( data, length );
200 m_text +=
"<pixmap src=\"" + tempFile.name() +
"\">\n"
201 " <gobject fillstyle=\"0\" linewidth=\"1\" strokecolor=\"#000000\" strokestyle=\"1\">\n"
202 " <matrix dx=\"0\" dy=\"0\" m21=\"0\" m22=\"1\" m11=\"1\" m12=\"0\"/>\n"
211void MSODImport::gotPolygon(
212 const DrawContext &dc,
213 const TQPointArray &points)
215 kdDebug(s_area) <<
"MSODImport::gotPolygon" << endl;
216 kdDebug(s_area) << TQString::number(dc.m_penWidth, 16) << endl;
217 kdDebug(s_area) << dc.m_penStyle << endl;
218 m_text +=
"<COMPOSITE>\n";
219 if( dc.m_penWidth > 0 )
221 m_text +=
"<STROKE lineWidth=\"1\">\n";
223 toRGB(dc.m_penColour, r, g, b);
224 m_text +=
"<COLOR v1=\"" + TQString::number(r) +
"\" v2=\"" + TQString::number(g) +
"\" v3=\"" + TQString::number(b) +
"\" opacity=\"1\" colorSpace=\"0\" />\n";
225 m_text +=
"</STROKE>\n";
228 m_text +=
"<STROKE lineWidth=\"1\" />\n";
229 m_text +=
"<FILL fillRule=\"" + TQString::number(dc.m_winding) +
"\">\n";
231 toRGB(dc.m_brushColour, r, g, b);
232 m_text +=
"<COLOR v1=\"" + TQString::number(r) +
"\" v2=\"" + TQString::number(g) +
"\" v3=\"" + TQString::number(b) +
"\" opacity=\"1\" colorSpace=\"0\" />\n";
233 m_text +=
"</FILL>\n";
235 m_text +=
"<PATH isClosed=\"1\" >\n";
237 m_text +=
"</PATH>\n";
238 m_text +=
"</COMPOSITE>\n";
242void MSODImport::gotPolyline(
243 const DrawContext &dc,
244 const TQPointArray &points)
246 kdDebug(s_area) <<
"MSODImport::gotPolyline" << endl;
248 m_text +=
"<COMPOSITE>\n";
249 m_text +=
"<STROKE lineWidth=\"" + TQString::number(dc.m_penWidth) +
"\">\n";
250 m_text +=
"</STROKE>\n";
251 m_text +=
"<PATH isClosed=\"1\" >\n";
253 m_text +=
"</PATH>\n";
254 m_text +=
"</COMPOSITE>\n";
257void MSODImport::gotRectangle(
258 const DrawContext &dc,
259 const TQPointArray &points)
263 TQRect bounds = points.boundingRect();
265 m_text +=
"<rectangle width=\"" + TQString::number(bounds.width()) +
266 "\" x=\"" + TQString::number(bounds.x()) +
267 "\" y=\"" + TQString::number(bounds.y()) +
268 "\" height=\"" + TQString::number(bounds.height()) +
269 "\" rounding=\"0\">\n";
270 m_text +=
"<polyline arrow1=\"0\" arrow2=\"0\">\n";
272 m_text +=
" <gobject fillcolor=\"#" + TQString::number(dc.m_brushColour, 16) +
273 "\" fillstyle=\"" + TQString::number(1 ) +
274 "\" linewidth=\"" + TQString::number(dc.m_penWidth) +
275 "\" strokecolor=\"#" + TQString::number(dc.m_penColour, 16) +
276 "\" strokestyle=\"" + TQString::number(dc.m_penStyle) +
278 m_text +=
" <matrix dx=\"0\" dy=\"0\" m21=\"0\" m22=\"1\" m11=\"1\" m12=\"0\"/>\n";
279 m_text +=
" </gobject>\n";
280 m_text +=
"</polyline>\n";
281 m_text +=
"</rectangle>\n";
285void MSODImport::savePartContents( TQIODevice* file )
287 if ( m_embeddeeData != 0 && m_embeddeeLength != 0 )
288 file->writeBlock( m_embeddeeData, m_embeddeeLength );
291void MSODImport::pointArray(
292 const TQPointArray &points)
295 m_text +=
"<MOVE x=\"" + TQString::number(points.point(0).x()) +
296 "\" y=\"" + TQString::number(points.point(0).y()) +
298 kdDebug(s_area) <<
"\n<MOVE x=\"" + TQString::number(points.point(0).x()) +
299 "\" y=\"" + TQString::number(points.point(0).y()) +
301 for (
unsigned int i = 1; i < points.count(); i++)
303 m_text +=
"<LINE x=\"" + TQString::number(points.point(i).x()) +
304 "\" y=\"" + TQString::number(points.point(i).y()) +
306 kdDebug(s_area) <<
"<LINE x=\"" + TQString::number(points.point(i).x()) +
307 "\" y=\"" + TQString::number(points.point(i).y()) +
313#include <msodimport.moc>