<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13479614</id><updated>2012-01-31T16:03:22.933+01:00</updated><title type='text'>Trained Monkey Hacking Experience</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://fridrich.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>80</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13479614.post-995596367138680466</id><published>2012-01-31T15:56:00.001+01:00</published><updated>2012-01-31T16:03:22.940+01:00</updated><title type='text'>LibreOffice CorelDraw Import filter - don't despise the humble beginnings</title><content type='html'>&lt;p&gt;You might still remember &lt;a href="http://fridrich.blogspot.com/2011/11/it-has-been-long-time-since-i-last-time.html" target="_blank"&gt;some&lt;/a&gt; &lt;a href="http://fridrich.blogspot.com/2011/07/libreoffice-visio-import-filter-round.html" target="_blank"&gt;of&lt;/a&gt; &lt;a href="http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-shaping.html" target="_blank"&gt;my&lt;/a&gt; &lt;a href="http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-first.html" target="_blank"&gt;blogs&lt;/a&gt; about &lt;a href="http://wiki.documentfoundation.org/ReleaseNotes/3.5#Filters" target="_blank"&gt;our new and shiny MS Visio import filter&lt;/a&gt; in the upcoming &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; 3.5.0.&lt;/p&gt;&lt;p&gt;But what about 3.6.0? Is it going to be an exciting version too? Well, the answer depends on what kind of things excite you generally, but for sure, there will be a lot of goodness as usual to make the best free office suite even better.&lt;/p&gt;&lt;p&gt;In my free time, I have been working for some time already on the next graphics import filter for &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt;. This time it will be a CorelDraw import filter. The horse-power is a library, &lt;a href="http://cgit.freedesktop.org/libreoffice/libcdr/" target="_blank"&gt;&lt;code&gt;&lt;b&gt;libcdr&lt;/b&gt;&lt;/code&gt;&lt;/a&gt;. In the same way as &lt;code&gt;libvisio&lt;/code&gt;, &lt;code&gt;libcdr&lt;/code&gt; reuses the API of &lt;code&gt;libwpg&lt;/code&gt; and thus is easily pluggable into &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; reusing all the ODG generator classes of the current &lt;code&gt;writerperfect&lt;/code&gt; module. The importer is currently part of the git master tree.&lt;/p&gt;&lt;p&gt;You might be already shouting: &amp;quot;Where are the screenshots?&amp;quot; I know that a picture speaks louder then hundred words, and so here you are served:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/990shapes_coreldraw7.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/990shapes_coreldraw7_tn.jpg" alt="Shapes in CorelDraw 7"&gt;&lt;/a&gt;&lt;/p&gt;Simple and more complex shapes in CorelDraw 7&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/902shapes_our_draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/902shapes_our_draw_tn.jpg" alt="Shapes in LibreOffice Draw"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The same shapes imported into LibreOffice Draw.&lt;/p&gt;&lt;p&gt;As you can see, it is an initial implementation, which cannot but get better. If you want to participate in this adventure, you can drop around at our IRC channel &lt;a href="irc://chat.freenode.net/libreoffice-dev"&gt;&lt;code&gt;#libreoffice-dev&lt;/code&gt;&lt;/a&gt; channel at &lt;a href="http://webchat.freenode.net/"&gt;&lt;code&gt;irc.freenode.net&lt;/code&gt;&lt;/a&gt; where a community of smart and friendly developers can direct you.&lt;/p&gt;&lt;p&gt;Stay tuned for more nice pictures as this project advances.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-995596367138680466?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/995596367138680466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/995596367138680466'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2012/01/libreoffice-coreldraw-import-filter.html' title='LibreOffice CorelDraw Import filter - don&apos;t despise the humble beginnings'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-131040848618390967</id><published>2012-01-25T23:19:00.001+01:00</published><updated>2012-01-26T15:49:15.756+01:00</updated><title type='text'>FOSDEM 2012 - How to make the best of it and become LibreOffice developer</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://www.fosdem.org"&gt;&lt;img src="http://www.fosdem.org/promo/going-to" alt="I'm going to FOSDEM, the Free and Open Source Software Developers' European Meeting" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://fosdem.org/2012/" target="_blank"&gt;FOSDEM 2012&lt;/a&gt; is just round the corner and, as you might know, &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; will have a &lt;a href="http://blog.documentfoundation.org/2012/01/24/libreoffice-devroom-at-fosdem-2012-in-brussels/" target="_blank"&gt;DevRoom&lt;/a&gt; this year too. And, as it was already &lt;a href="http://libregraphicsworld.org/blog/entry/whats-coming-at-fosdem-2012" target="_blank"&gt;publicized&lt;/a&gt;, your servant and Eilidh McAdam of &lt;a href="http://www.freedesktop.org/wiki/Software/libvisio" target="_blank"&gt;libvisio&lt;/a&gt; fame will attend too. The goal of this event will be to help you to become a &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; developer, by helping you to get your first contact with the code from inside.&lt;/p&gt;&lt;p&gt;&lt;b&gt;How to prepare for the event?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In order to give as many community members the possibility to speak, the presentations will not take more then 15 minutes each. But we will be there for one-to-one contacts and hacking goodness. If you are interested in contributing to our new Visio import filter, or the upcomming Corel Draw and MS Publisher filters, here is what you can do:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Find a bug that is bothering you in the current Visio import filter, or some simple feature that the importer currently does not support&lt;/li&gt;&lt;li&gt;Check out the following libraries:&lt;ul&gt;&lt;li&gt;master branch of libwpd (&lt;code&gt;git clone git://libwpd.git.sourceforge.net/gitroot/libwpd/libwpd&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;STABLE-0-2-0 branch of libwpg (&lt;code&gt;git clone -b STABLE-0-2-0 git://libwpg.git.sourceforge.net/gitroot/libwpg/libwpg&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;master branch of libwps (&lt;code&gt;git clone git://libwps.git.sourceforge.net/gitroot/libwps/libwps&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;master branch of libvisio (&lt;code&gt;git clone git://anongit.freedesktop.org/libreoffice/contrib/libvisio&lt;/code&gt;), and&lt;/li&gt;&lt;li&gt;master branch of libcdr (&lt;code&gt;git clone git://anongit.freedesktop.org/libreoffice/libcdr&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Build them as system libraries and install them in the same order.&lt;/li&gt;&lt;li&gt;Then build LibreOffice according to &lt;a href="http://wiki.documentfoundation.org/Development#Getting_your_first_build_done" target="_blank"&gt;these instructions&lt;/a&gt;. &lt;b&gt;The important thing is to use those system libraries that you just built.&lt;/b&gt; To do so, be sure you added to the configure flags &lt;ul&gt;&lt;li&gt;&lt;code&gt;--with-system-liwpd&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;--with-system-libwpg&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;--with-system-libwps&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;--with-system-libvisio&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;--with-system-libcdr&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;With this kind of build, you will be ready to make the most from your Brussels weekend. Nevetheless, you can drop around at our IRC channel &lt;a href="irc://chat.freenode.net/libreoffice-dev"&gt;&lt;code&gt;#libreoffice-dev&lt;/code&gt;&lt;/a&gt; channel at &lt;a href="http://webchat.freenode.net/"&gt;&lt;code&gt;irc.freenode.net&lt;/code&gt;&lt;/a&gt; for more information and ideas.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Starting to do it instead of planning to do it ...&lt;/b&gt;&lt;/p&gt;&lt;p&gt;... is the best way to enter the FOSS development. That is why your servant and Eilidh will be around to hold your hand with debugging and finding way to implement your favourite features. We will answer your questions about the library design. We will point you to the place in the code where your bug might linger. And for more complicated stuff, we will debug it with you.&lt;/p&gt;&lt;p&gt;Don't expect us to give you a fish, but we will certainly teach you how to catch it by yourself. And in the same token, you will become a contributor inside a community of smart people that is fun to hang and hack with.&lt;/p&gt;&lt;p&gt;See you in Brussels the 4&lt;sup&gt;th&lt;/sup&gt; and 5&lt;sup&gt;th&lt;/sup&gt; of February 2012.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-131040848618390967?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/131040848618390967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/131040848618390967'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2012/01/fosdem-2012-how-to-make-best-of-it-and.html' title='FOSDEM 2012 - How to make the best of it and become LibreOffice developer'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-3090181864515858709</id><published>2012-01-02T15:19:00.002+01:00</published><updated>2012-01-02T15:19:41.184+01:00</updated><title type='text'>Take a decision to enter FOSS in 2012</title><content type='html'>&lt;p&gt;So, the year changed again and with it come quite often new decisions. Some swear to work out the superfluous kilos, pounds, or whatever standardized measure your country uses, gained too fast during the festivals. If it is your decision, it is for sure good for your body and I wish you success that goes beyond the act of subscribing to a local gym (and never appearing there after first month).&lt;/p&gt;&lt;p&gt;But this could be also a nice time to take a decision that you were procrastinating with for too long. That one is good for your intellect and programming skills (even though you don't consider yourself a programmer yet). What about starting to contribute to a Free and Open Source Software project (FOSS)?&lt;/p&gt;&lt;p&gt;Sounds interesting? So I have one for your. It is having a big and growing community. It can accomodate all levels of skills. And the impact you will have is multiplied by the wide addoption of the product itself.&lt;/p&gt;&lt;p&gt;Well, you must have guessed right by now. I am speaking about the &lt;a href="http://libreoffice.org"&gt;LibreOffice&lt;/a&gt; project, your natural entry point into the marvelous world of the FOSS.&lt;/p&gt;&lt;p&gt;Whether you are expert or beginner programmer or C++ is sounding Chinese Traditional for you, just find a way to join channel &lt;a href="irc://chat.freenode.net/libreoffice-dev"&gt;&lt;code&gt;#libreoffice-dev&lt;/code&gt;&lt;/a&gt; channel at &lt;a href="http://webchat.freenode.net/"&gt;&lt;code&gt;irc.freenode.net&lt;/code&gt;&lt;/a&gt; in order to meet other developers and visit our &lt;a href="http://wiki.documentfoundation.org/Development/Easy_Hacks"&gt;Easy Hacks&lt;/a&gt; for ideas where to start.&lt;/p&gt;&lt;p&gt;I promis you that a year from now, you will not regret that you have started. Although, it is quite probable that you will pour a tear over an unused year-pass from the local gym.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-3090181864515858709?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3090181864515858709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3090181864515858709'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2012/01/take-decision-to-enter-foss-in-2012.html' title='Take a decision to enter FOSS in 2012'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-2140887962891101559</id><published>2011-11-15T12:34:00.002+01:00</published><updated>2011-11-15T15:23:53.730+01:00</updated><title type='text'>7th ODF Plugfest in Gouda</title><content type='html'>&lt;p&gt;For those that might care, your servant will be attending this week the &lt;a href="http://www.odfplugfest.org/2011-gouda/" target="_blank"&gt;ODF Plugfest #7&lt;/a&gt; in Gouda (Netherlands).&lt;/p&gt;&lt;p&gt;I will have on Friday a short presentation of the &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;best free and open source library for parsing Microsoft Visio Documents&lt;/a&gt;. The other exciting thing is that after more then 6 years of common collaboration I will get to meet personally one of my &lt;a href="http://libwpd.sourceforge.net" target="_blank"&gt;&lt;code&gt;libwpd&lt;/code&gt;&lt;/a&gt; co-maintainers, &lt;a href="http://abicollab.net/documents/download/462/latest/pdf" target=" _blank"&gt;Johannes Marcus Maurer&lt;/a&gt; also know as &lt;a href="http://uwog.net/" target="_blank"&gt;&amp;quot;uwog&amp;quot;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;What an exciting time before us!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-2140887962891101559?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2140887962891101559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2140887962891101559'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/11/7th-odf-plugfest-in-gouda.html' title='7th ODF Plugfest in Gouda'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-190540897166602854</id><published>2011-11-15T01:25:00.001+01:00</published><updated>2011-11-15T01:26:56.006+01:00</updated><title type='text'>LibreOffice Visio Import filter: the goodness soon on your desktop</title><content type='html'>&lt;p&gt;It has been a long time since I last time blogged about the LibreOffice Visio import filter. My silence did not prevent a pretty cool code from falling gradually into our &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" terget="_blank"&gt;git repository&lt;/a&gt;. To the point where now we are working on the last 5% of features that normally take the 95% of development time. But, let us see what happened since my &lt;a href="http://fridrich.blogspot.com/2011/07/libreoffice-visio-import-filter-round.html" target="_blank"&gt;July blog&lt;/a&gt;:&lt;/p&gt;&lt;p&gt;First of all, &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; was busy as a bee and, in the second half of the Google Summer of Code, implemented support of stylesheets, stencils and basic text. She also debugged and fixed quite a number of imperfections that &lt;a href="http://bugware.livejournal.com/" target="_blank"&gt;Valek&lt;/a&gt; found. Frankly speaking, this Google Summer of Code was by far the best from my point of view. We managed to achieve a very good fidelity of import only in about 3 and half months. Impressive.&lt;/p&gt;&lt;p&gt;During the LibreOffice HackFest weekend in Munich, I had a time to add a support for uniform splines in &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" terget="_blank"&gt;&lt;code&gt;libvisio&lt;/code&gt;&lt;/a&gt; and to implement the actual import in text on the side of LibreOffice.&lt;p&gt;The next highlight was the fact that the whole team met in Paris during the LibreOffice Conference 2011. It was delight to meet in person &lt;a href="http://bugware.livejournal.com/" target="_blank"&gt;Valek&lt;/a&gt; and &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt;. There is even a photo witnessing this meeting:&lt;p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/399TheTeam.jpg" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/399TheTeam_tn.jpg" alt="The Team at LibreOffice Conference 2011 in Paris"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;Valek, me and Eilidh from left to right&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;p&gt;This conference was not only an occasion to know each other a bit better, but also to improve and add some new features to &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" terget="_blank"&gt;&lt;code&gt;libvisio&lt;/code&gt;&lt;/a&gt;. During boring parties full of non-developer talk, we withdrew with &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; to some corner and improved together the text import: paragraph and span properties, text box properties, etc. Later on, &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; added initial support for line markers (aka arrows). Recently we implemented emulation of the last Visio primitive that we did not handle before - Infinite Line.&lt;/p&gt;&lt;p&gt;For those that have big piles of Visio documents on their disks, but cannot read on their favourite Linux distribution: Your pain is coming to an end. The LibreOffice Visio Import filter will be part of LibreOffice 3.5 release, which will be the next major release early next year.&lt;/p&gt;&lt;p&gt;And since images speak louder then thousands of words, here are some pics to illustrate our achievements:&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;OrgChart.vsd in Visio&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;OrgChart.vsd in Draw&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/391OrgChart_vsd_Visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/391OrgChart_vsd_Visio_tn.jpg" alt="OrgChart.vsd in Visio"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/712OrgChart_vsd_Draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/712OrgChart_vsd_Draw_tn.jpg" alt="OrgChar.vsd in Draw"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;You can see the achievement by comparing with the pictures from my &lt;a href="http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-shaping.html" target="_blank"&gt;June blog&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;DNetwork.vsd in Visio&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;DNetwork.vsd in Draw&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/727DNetwork_vsd_Visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/727DNetwork_vsd_Visio_tn.jpg" alt="DNetwork.vsd in Visio"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/590DNetwork_vsd_Draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/590DNetwork_vsd_Draw_tn.jpg" alt="DNetwork.vsd in Draw"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;Compare with the picture from this &lt;a href="http://libregraphicsworld.org/blog/entry/initial-support-for-visio-files-lands-to-libreoffice" target="_blank"&gt;libregraphicsworld.org article&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Calendar.vsd in Visio&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;Calendar.vsd in Draw&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/969Calendar_vsd_Visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/969Calendar_vsd_Visio_tn.jpg" alt="Calendar.vsd in Visio"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/142Calendar_vsd_Draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/142Calendar_vsd_Draw_tn.jpg" alt="Calendar.vsd in Draw"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;This picture shows a good mix of the complicated features like&lt;/br&gt;stencils with NURBS, text fields, gradients, stencil text, etc.&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;/p&gt;&lt;p&gt;If you are impatient and cannot wait anymore, just grab one of the daily builds uploaded by our tinderboxes &lt;a href="http://dev-builds.libreoffice.org/daily/" target="_blank"&gt;here&lt;/a&gt; and enjoy all that goodness on your own.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-190540897166602854?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/190540897166602854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/190540897166602854'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/11/it-has-been-long-time-since-i-last-time.html' title='LibreOffice Visio Import filter: the goodness soon on your desktop'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7971280968624688180</id><published>2011-09-15T14:10:00.000+02:00</published><updated>2011-09-15T14:10:10.798+02:00</updated><title type='text'>LibreOffice Visio import filter on libregraphicsworld.org</title><content type='html'>For those that could be interested in my shameless self-promotion, there is some news about the LibreOffice Visio import filter at  &lt;a href="http://libregraphicsworld.org/news.php?readmore=877"&gt;libregraphicsworld.org&lt;/a&gt; web site, accompanied by a &lt;a href="http://libregraphicsworld.org/articles.php?article_id=41"&gt;fine interview with two fine hackers&lt;/a&gt;. So, click and enjoy the wonderful screenshots in a preview of the happiness LibreOffice 3.5 will bring you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7971280968624688180?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7971280968624688180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7971280968624688180'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/09/libreoffice-visio-import-filter-on.html' title='LibreOffice Visio import filter on libregraphicsworld.org'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-8853981521138259280</id><published>2011-07-08T15:15:00.004+02:00</published><updated>2011-07-08T16:38:57.801+02:00</updated><title type='text'>LibreOffice Visio import filter - round shapes are beautiful</title><content type='html'>&lt;p&gt;Some might be wondering why the Visio import filter project is so quiet. But the answer is easy: we were busy as bees adding new features.&lt;/p&gt;&lt;p&gt;You might remember &lt;a href="http://fridrich.blogspot.com/2011/06/bounding-box-of-svg-elliptical-arc.html" target="_blank"&gt;my blog about the bounding box of an elliptical arc&lt;/a&gt;. It is because &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; added the support of elliptical arcs into &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;&lt;code&gt;libvisio&lt;/code&gt;&lt;/a&gt;. And then we discovered that &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; did not support elliptical arcs in the path at all, just ignored them. Fortunately, there was &lt;a href="http://cgit.freedesktop.org/libreoffice/libs-gui/commit/?id=246168e94709a5ea7f34914d8e246af0985a9c81" target="_blank"&gt;this patch&lt;/a&gt; of a hacker extraordinaire, &lt;a href="http://blog.thebehrens.net/" target="_blank"&gt;Thorsten&lt;/a&gt; that was used to teach &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; some sane behaviour.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; implemented further the conversion of gradient fill and with this and the support of elliptical arcs, this Visio document:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/314Marketing_visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/314Marketing_visio_tn.jpg" alt="Marketing.vsd in Visio"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;looks in Draw pretty well:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/990Marketing_draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/990Marketing_draw_tn.jpg" alt="Marketing.vsd in Draw"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You will realize that we do not support text in Visio documents yet, but be assured that it is now our top priority feature. It is also worthy to note that the above-mentionned document is actually a document in Visio file-format 6 (used by Visio 2000 and Visio XP). We refactored libvisio the way that our support of both version 6 and 11 is equivalent. Moreover, we implemented two-pass parsing of Visio documents which allows us to draw shapes in a correct order and position them accurately.&lt;/p&gt;&lt;p&gt;In the same line, &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; implemented reading of &lt;a href="http://en.wikipedia.org/wiki/NURBS" target="_blank"&gt;NURBS&lt;/a&gt;, which is pretty tedious since the conversion must be done by approximation, since neither ODF, nor SVG support this kind of non-uniform rational basis splines. For the while, we are approximating them with 50 lineto segments for one spline, but it is our intention to use a serie of smooth cubic splines to achieve as much visual similarity as possible.&lt;/p&gt;&lt;p&gt;The &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;&lt;code&gt;libvisio&lt;/code&gt;&lt;/a&gt; library now is able to position correctly any point even if it is in a rotated shape that is part of a group rotated differently, which also might be part of another group with a diferent transformation. This allows us to load this Visio document:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/926Halloween_visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/926Halloween_visio_tn.jpg" alt="Halloween in Visio"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;in Draw this way:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/302Halloween_draw.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/302Halloween_draw_tn.jpg" alt="Halloween in Draw"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can see some graphic problems. The missing shapes are polylines that we will very soon correctly support. Nevertheless, this could be another one of my &amp;quot;we all love ODF, but ...&amp;quot; blogs, because some of the visual glitches are given by the fact that &lt;b&gt;OpenDocument Graphics (ODG)&lt;/b&gt; file-format is suboptimal for representing more complex drawings. One is not even able to specify fill-rules or rules of polygon clipping. Clerly, this SVG inside XHTML version, converted using the &lt;code&gt;vsd2xhtml&lt;/code&gt; tool, that is part of the &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;&lt;code&gt;libvisio&lt;/code&gt;&lt;/a&gt; library, is much closer to the original:&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.picturestoragebin.com/images/599Halloween_xhtml.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/599Halloween_xhtml_tn.jpg" alt="Halloween - SVG in XHTML"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;So, a bottom line is that the project is well alive and kicking. We even tagged the second alpha release and the tarball is now what &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; master build is using. So, if you build your &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; yourself, you will be able to enjoy the fruits of the work or &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt;'s hands and &amp;mdash; why not &amp;mdash; even start to contribute to this cool and interesting project.&lt;/p&gt;&lt;p&gt;Stay tuned for more news soon ...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-8853981521138259280?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8853981521138259280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8853981521138259280'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/07/libreoffice-visio-import-filter-round.html' title='LibreOffice Visio import filter - round shapes are beautiful'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-230316808444797384</id><published>2011-06-20T20:14:00.005+02:00</published><updated>2011-06-20T21:51:15.760+02:00</updated><title type='text'>Bounding Box of an SVG Elliptical Arc</title><content type='html'>&lt;p&gt;We all love ODF, the best and the most vendor-neutral file-format in the Universe and its surroundings. But for sure, we have some spots where we would prefer it to be somehow less cumbersome. My favourite spot is the need to compute the bounding box of the path element when one writes the &lt;code&gt;draw:path&lt;/code&gt; into an OpenDocument Graphics file. Without proper &lt;code&gt;svg:x&lt;/code&gt;, &lt;code&gt;svg:y&lt;/code&gt;, &lt;code&gt;svg:height&lt;/code&gt;, &lt;code&gt;svg:width&lt;/code&gt; and &lt;code&gt;svg:viewBox&lt;/code&gt; values the path will not be correctly placed.&lt;/p&gt;&lt;p&gt;Computing bounding boxes is not so complicated work when everything is a polygon (which is the case in the internal model of &lt;code&gt;basegfx&lt;/code&gt; module), but it becomes a bit more complicated if an application wants to generate paths including elliptical arcs.&lt;/p&gt;&lt;p&gt;I hit this problem about a year ago when I was working during &lt;a href="http://fridrich.blogspot.com/2010/06/hackweek-v-day-1.html" target="_blank"&gt;my hackweek&lt;/a&gt; on an improvement of &lt;a href="http://libwpg.sourceforge.net" target="_blank"&gt;&lt;code&gt;libwpg&lt;/code&gt;&lt;/a&gt;. I tried first to implement the bounding box of an elliptical arc the lazy hacker way, by googling for what other people did. And to my surprise, there is a huge vacuum in what concerns computation of a bounding box of the &amp;quot;&lt;code&gt;A&lt;/code&gt;&amp;quot; element of an SVG path. So, I settled for the lazy hacker's plan B: I abandoned the idea by saying I will handle it later, in the first moment, and by implementing a &lt;a href="http://cgit.freedesktop.org/libreoffice/filters/commit/?id=bcca44ddb4b046ce133896be1b47efcee70bd163" target="_blank"&gt;suboptimal solution&lt;/a&gt; in the second time. But, since &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh&lt;/a&gt; did some spectacular progress last week in handling elliptic arcs, my lazyness became the bottle-neck of the progress. So, it was time to remember those nice times when I was warming the benches of the University, dust off my knowledge of mathematical analysis and analytical algebra (or the lack thereof), and try to compute the bounding box of an elliptical arc myself.&lt;/p&gt;&lt;p&gt;And for the purpose of people that might be as lazy as me, I decided to fight my lazyness the second time to give Uncle Google the opportunity to spit out something meaningful, when someone asks it about &amp;quot;Bounding box of an elliptical arc&amp;quot;. Here are the notes:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Compute extremes using parametric description of ellipse&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Let us start from this parametric description of an ellipse:&lt;/p&gt;&lt;p&gt;&lt;code&gt;x(theta) = cx + rx*cos(theta)*cos(phi) - ry*sin(theta)*sin(phi)&lt;/code&gt;&lt;br/&gt;&lt;code&gt;y(theta) = cy + rx*cos(theta)*sin(phi) + ry*sin(theta)*cos(phi)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;where &lt;code&gt;cx&lt;/code&gt; and &lt;code&gt;cy&lt;/code&gt; are the coordinates of the centre of the ellipse, &lt;code&gt;rx&lt;/code&gt; and &lt;code&gt;ry&lt;/code&gt; are the radii and &lt;code&gt;phi&lt;/code&gt; is the x-axis-rotation.&lt;/p&gt;&lt;p&gt;To compute the bounding box of the whole ellipse we need to find for which value of &lt;code&gt;theta&lt;/code&gt; the above mentioned functions reach the local extremes. It means where the first derivatives of &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; according to &lt;code&gt;theta&lt;/code&gt; are zero. We will get this two equations:&lt;/p&gt;&lt;p&gt;&lt;code&gt;0 = -rx*sin(theta)*cos(phi) - ry*cos(theta)*sin(phi)&lt;/code&gt;&lt;br/&gt;&lt;code&gt;0 = -rx*sin(theta)*sin(phi) - ry*cos(theta)*cos(phi)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;which give us two solutions for &lt;code&gt;x&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;theta = -atan(ry*tan(phi)/rx)&lt;/code&gt; and &lt;code&gt;theta = M_PI -atan(ry*tan(phi)/rx)&lt;/code&gt;&lt;/p&gt;&lt;p&gt;and two solutions for &lt;code&gt;y&lt;/code&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;theta = atan(ry/(tan(phi)*rx))&lt;/code&gt; and &lt;code&gt;theta = M_PI + atan(ry/(tan(phi)*rx))&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Compute the center of the ellipse&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Since we know now the values of &lt;code&gt;theta&lt;/code&gt; describing the extremes of our ellipse, we can compute the &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; values of the bounding box of the whole ellipse. Just to do that, we still need to know the coordinates of the center of the ellipse, &lt;code&gt;cx&lt;/code&gt; and &lt;code&gt;cy&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The computation of the center of the ellipse is pretty well described in the &lt;a href="http://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter" target="_blank"&gt;Appendix F.6.5&lt;/a&gt; of the &lt;a href="http://www.w3.org/TR/SVG/implnote.html" target="_blank"&gt;SVG standard&lt;/a&gt; and does not need to be reproduced here. Just note that for this we need the coordinates of the starting point of the arc that correspond to the end point of the previous path segment.&lt;/p&gt;&lt;/p&gt;&lt;b&gt;Determine the bounding box of the whole ellipse&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Compute the &lt;code&gt;xmin&lt;/code&gt;, &lt;code&gt;xmax&lt;/code&gt;, &lt;code&gt;ymin&lt;/code&gt; and &lt;code&gt;ymax&lt;/code&gt; using the values of &lt;code&gt;theta&lt;/code&gt; for the local extremes and the newly computed &lt;code&gt;cx&lt;/code&gt; and &lt;code&gt;cy&lt;/code&gt; coordinates. Like this not only we will know the bounding box of the whole ellipse, but we will also know which value of &lt;code&gt;theta&lt;/code&gt; corresponds to maximum and which one to minimum. This knowledge will be later valuable for determining the tightest possible bounding box of a given elliptical arc.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Tightest possible bounding box&lt;/b&gt;&lt;/p&gt;&lt;p&gt;By calculation of the bounding box of the whole ellipse, we now know the rectangle that will contain the ellipse and thus our elliptical arc too. Nonetheless, this rectangle is too big for our arc. So, the next thing is to trim it down so that it becomes the tightest possible rectangle that will still contain the whole arc.&lt;/p&gt;&lt;p&gt;For this task, we will use the polar coordinates rather then the cartesian ones. The principle is that if any of the points corresponding to &lt;code&gt;xmin&lt;/code&gt;, &lt;code&gt;xmax&lt;/code&gt;, &lt;code&gt;ymin&lt;/code&gt; or &lt;code&gt;ymax&lt;/code&gt; of the whole ellipse, lie on the arc they will be be the extremes of the arc too. Nevertheless, if for instance the point &lt;code&gt;ymin&lt;/code&gt; does not lie on the arc, the new &lt;code&gt;ymin&lt;/code&gt; will be the minimum of the &lt;code&gt;y&lt;/code&gt; coordinates of the starting and ending points. In the same way, if the point &lt;code&gt;xmax&lt;/code&gt; does not lie on the arc, the new &lt;code&gt;xmax&lt;/code&gt; will be the maximum of the &lt;code&gt;x&lt;/code&gt; coordinates of the starting and ending points. Whether an extreme does or does not lie on our arc is something trivial to see once the arc is drawn, to determine it programatically will require some efforts.&lt;/p&gt;&lt;p&gt;First, we will compute the coordinates of the points where the whole ellipse touches the bounding box using the parametric description of the ellipse and the values of the &lt;code&gt;theta&lt;/code&gt; that we found out in the previous steps. And for determination whether they lie or not on our arc we will use their position in polar coordinates. We will thus need to compute the angles with the x-axis of the lines going through the center of the ellipse and our extreme points. In other terms, we will compute the angle between vector &lt;code&gt;(1,0)&lt;/code&gt; and vector &lt;code&gt;(x&lt;sub&gt;extreme&lt;/sub&gt;-cx, y&lt;sub&gt;extreme&lt;/sub&gt;-cy)&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The formula for computing the angle between two vectors is known and mentioned &lt;i&gt;inter alia&lt;/i&gt; as &lt;a href="http://www.w3.org/TR/SVG/implnote.html#ArcConversionEndpointToCenter" target="_blank"&gt;formula F.6.5.4&lt;/a&gt; of the &lt;a href="http://www.w3.org/TR/SVG/implnote.html" target="_blank"&gt;SVG standard&lt;/a&gt;. Generally, the expression to calculate the angle between a vector &lt;code&gt;(ax,ay)&lt;/code&gt; and a vector &lt;code&gt;(bx,by)&lt;/code&gt; is:&lt;/p&gt;&lt;p&gt;&lt;code&gt;(ax * by &gt; ay * bx ? 1.0 : -1.0) * acos( (ax * bx) + (ay * by) / ( sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by) ) )&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;But since we already know that the first vector is &lt;code&gt;(1,0)&lt;/code&gt;, we can simplify it:&lt;/p&gt;&lt;p&gt;&lt;code&gt;(by &gt; 0.0 ? 1.0 : -1.0) * acos( bx / sqrt(bx * bx + by * by) )&lt;/code&gt;, which could be eventually simplified to &lt;code&gt;atan(by / bx)&lt;/code&gt;, but this expression has a potential division by zero and the code would have to handle those border situations in a special way.&lt;/p&gt;&lt;p&gt;Once we know the angles of the extremes, we still need to calculate the angles of the starting and the end points or our arc using exactly the same formula. So we get &lt;code&gt;angle1&lt;/code&gt; corresponding to our starting point and &lt;code&gt;angle2&lt;/code&gt; corresponding to the endpoint. It is necessary to normalize all angles so that they lie in the interval of &lt;code&gt;[0.0, 2.0*M_PI)&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;In case the &lt;code&gt;sweep&lt;/code&gt; flag is 0, the angles are decreasing when the ellipse is drawn. But, for the computation of bounding box the direction of rotation is irrelevant and only complicates the situation. So we swap the angles if the &lt;code&gt;sweep&lt;/code&gt; flag is not set. In this way, we can just check for the absence of the extreme points on our elliptical arc, rotating from &lt;code&gt;angle1&lt;/code&gt; to &lt;code&gt;angle2&lt;/code&gt;. Nevertheless, we have another difficulty with the fact that the angle of 0 radians is the same as the one of 2*M_PI radians. This passage through the 2*M_PI / 0 border is not very easy to handle directly. That is why we swap the points in case where &lt;code&gt;angle1 &gt; angle2&lt;/code&gt; and will not look in this case for absence of the extreme points on the arc, but for their presence on the complement arc that would close the ellipse.&lt;/p&gt;&lt;p&gt;And as my teachers used to say: &amp;quot;Grey is the theory, but green is the tree of life,&amp;quot; here is what it looks like in a plain C++:&lt;/p&gt;&lt;hr/&gt;&lt;p&gt;&lt;code&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;algorithm&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;cmath&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#ifndef M_PI&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#define M_PI 3.14159265358979323846&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#endif&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;inline&lt;/strong&gt; &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;bx&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;by&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;return&lt;/strong&gt; &lt;font color="#2040a0"&gt;fmod&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;M_PI&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;by&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt; ? &lt;font color="#FF0000"&gt;1.0&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt; &lt;font color="#2040a0"&gt;acos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt; &lt;font color="#2040a0"&gt;bx&lt;/font&gt; / &lt;font color="#2040a0"&gt;sqrt&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;bx&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt; &lt;font color="#2040a0"&gt;bx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;by&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt; &lt;font color="#2040a0"&gt;by&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;)&lt;/font&gt;, &lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;M_PI&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;void&lt;/strong&gt; &lt;font color="#2040a0"&gt;EllpArcBBox&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;x1&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;y1&lt;/font&gt;,&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;phi&lt;/font&gt;, &lt;strong&gt;bool&lt;/strong&gt; &lt;font color="#2040a0"&gt;largeArc&lt;/font&gt;, &lt;strong&gt;bool&lt;/strong&gt; &lt;font color="#2040a0"&gt;sweep&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;,&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;double&lt;/strong&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt;, &lt;strong&gt;double&lt;/strong&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;rx&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1.0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ry&lt;/font&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1.0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;return&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;x1prime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;const&lt;/strong&gt; &lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;y1prime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;radicant&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;radicant&lt;/font&gt; /&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;cxprime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;cyprime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;radicant&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;ratio&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;/&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;radicant&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;y1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;/&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ratio&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ratio&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;radicant&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#FF0000"&gt;0.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;return&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;sqrt&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;radicant&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;ratio&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;factor&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;largeArc&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="#2040a0"&gt;sweep&lt;/font&gt; ? &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#FF0000"&gt;1.0&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#FF0000"&gt;1.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sqrt&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;radicant&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;cxprime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;factor&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;y1prime&lt;/font&gt;/&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;cyprime&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;factor&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;x1prime&lt;/font&gt;/&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cxprime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cyprime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cxprime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;cyprime&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;txmin&lt;/font&gt;, &lt;font color="#2040a0"&gt;txmax&lt;/font&gt;, &lt;font color="#2040a0"&gt;tymin&lt;/font&gt;, &lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;phi&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;M_PI&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;, &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;, &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;, &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;, &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt; &lt;strong&gt;else&lt;/strong&gt; &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;M_PI&lt;/font&gt; / &lt;font color="#FF0000"&gt;2.0&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;phi&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;3.0&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;M_PI&lt;/font&gt;/&lt;font color="#FF0000"&gt;2.0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;, &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;, &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;, &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#FF0000"&gt;0&lt;/font&gt;, &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;else&lt;/strong&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt;&lt;font color="#2040a0"&gt;atan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;tan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;M_PI&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;atan&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;tan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;/&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;xmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt;,&lt;font color="#2040a0"&gt;xmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt;,&lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;tmpY&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;tmpY&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tmpY&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;tmpY&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;atan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;/&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;atan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ry&lt;/font&gt;/&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tan&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;+&lt;/font&gt;&lt;font color="#2040a0"&gt;M_PI&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;ymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt;,&lt;font color="#2040a0"&gt;ymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt;,&lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;tmpX&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tmpX&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tmpX&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt; &lt;font color="4444FF"&gt;+&lt;/font&gt; &lt;font color="#2040a0"&gt;rx&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;cos&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;ry&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;sin&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;phi&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;tmpX&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;getAngle&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;x2&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cx&lt;/font&gt;, &lt;font color="#2040a0"&gt;y2&lt;/font&gt; &lt;font color="4444FF"&gt;-&lt;/font&gt; &lt;font color="#2040a0"&gt;cy&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;sweep&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt;, &lt;font color="#2040a0"&gt;angle2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;bool&lt;/strong&gt; &lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;strong&gt;false&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;swap&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt;, &lt;font color="#2040a0"&gt;angle2&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;strong&gt;true&lt;/strong&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmin&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmax&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;txmax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;xmax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;x2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymin&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymin&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymin&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;otherArc&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;amp;&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;angle1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymax&lt;/font&gt; &lt;font color="4444FF"&gt;|&lt;/font&gt;&lt;font color="4444FF"&gt;|&lt;/font&gt; &lt;font color="#2040a0"&gt;angle2&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;tymax&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;br/&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#2040a0"&gt;ymax&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;gt;&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt; ? &lt;font color="#2040a0"&gt;y1&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;y2&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br/&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br/&gt;&lt;/p&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-230316808444797384?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/230316808444797384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/230316808444797384'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/06/bounding-box-of-svg-elliptical-arc.html' title='Bounding Box of an SVG Elliptical Arc'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-138586417359226376</id><published>2011-06-17T16:21:00.003+02:00</published><updated>2011-06-17T16:25:30.500+02:00</updated><title type='text'>LibreOffice Visio import filter - shaping up the baby</title><content type='html'>&lt;p&gt;Maybe you were asking yourself what happened in the Google Summer of Code Visio Import filter project since &lt;a href="http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-first.html"&gt;last week&lt;/a&gt;. But even if you did not ask yourself this necessary question, here is some update about the baby:&lt;/p&gt;&lt;p&gt;The focus this week was mainly on shaping the baby up. &lt;a href="http://www.derivativezero.com/blog/"&gt;Eilidh&lt;/a&gt; added to her blog a photo and an &amp;quot;About&amp;quot; line and then she got exhausted and decided to rest by coding. And it is like this that she implemented polylines, ellipses and circular arcs.&lt;/p&gt;&lt;p&gt;And since the images speak louder then any words, enjoy the look:&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Microsoft Visio&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;b&gt;LibreOffice Draw&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/997OrgChart_vsd_page1.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/997OrgChart_vsd_page1_tn.jpg" alt="Visio Page 1"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/805OrgChart_vsd_draw_page.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/805OrgChart_vsd_draw_page_tn.jpg" alt="Draw Page 1"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/631OrgChart_vsd_page2.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/631OrgChart_vsd_page2_tn.jpg" alt="Visio Page 2"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/954OrgChart_vsd_draw_page.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/954OrgChart_vsd_draw_page_tn.jpg" alt="Draw Page 2"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/815OrgChart_vsd_page3.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/815OrgChart_vsd_page3_tn.jpg" alt="Visio Page 3"&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.picturestoragebin.com/images/433OrgChart_vsd_draw_page.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/433OrgChart_vsd_draw_page_tn.jpg" alt="Draw Page 3"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;For those interested in some technical details, or even for those that desire to give hand, the code of the &lt;code&gt;&lt;b&gt;libvisio&lt;/b&gt;&lt;/code&gt; library is living &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;here&lt;/a&gt;. And as usual, for any question or encouragement, feel free to join our &lt;a href="irc://chat.freenode.net/libreoffice-dev"&gt;#libreoffice-dev&lt;/a&gt; irc channel at &lt;a href="http://webchat.freenode.net/" target="_blank"&gt;irc.freenode.net&lt;/a&gt;, ping &lt;b&gt;&lt;code&gt;tibbylickle&lt;/code&gt;&lt;/b&gt; and pat her back, if she is not lost too deep inside her Emacs.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-138586417359226376?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/138586417359226376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/138586417359226376'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-shaping.html' title='LibreOffice Visio import filter - shaping up the baby'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-3069577193086252752</id><published>2011-06-10T13:49:00.005+02:00</published><updated>2011-06-10T14:35:16.560+02:00</updated><title type='text'>LibreOffice Visio Import filter - first steps of a new baby</title><content type='html'>&lt;p&gt;The &lt;a href="http://code.google.com/soc/" target="_blank"&gt;Google Summer of Code&lt;/a&gt; started some weeks ago and we have &lt;a href="http://www.google-melange.com/gsoc/org/show/google/gsoc2011/libreoffice" target="_blank"&gt;some nice projects&lt;/a&gt; at &lt;a href="http://www.libreoffice.org/" target="_blank"&gt;LibreOffice&lt;/a&gt; too.&lt;/p&gt;&lt;p&gt;I am having again this year the privilege to mentor a brilliant student &lt;a href="http://www.derivativezero.com/blog/" target="_blank"&gt;Eilidh McAdam&lt;/a&gt; working on a Microsoft Visio import filter. She got up to the speed very quickly to the point that she is now very intimate with any hexadecimal number of any width. And the first results of her diving into the binary world can speak for themselves.&lt;/p&gt;&lt;p&gt;This Visio document : &lt;a href="http://www.picturestoragebin.com/images/8664pixbyporkoudine_visio.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/8664pixbyporkoudine_visio_tn.jpg" alt="Visio Document"&gt;&lt;/a&gt; can be currently imported into LibreOffice Draw: &lt;a href="http://www.picturestoragebin.com/images/8324pixbyporkoudine.png" target="_blank"&gt;&lt;img src="http://www.picturestoragebin.com/images/8324pixbyporkoudine_tn.jpg" alt="LibreOffice Draw document"&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For those that might be interested in such a detail as the source code of this endavour, the filter is developped as two elements, a shared library living &lt;a href="http://cgit.freedesktop.org/libreoffice/contrib/libvisio/" target="_blank"&gt;here&lt;/a&gt; and an import filter based on this library living in the LibreOffice's &lt;code&gt;writerperfect&lt;/code&gt; module.&lt;/p&gt;&lt;p&gt;For any question or encouragement, feel free to join our &lt;a href="irc://chat.freenode.net/libreoffice-dev"&gt;#libreoffice-dev&lt;/a&gt; irc channel at &lt;a href="http://webchat.freenode.net/" target="_blank"&gt;irc.freenode.net&lt;/a&gt; and ping &lt;b&gt;&lt;code&gt;tibbylickle&lt;/code&gt;&lt;/b&gt; (for encouragements) or &lt;b&gt;&lt;code&gt;Fridrich&lt;/code&gt;&lt;/b&gt; (for blames).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-3069577193086252752?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3069577193086252752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3069577193086252752'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/06/libreoffice-visio-import-filter-first.html' title='LibreOffice Visio Import filter - first steps of a new baby'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7728215511729177066</id><published>2011-03-03T22:04:00.004+01:00</published><updated>2011-03-03T22:16:57.056+01:00</updated><title type='text'>opensuse-mingw mailing list</title><content type='html'>&lt;p&gt;The &lt;a href="https://build.opensuse.org/project/show?project=windows%3Amingw" target="_blank"&gt;windows::mingw&lt;/a&gt; project and its sub-project quickly gain a true community around themselves. This week, the number of source packages that we build for Windows in &lt;a href="https://build.opensuse.org" target="_blank"&gt;openSUSE Build Service&lt;/a&gt; reached 200 for both the &lt;a href="https://build.opensuse.org/project/show?project=windows%3Amingw%3Awin32" target="_blank"&gt;32-bit&lt;/a&gt; as well as &lt;a href="https://build.opensuse.org/project/show?project=windows%3Amingw%3Awin64" target="_blank"&gt;64-bit&lt;/a&gt; Windows versions.&lt;/p&gt;&lt;p&gt;In order to make the communication between contributors, developers and users easier, we got a sparkling new mailing list at &lt;a href="http://lists.opensuse.org/" target="_blank"&gt;lists.opensuse.org&lt;/a&gt;. You can subscribe it by sending a mail to &lt;a href="mailto:opensuse-mingw+subscribe@opensuse.org"&gt;opensuse-mingw+subscribe@opensuse.org&lt;/a&gt; and enjoy all the intelligent and edifying talk we are having there.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7728215511729177066?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7728215511729177066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7728215511729177066'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/03/opensuse-mingw-mailing-list.html' title='opensuse-mingw mailing list'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6881702980756622678</id><published>2011-02-26T08:07:00.004+01:00</published><updated>2011-02-26T08:24:19.589+01:00</updated><title type='text'>Voreppe Win32 Tinderbox</title><content type='html'>&lt;p&gt;As you can see &lt;a href="http://tinderbox.go-oo.org/MASTER/status.html" target="_blank"&gt;here&lt;/a&gt;, we have now a working Windows tinderbox. It finished tonight its first successful build of &lt;b&gt;master&lt;/b&gt; branch and will send you nagging e-mails for any breakages from now on. It is our hope that this tinderbox will help us to keep &lt;a href="http://www.libreoffice.org" target="_blank"&gt;LibreOffice&lt;/a&gt; buildable on Windows much easier.&lt;/p&gt;&lt;p&gt;This tinderbox is running Windows Server 2008 R2 Service Pack 1 with Visual Studio 2008 Service Pack 1 and Windows SDK 7.1. The server was graciously given at the disposition of the &lt;a href="http://www.libreoffice.org/" target="_blank"&gt;LibreOffice&lt;/a&gt; community by the French town of &lt;a href="http://www.voreppe.fr/" target="_blank"&gt;Voreppe&lt;/a&gt; through the association &lt;a href="http://www.lamouette.org/" target="_blank"&gt;La Mouette&lt;/a&gt;. I want to personally thank &lt;a href="http://www.voreppe.fr/_Laurent-Godard_.html" target="_blank"&gt;Laurent Godard&lt;/a&gt;, a long-time community member and contributor who was more then instrumental in this transaction.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6881702980756622678?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6881702980756622678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6881702980756622678'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2011/02/voreppe-win32-tinderbox.html' title='Voreppe Win32 Tinderbox'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-3209108133185065892</id><published>2010-09-11T10:53:00.001+02:00</published><updated>2010-09-11T10:53:56.813+02:00</updated><title type='text'>GNU Make 3.82</title><content type='html'>&lt;p&gt;Just noticed that this kind of constructs chokes GNU Make 3.82&lt;/p&gt;&lt;pre&gt;     test x$CC = x &amp;&amp; CC = gcc&lt;/pre&gt;&lt;p&gt;It can be replaced by&lt;/p&gt;&lt;pre&gt;     CC ?= gcc&lt;/pre&gt;&lt;p&gt;Which can be written in a long form:&lt;/p&gt;&lt;pre&gt;     ifeq ($(origin CC), undefined)
     CC= gcc
     endif&lt;/pre&gt;&lt;p&gt;The other thing that is making this version of GNU Make choke are leading spaces in multi-line rules. Please, &lt;b&gt;use tabs when writing Makefiles&lt;/b&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-3209108133185065892?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3209108133185065892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3209108133185065892'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2010/09/gnu-make-382.html' title='GNU Make 3.82'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-542424063136942715</id><published>2010-06-07T18:12:00.000+02:00</published><updated>2010-06-07T18:13:10.563+02:00</updated><title type='text'>Hackweek V - Day 1</title><content type='html'>&lt;p&gt;It is Hackweek V here at Novell. And as with all good things that are supposed to start on Monday, and end on Friday, the best thing is that they can start on Friday evening and go until the night becomes a dawn on Monday morning. It is in this spririt that I started to do some preparation to the long overdue release of &lt;a href="http://libwpd.sourceforge.net"&gt;libwpd&lt;/a&gt; &lt;a href="http://libwpg.sourceforge.net"&gt;libwpg&lt;/a&gt; and all projects that are depending on these two. Already during the week-end I fixed some obvious regressions in &lt;a href="http://libwpg.sourceforge.net"&gt;libwpg&lt;/a&gt;, caused by the complete API rewrite. I added some callbacks to the &lt;a href="http://libwpd.sourceforge.net"&gt;libwpd&lt;/a&gt;'s API, so that we can try to support named styles during the 0.9.x series and will not have to break ABI too soon (libwpd 0.8.x were API stable for about 5 years). And today, I was playing with some more regressions and bugs found by &lt;b&gt;sum1&lt;/b&gt;, the best QA person that I know.&lt;/p&gt;&lt;p&gt;The fun part for &lt;a href="http://libwpg.sourceforge.net"&gt;libwpg&lt;/a&gt; was to somehow start to support elliptical arcs so that some &lt;a href="http://go-oo.org/~fridrich/win32/transform-00b1a.svg"&gt;graphs&lt;/a&gt; can have nice smooth edges. This is when one converts the WPG files to SVG. Another fun was generating ODG. Although the ODF 1.1 specifications somehow allow to have elliptical arcs in a path, &lt;a href="http://www.openoffice.org"&gt;the reference implementation of ODF&lt;/a&gt; does not render them. Needless to say that it is pretty tedious task to try to compute a proper bounding box for a path that has only one elliptical element. Just wondering whether ODG can ever become so easy to use and as expressive as SVG. Never mind, just ranting!&lt;/p&gt;&lt;p&gt;The other thing that I wanted to work on during hackweek was the Evolution installer that &lt;a href="http://fridrich.blogspot.com/2010/05/experimental-evolution-installer-for.html"&gt;I spoke about some time ago&lt;/a&gt;. Nonetheless, it would be not wise (the less one can say) to put that as a principal task for oneself. Unless, one is crazy in love with progress-bars and enjoys staring at them for 15-20 minutes in row. But, I can report some progress in there. It is now possible to &lt;a href="http://go-oo.org/~fridrich/win32/langchoice.png"&gt;install only the languages one wants&lt;/a&gt;, although that functionality must be somehow fine-tuned so that we don't publish languages where only one of the &lt;code&gt;*.mo&lt;/code&gt; files is present. Another little work was done in order to make the installer Welcome page a bit more &lt;a href="http://go-oo.org/~fridrich/win32/evo-welcome.png"&gt;sexy&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For those that would like to debug Evolution on Windows, there is now a debug installer in the dummy rpm file that I mentioned in my &lt;a href="http://fridrich.blogspot.com/2010/05/experimental-evolution-installer-for.html"&gt;previous blog post&lt;/a&gt;. This &lt;a href="http://go-oo.org/~fridrich/win32/evo-debug-installer.png"&gt;debug installer&lt;/a&gt; will install the debug symbols for all &lt;code&gt;DLLs&lt;/code&gt; and &lt;code&gt;EXEs&lt;/code&gt; in the Evolution installer and will add also a working &lt;code&gt;gdb.exe&lt;/code&gt; as a courtesy of your faithful.&lt;/p&gt;&lt;p&gt;Last, but not least, I would like to announce officially that a &lt;a href="http://go-oo.org/~fridrich/win64/Evolution-Win64.png"&gt;64-bit evolution&lt;/a&gt; starts and work on a 64-bit Windows operating system. It can even show some &lt;a href="http://go-oo.org/~fridrich/win64/EvoWin64MeeksBlog.png"&gt;fancy blog entries&lt;/a&gt;. Please, don't focus on the content, or lack thereof :-P, rather enjoy the nice picture) of rss plugin using 64-bit version of &lt;a href="http://webkitgtk.org/"&gt;webkit-gtk&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-542424063136942715?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/542424063136942715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/542424063136942715'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2010/06/hackweek-v-day-1.html' title='Hackweek V - Day 1'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-4151862975036615121</id><published>2010-05-25T16:48:00.004+02:00</published><updated>2011-06-16T12:40:55.459+02:00</updated><title type='text'>Experimental Evolution installer for Windows</title><content type='html'>&lt;p&gt;It is a pleasure, fun and honour to introduce to the distinguished audience our newest &lt;a href="http://projects.gnome.org/evolution/"&gt;Evolution&lt;/a&gt; installer for Windows. You can find it for instance in &lt;a href="http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_11.4/noarch/"&gt; this repository&lt;/a&gt; of our wonderful &lt;a href="http://build.opensuse.org"&gt;openSUSE Build Service&lt;/a&gt;. The installer is hiding in &lt;code&gt;/usr/i686-pc-mingw32/sys-root/mingw&lt;/code&gt; directory of the &lt;code&gt;mingw32-evolution-installer&lt;/code&gt; RPM. For people that don't know what to do with RPM packages on windows, &lt;a href="http://7-zip.org/"&gt;7-zip&lt;/a&gt; does just a wonderful job at unpacking RPMs even if they use LZMA payload.&lt;/p&gt;&lt;p&gt;As you can see from following pictures,&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32InstallerWelcome.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32InstallerWelcome.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32InstallerFolders.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32InstallerFolders.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32InstallerShortCuts.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32InstallerShortCuts.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32InstallerRunning.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32InstallerRunning.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;the functionality offered by the installer is basic for instance. Nevertheless, it does the most important job which is to install Evolution on your windows box.&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32InstallerLaunchEvo.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32InstallerLaunchEvo.png"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;On the first launch, Evolution will register itself as a mail client able to handle mailto protocol and it also registeres the necessary verbs to be able to become default mail client on Windows,&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32SPAD.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32SPAD.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;and on versions of Windows where the start menu Internet and E-mail links are supported, it can install its icon and open verb in that region:&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32DefaultMailer.png"&gt; &lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32DefaultMailer.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Apart of those technicalities, it can be used to read mail:&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32Mail.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32Mail.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;to manage one's contacts and timetables, even to understand why one is feeling suddenly so hot:&lt;/p&gt;&lt;p&gt;&lt;a href="http://projects.gnome.org/evolution/images/screenshots/win32/EvoWin32CalendarWeather.png"&gt;&lt;img src="http://projects.gnome.org/evolution/images/screenshots/win32/thumb_EvoWin32CalendarWeather.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Not to mention that evolution will in principle detect your timezone and even your &lt;a href="http://fridrich.blogspot.com/2010/03/isensnetwork-based-network-monitor-for.html"&gt; online status&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The installer is for the development series of Evolution (2.31.x). It is possible to produce one for the "stable" (2.30.x) branch, but the quality of both branches on Windows is comparable and doing a "stable" installer would be slightly missleading for the user. Having said that, this version is quite usable although, I would not advise anybody to use it in mission-critical environment yet. But if you decide to adventure into this, it will be enriching endavour for all of us. The bugs can be filed in &lt;a href="http://bugzilla.gnome.org"&gt;GNOME Bugzilla&lt;/a&gt; against evolution. Help us to make it better!&lt;/p&gt;&lt;p&gt;&lt;b&gt;OpenSUSE Build Service&lt;/b&gt;&lt;/p&gt;&lt;p&gt;What is really really really cool with this installer is that it is produced completely inside the &lt;a href="http://build.opensuse.org"&gt;openSUSE Build Service&lt;/a&gt;, a wondeful tool, a once-in-a-lifetime innovation. All the binaries are cross-compiled from Linux and the installer is produced by a version of &lt;a href="http://nsis.sourceforge.net/"&gt;Nullsoft Scriptable Install System&lt;/a&gt; running on Linux and producing Windows installers. The installer is automatically regenerated when the rebuild of Evolution is triggered by any event: change in dependencies, change in Evolution version, etc. It requires a minimum maintainance and is a good starting point for improving further. Since such improvement can now be an incremental one building on the top of the existing infrastructure.&lt;/p&gt;&lt;p&gt;I will never say it enough, but &lt;a href="http://build.opensuse.org"&gt;openSUSE Build Service&lt;/a&gt; is one of the best invention on the earth since the &lt;i&gt;Butterbrot&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-4151862975036615121?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4151862975036615121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4151862975036615121'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2010/05/experimental-evolution-installer-for.html' title='Experimental Evolution installer for Windows'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1084843187558515195</id><published>2010-03-29T15:39:00.001+02:00</published><updated>2010-03-29T16:20:25.898+02:00</updated><title type='text'>ISensNetwork based network monitor for Evolution</title><content type='html'>&lt;p&gt;These weeks I was using my spare cycles to prepare evolution to be buildable and running before the GNOME 2.30 freeze. One of the things that Evolution for windows was missing was an alternative for the NetworkManager network connection detection module. I crafted one using Windows &lt;a href="http://msdn.microsoft.com/en-us/library/aa377384%28VS.85%29.aspx"&gt;ISensNetwork&lt;/a&gt; COM interface. The result is to be found &lt;a href="http://git.gnome.org/browse/evolution/tree/modules/windows-sens/evolution-windows-sens.c"&gt;here&lt;/a&gt; for those that might be interested in seeing how to implement COM callbacks in plain C.&lt;/p&gt;&lt;p&gt;There are some examples out there showing how to implement ISensNetwork. One of them using heavy ATL framework is to be found &lt;a href="http://support.microsoft.com/kb/321381"&gt;here&lt;/a&gt;. Another, one, using C++ is to be found &lt;a href="http://files.codes-sources.com/fichier.aspx?id=40728&amp;f=Detecteur\detecteur.cpp"&gt;here&lt;/a&gt;. Both examples have a little problem that actually prevents them from being properly used from unprivileged account, although they work well when Administrator runs them. The problem is that the registering of the event subscription will return &lt;code&gt;E_ACCESSDENIED&lt;/code&gt;. Judging from the number of post on different fora when one querries Uncle Google, the solution is not very known. If you have the same problem, please check the &lt;a href="http://go-oo.org/~fridrich/testsens.c.html"&gt;plain C example&lt;/a&gt; that I crafted using the above-mentioned C++ code as a base. I discovered that specifying that the subscription is a per user one, by using &lt;code&gt;IEventSubscription::put_PerUser(..)&lt;/code&gt; method allows your program to register for system events even if it is run as unprivileged user. The &lt;a href="http://go-oo.org/~fridrich/testsens.c"&gt;source code&lt;/a&gt; can be built with different flavours of MinGW and also with Visual Studio and the program installs an icon in the system tray that will notify you when connection status of your computer changes. &lt;/p&gt;&lt;p&gt;By the way, there is not a lot of sample code out there that would use COM from a plain C. Apart &lt;a href="http://git.gnome.org/browse/gtk+/tree/gdk/win32/gdkdnd-win32.c"&gt;excellent code&lt;/a&gt; produced by my colleague and object of mute admiration, &lt;a href="http://tml-blog.blogspot.com/"&gt;Tor Lillqvist&lt;/a&gt;, there is an wonderful serie of articles by Jeff Glatt. It is worth reading for anybody that wants to do COM the real men's way, in plain C. Here are the links to &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc1.aspx"&gt;part 1&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc2.aspx"&gt;part 2&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc3.aspx"&gt;part 3&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5F%5Fc4.aspx"&gt;part 4&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc5.aspx"&gt;part 5&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc6.aspx"&gt;part 6&lt;/a&gt;, &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc7.aspx"&gt;part 7&lt;/a&gt; and &lt;a href="http://www.codeproject.com/KB/COM/com%5Fin%5Fc8.aspx"&gt;part 8&lt;/a&gt;. It is worth to register and get the example code as well as a neat clean html version of the articles. It is enough to download the files linked from the &lt;a href="http://www.codeproject.com/KB/COM/com_in_c8/com_in_c8_src.zip"&gt;part 8&lt;/a&gt; since they are always cumulated with all files from all previous parts.&lt;/p&gt; 
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1084843187558515195?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1084843187558515195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1084843187558515195'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2010/03/isensnetwork-based-network-monitor-for.html' title='ISensNetwork based network monitor for Evolution'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7575066643569328364</id><published>2010-03-02T09:27:00.002+01:00</published><updated>2010-03-02T09:31:08.720+01:00</updated><title type='text'>DBus for windows in windows:mingw repositories</title><content type='html'>&lt;p&gt;Last night two important new packages landed into &lt;code&gt;windows:mingw:win32&lt;/code&gt; and &lt;code&gt;windows:mingw:win64&lt;/code&gt; projects and repositories in &lt;a href="http://build.opensuse.org"&gt;openSUSE build service&lt;/a&gt;: &lt;code&gt;mingw32-dbus-1&lt;/code&gt; and &lt;code&gt;mingw32-dbus-1-glib&lt;/code&gt; glib bindings for 32-bit Windows and &lt;code&gt;mingw64-dbus-1&lt;/code&gt; and &lt;code&gt;mingw64-dbus-1-glib&lt;/code&gt; for 64-bit Windows. Although, they are known to work in certain setting, they might be buggy in others. So, if you build for Windows some package that needs Dbus, please use these rpms to solve that dependency. And if you find bugs, just report them against the corresponding repository. We will take care of investigating and pushing the reports up the stream.&lt;/p&gt;&lt;p&gt;As a nice result of this new packages would be that the development version of &lt;code&gt;evolution-data-server&lt;/code&gt; and &lt;code&gt;evolution&lt;/code&gt; should be buildable now on Windows too. Not tried yet though, but I know someone who did ;-)&lt;/p&gt;&lt;p&gt;Note that the dbus-1 package is based on the latest development tarball (1.3.0) and is brought to the level of recent git master by a patch inside the rpm package. The dbus-1-glib is basically the 0.84 tarball with a little patch allowing cross-compiling and disabling one test that hard-codes the use of Unix sockets.&lt;/p&gt;&lt;p&gt;So, please, use those packages, stress-test them and report all useful information.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7575066643569328364?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7575066643569328364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7575066643569328364'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2010/03/dbus-for-windows-in-windowsmingw.html' title='DBus for windows in windows:mingw repositories'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6283574403973606330</id><published>2009-09-14T09:47:00.003+02:00</published><updated>2009-09-14T09:51:21.515+02:00</updated><title type='text'>DJGPP crosscompiler for DOS in openSUSE build service</title><content type='html'>&lt;p&gt;In case you need to build some binaries for some kind of DOS based bootstrap process, don't look far, the repository &lt;a href="http://download.opensuse.org/repositories/home:/fstrba:/msdos/"&gt;home:fstrba:msdos&lt;/a&gt; has all you need. A gcc-4.3.4 based cross-compiler for C and C++ along with the CVS HEAD version of &lt;a href="http://www.delorie.com/djgpp/"&gt;DJGPP&lt;/a&gt; headers and libraries. The resulting executables running under DOS need a DPMI implementation like &lt;a href="http://clio.rice.edu/cwsdpmi/"&gt;this one&lt;/a&gt; in the same directory to run.&lt;/p&gt;&lt;p&gt;When/If I have time, I will try to extend it to different languages supported by gcc.&lt;/p&gt;&lt;p&gt;Taste it and enjoy how sweet it is.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6283574403973606330?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6283574403973606330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6283574403973606330'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2009/09/in-case-you-need-to-build-some-binaries.html' title='DJGPP crosscompiler for DOS in openSUSE build service'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6330706578240413153</id><published>2009-06-09T14:26:00.002+02:00</published><updated>2009-06-09T14:26:57.743+02:00</updated><title type='text'>Contacts for Windows</title><content type='html'>&lt;p&gt;Yesterday, I saw a nice little application landing its first release on &lt;a href="ftp://ftp.gnome.org"&gt;ftp.gnome.org&lt;/a&gt;. Its name is &lt;b&gt;contacts&lt;/b&gt;. As I love challenges, I spent some time in my evening porting it to Windows&amp;reg;. You can see the result &lt;a href="http://go-oo.org/~fridrich/win32/evo-contacts-and-intel-contacts.png"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It has a very basic user interface and I had to disable the bacon stuff, because I did not manage to finish its port, but it basically works and interacts with your local evolution address-book. Read and write.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6330706578240413153?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6330706578240413153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6330706578240413153'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2009/06/contacts-for-windows.html' title='Contacts for Windows'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1229002774982421806</id><published>2009-05-05T09:34:00.003+02:00</published><updated>2009-05-06T15:53:48.430+02:00</updated><title type='text'>When the rules apply only to some of us</title><content type='html'>&lt;p&gt;It is normally a rule for the community not to do any big and potentially risky changes in &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; months before release. UI-freeze, feature-freeze are dates that if you miss them, your feature or fix will have to wait for the next release, or eventually for &lt;code&gt;OOoLater&lt;/code&gt; tag. This is always true ...&lt;/p&gt;&lt;p&gt;... unless you are not the community member, but Sun employee. In that case, the rule starts to be a more flexible one.&lt;/p&gt;&lt;p&gt;To cut the thing short, if you are community member and are building ooo310-m11 with Windows and cygwin (and maybe only with Visual Studio 9, which is what Sun uses), you will realize that something changed and your build will consistently crash in the &lt;code&gt;python&lt;/code&gt; module. The binary that will crash is the &lt;code&gt;vcbuild.exe&lt;/code&gt; binary. What happened? Just our friends from Sun upgraded the python version of &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; from 2.3.4 to 2.6.1 between release candidate 1 and release candidate 2. Theoretically, only show-stopper fixes are allowed in the RC phase, but since the rule is flexible depending on which side you are sitting, this could happen.&lt;/p&gt;&lt;p&gt;So, if you are on the wrong side of the flexibility, here is what can bail you out:&lt;/p&gt;&lt;p&gt;&lt;code&gt;--- python/makefile.mk 2009-05-05 08:58:50.745625000 +0200&lt;br&gt;+++ python/makefile.mk 2009-05-05 08:59:45.261250000 +0200&lt;br&gt;@@ -117,11 +117,7 @@&lt;br&gt;&amp;nbsp;# Build python executable and then runs a minimal script. Running the minimal script&lt;br&gt;&amp;nbsp;# ensures that certain *.pyc files are generated which would otherwise be created on&lt;br&gt;&amp;nbsp;# solver during registration in insetoo_native&lt;br&gt;-.IF $(SYSBASE) != ""&lt;br&gt;-BUILD_ACTION=$(COMPATH)$/vcpackages$/vcbuild.exe -useenv pcbuild.sln "Release|Win32"&lt;br&gt;-.ELSE&lt;br&gt;&amp;nbsp;BUILD_ACTION=$(COMPATH)$/vcpackages$/vcbuild.exe pcbuild.sln "Release|Win32"&lt;br&gt;-.ENDIF # $(SYSBASE) != ""&lt;br&gt;&amp;nbsp;.ENDIF&lt;br&gt;&amp;nbsp;.ENDIF&lt;/code&gt;&lt;/p&gt;&lt;p&gt;But given the way this was rushed through, don't be surprised if you have other problems later.&lt;/p&gt;&lt;p&gt;BTW, it is not like this &lt;a href="http://www.nabble.com/ok-to-use-vcbuild.exe-tool----td22588240.html"&gt;problem&lt;/a&gt; was not known about beforehand.&lt;/p&gt;&lt;p&gt;Game, set, match for &amp;quot;Quality through process&amp;quot; approach.&lt;/p&gt;&lt;p/&gt;&lt;p&gt;&lt;b&gt;UPDATE&lt;/b&gt;:&lt;/p&gt;&lt;p&gt;As pointed out on IRC, it is true that many people worked hard to make this - as agreed necessary - change possible at the late stage. I did not intend to offend them and stand to be corrected. The point here is that such changes are pretty risky at the late stage of release cycle especially because upstream does not use the same build environment as community. In the times where I was still bothering to push updates for libwpd upstream, I was often a victim of many procedural hickups. So, seeing a fast-track risky change in last moment is reminding me of all the hours fighting the bureaucracy. But, again, not intending to offend anybody.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1229002774982421806?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1229002774982421806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1229002774982421806'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2009/05/when-rules-apply-only-to-some-of-us.html' title='When the rules apply only to some of us'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-5821580633027933740</id><published>2009-04-28T15:42:00.001+02:00</published><updated>2009-04-28T15:50:25.526+02:00</updated><title type='text'>HUNDRED (packages in windows:mingw:win32)</title><content type='html'>&lt;p&gt;It has been long time since I blogged for the last time and quite things changed since: My daughter and my son took one more year and my wife is every day more beautiful and younger.&lt;/p&gt;&lt;p&gt;It is not that I was not having things to blog about, but the main quality of many FOSS hackers, lazyness, is the reason of this relative quietness. But now there is something really really cool that pushes me to blog again: At the end of 2008 and in the beginning of 2009 I was trying to come up with a repeatable and dependable way to build GTK+ and GNOME software for Windows.&lt;/p&gt;&lt;p&gt;I, myself, maintain several libraries and I build their Win32 versions on my Linux box as I described it &lt;a href="http://fridrich.blogspot.com/2007/09/on-way-to-desktop-freedom.html"&gt;here&lt;/a&gt;. So, the cross-compilation came as a natural reflex. I inspired myself by the infrastructure that the Fedora mingw project used and started to go through the usual cycle of &lt;code&gt;while (!tired()) { build(); debug; }&lt;/code&gt;. And last night, I reached a milestone. My &lt;a href="http://download.opensuse.org/repositories/windows:/mingw:/win32/"&gt;package repository&lt;/a&gt; hosted by &lt;a href="http://build.opensuse.org"&gt;openSUSE Build Service&lt;/a&gt; received its package number &lt;b&gt;hundred&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Why am I saying all this? In fact, these packages are not only there to be a decoration. Many times, people that know about my work ask me for packages of different libraries. All the stuff that I build (or almost all can be found there). People asking for win32 version of the &lt;a href="http://www.go-oo.org/~fridrich/win32/Webkit-glib-unicode-win32.png"&gt;GTK+ port of Webkit&lt;/a&gt; can be interested in the &lt;code&gt;mingw32-libwebkit&lt;/code&gt; package. Those that would gladly try to use &lt;a href="http://www.go-oo.org/~fridrich/win32/evolution-rss-win32.png"&gt;Evolution as their mail client on windows&lt;/a&gt;, can find the updated &lt;code&gt;mingw32-evolution&lt;/code&gt; package useful. It is enough to add the repository to your installation sources and lauch &lt;code&gt;zypper ref; zypper in mingw32-evolution mingw32-tango-icon-theme&lt;/code&gt; and the rpm dependency resolution mechanism will pull all you need for you. After that, you can just zip the content of &lt;code&gt;/usr/i686-pc-mingw32/sys-root/mingw&lt;/code&gt; directory and you can unzip the resulting package on your windows box. As simple as that!&lt;/p&gt;&lt;p&gt;For developpers that would like to cherry-pick packages and use them to develop their own, it is the best to to fetch them from &lt;a href="http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_10.3/noarch/"&gt;the openSUSE 10.3&lt;/a&gt; version of the repository. For later releases, &lt;a href="http://www.opensuse.org"&gt;openSUSE&lt;/a&gt;'s &lt;i&gt;rpm&lt;/i&gt; uses lzma payload and it can be a bit more tricky to uncompress the packages on a typical windows machine, although &lt;i&gt;7zip&lt;/i&gt; should know what to do with them, I guess.&lt;/p&gt;&lt;p&gt;As a technical information for developpers, all the binaries are stripped of unnecessary sections and the debugging information can be found for each source package in a separate package typically named &lt;code&gt;mingw32-%{name}-debug-%{version}-%{release}.noarch.rpm&lt;/code&gt;. Uncompressing them in the same prefix as the corresponding binary packages will cause &lt;i&gt;gdb.exe&lt;/i&gt; to use their symbols and you can produce meaningfull traces.&lt;/p&gt;&lt;p&gt;I still contend that the best way to use those packages for developping your own software is in an openSUSE installation. And the side benefit is that in this way one gets not only nice development environment for Windows development, but also the arguably best operating system in the world as a host.&lt;/p&gt;&lt;p&gt;I might take some more courage and write about Windows porting of software when I rest from writing this blog entry. While waiting, it is worth to read this &lt;a href="http://www.iki.fi/tml/fosdem-2006.pdf"&gt;little collection of slides&lt;/a&gt; of my distinguished colleague and incontested master of win32 porting, &lt;a href="http://tml-blog.blogspot.com/"&gt;Tor Lillqvist&lt;/a&gt;. Everything I know about win32 is because of sitting at his feet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-5821580633027933740?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5821580633027933740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5821580633027933740'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2009/04/hundred-packages-in-windowsmingwwin32.html' title='HUNDRED (packages in windows:mingw:win32)'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6868282274675965645</id><published>2008-10-07T09:18:00.000+02:00</published><updated>2008-10-07T09:19:28.118+02:00</updated><title type='text'>Just in case you did not see this one</title><content type='html'>&lt;p&gt;&lt;a href="http://www.keatingeconomics.com/"&gt;http://www.keatingeconomics.com/&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6868282274675965645?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6868282274675965645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6868282274675965645'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2008/10/just-in-case-you-did-not-see-this-one.html' title='Just in case you did not see this one'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-151264067619437074</id><published>2008-02-18T10:36:00.003+01:00</published><updated>2008-02-18T10:55:20.320+01:00</updated><title type='text'>Yes, we can!</title><content type='html'>&lt;p&gt;Starting to realize more and more how much different would be &lt;a href="http://www.barackobama.com"&gt;Obama's&lt;/a&gt; America from the Bushistan we know today.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=2fZHou18Cdk"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/2fZHou18Cdk&amp;rel=1&amp;border=0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/2fZHou18Cdk&amp;rel=1&amp;border=0" type="application/x-shockwave-flash" wmode="transparent"width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-151264067619437074?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/151264067619437074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/151264067619437074'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2008/02/yes-we-can.html' title='Yes, we can!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-3679526833243670448</id><published>2008-02-14T11:26:00.002+01:00</published><updated>2008-02-14T11:34:13.698+01:00</updated><title type='text'>Happy birthday, Miriam!</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://go-oo.org/%7Efridrich/miriam_1year.jpg"&gt;&lt;img src="http://go-oo.org/%7Efridrich/thumb_miriam_1year.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Happy birthday, Mirka!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-3679526833243670448?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3679526833243670448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3679526833243670448'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2008/02/happy-birthday-miriam.html' title='Happy birthday, Miriam!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-8665694691262986641</id><published>2008-01-15T12:38:00.000+01:00</published><updated>2008-01-15T12:40:20.879+01:00</updated><title type='text'>Pleased</title><content type='html'>&lt;p&gt;Your servant is extremely pleased to see &lt;a href="http://blogs.sun.com/dancer/entry/lenovo_now_also_pre_installing"&gt;Erwin&lt;/a&gt; advertize a laptop that is running &lt;a href="http://www.novell.com/products/desktop/"&gt;SUSE Linux Enterprise Desktop 10&lt;/a&gt; and &lt;a href="http://go-oo.org"&gt;OpenOffice.org Novell Edition&lt;/a&gt;. Thanks, dudie!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-8665694691262986641?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8665694691262986641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8665694691262986641'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2008/01/pleased.html' title='Pleased'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1491802588222133754</id><published>2007-11-22T13:45:00.000+01:00</published><updated>2007-11-22T17:38:25.161+01:00</updated><title type='text'>Frankfurter Allgemeine hacking</title><content type='html'>&lt;p&gt;It was decided on Tuesday afternoon, that I should converge to Nuernberg to meet my favourite manager JPR and my dear colleague Florian, in order to complot about possible changes to Writer core in order to increase its interoperability with one competing product.&lt;/p&gt;&lt;p&gt;Since the decision was a little bit short notice, the only way to travel was the train. So, I took a night train from Geneva at 19:14 and passed Basel and Frankfurt Flughafen (sic) to arrive finally at 8:02 to Nuernberg.&lt;/p&gt;&lt;p&gt;What a wonderful journey of almost 13 hours of pure hacking pleasure. Especially that German ICE trains have electric plugs under every seat. Like that I was always able to recharge my laptop battery and use it during the long hours between trains. Especially, during the more then two hours in the empty Frankfurt Airport railways station.&lt;/p&gt;&lt;p&gt;An attentive reader is asking &amp;quot;why all this bla-bla?&amp;quot; And the answer is that thanks to Jaroslav Fojtik of &lt;a href="http://www.penguin.cz/~fojtik/wp2latex/wp2latex.htm"&gt;wp2latex&lt;/a&gt; fame, thanks to his reverse-engineering skills, and also thanks to my dearest employer and to this long journey, I was able to touch 275 files and make the HEAD CVS &lt;code&gt;libwpd&lt;/code&gt; support conversion of password-protected and encrypted documents for almost all supported file-formats (except WP6+ that we were not able to decrypt for the while).&lt;/p&gt;&lt;p&gt;I also forgot to mention, that since a week or so, the duo &lt;code&gt;libwpd-writerperfect&lt;/code&gt; is not depending on any desktop specific library. &lt;code&gt;Writerperfect&lt;/code&gt; can still use &lt;code&gt;libgsf&lt;/code&gt; for the zip output if one insists by giving it a configure option &lt;code&gt;--with-libgsf&lt;/code&gt;, but it produces nice ODTs and ODGs even without it. Thanks to &lt;a href="http://ariya.blogspot.com"&gt;Ariya's&lt;/a&gt; &lt;code&gt;FemtoZip&lt;/code&gt; namely.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1491802588222133754?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1491802588222133754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1491802588222133754'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/11/frankfurter-algemeine-hacking.html' title='Frankfurter Allgemeine hacking'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7884420250230403852</id><published>2007-10-25T12:04:00.000+02:00</published><updated>2007-10-25T12:06:00.956+02:00</updated><title type='text'>Happy Birthday, Darling !</title><content type='html'>&lt;p align="center"&gt;&lt;a href="http://go-oo.org/~fridrich/Patrick3Years.JPG"&gt;&lt;img src="http://go-oo.org/~fridrich/littlePatrick3Years.JPG"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;Happy third birthday, Patrick!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7884420250230403852?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7884420250230403852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7884420250230403852'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/10/happy-birthday-darling.html' title='Happy Birthday, Darling !'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-4690719966543581869</id><published>2007-10-18T13:21:00.001+02:00</published><updated>2007-10-18T14:04:23.962+02:00</updated><title type='text'>ITO, Sweet ITO</title><content type='html'>&lt;p&gt;I love this! I misunderstood a bit what the ITO was and at certain point I realized that I have accumulated quite a load of it. So, I had to spend it somehow. Here is the account of what it was useful for:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Finishing off what was started in Barcelona&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Naturally, if you speak to me about fun hacking, I will always have the image of &lt;a href="http://libwpd.sf.net"&gt;libwpd&lt;/a&gt; or &lt;a href="http://libwpg.sf.net"&gt;libwpg&lt;/a&gt; coming to my little brain. As I blogged &lt;a href="http://fridrich.blogspot.com/2007/10/barcelona-no-sacaba-catalunya.html"&gt;earlier&lt;/a&gt;, the first thing I used some time for was to finish off the work on tabulator conversion for WP 2.x - 3.5e for Mac and WP 5.x for DOS/Windows file-formats. It was started in Barcelona and the principle of &lt;i&gt;release soon, release often&lt;/i&gt; dictated that it should not sleep on my disk for long time. I got even a very positive echo of the overwhelming part of our Mac OSX user community after the 0.8.12 release (Yes, Smokey, you are about 87.49% of our active Mac OSX community :-)). So, if you did not do it yet, throw yourselves on the binaries and sources while they are still available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Buffered stream implementation&lt;/b&gt;&lt;/p&gt;&lt;p&gt;An old proverb says that one should try not to put off useful people. This was also one of the reasons why I deprecated in latest releases of libwpd our libgsf-based stream implementation. Understand me well, libgsf is a fine piece of software and is doing a lot of good to the world. Nevertheless, since libwpd is used by the &lt;a href="www.koffice.org"&gt;Koffice&lt;/a&gt; people along with some &lt;a href="http://www.abisource.com"&gt;other&lt;/a&gt; &lt;a href="http://go-oo.org"&gt;office suites&lt;/a&gt;, I did not want to keep it depending on a platform specific libraries. Moreover if the functionality that we use from these libraries is really very very very very tiny. So, we used a hacked version of &lt;a href="http://ariya.blogspot.com"&gt;Ariya's&lt;/a&gt; &lt;a href="http://pole.berlios.de/"&gt;pole&lt;/a&gt; (one header and one source file) to provide two additional &lt;a href="http://www.abisource.com/~uwog/libwpd/classWPXInputStream.html"&gt;WPXInputStream&lt;/a&gt; implementations that do not depend on anything besides a working STL implementation.&lt;/p&gt;&lt;p&gt;So far, so good, but... As long as the C++ streams (as I call them) became the default for the internal libwpd tools, we came to the point where the above mentioned proverb was going to be put into task again. Suddenly, Sum1's &lt;a href="http://fridrich.blogspot.com/2006/07/upcomming-libwpd-086-more-robust-than.html"&gt;QA run&lt;/a&gt; started to take several days instead of a night with the libgsf-based stream implementation. And putting off Sum1 is something that every hacker with some rudiments of sane mind should avoid at all cost.&lt;/p&gt;&lt;p&gt;In the same token, some other performance issues were reported from other contexts and the fact that libwpd reads at most 4 bytes in a single read started to show as a real problem. So, some time ago, inspired by &lt;a href="http://artax.karlin.mff.cuni.cz/~kendy/blog/"&gt;Kendy's&lt;/a&gt; intent to implement read-ahead to &lt;a href="http://lxr.go-oo.org/source/sw/writerperfect/source/stream/WPXSvStream.cxx"&gt;WPXSvStream&lt;/a&gt;, I hacked something similar to the sample &lt;a href="http://www.abisource.com/~uwog/libwpd/classWPXFileStream.html"&gt;WPXFileStream&lt;/a&gt;. But, there was a problem. Very probably a hideous bug in &lt;i&gt;libstdc++&lt;/i&gt; is causing in some specific cases a seek backwards by 2 bytes with a consecutive read of 1kB result in a &lt;code&gt;badbit&lt;/code&gt; being set. And this mainly on x86 with gcc 4.x (x86_64 was working well). Even x86 with gcc 3.4.x worked well as well as our distinguished competitor's Visual Studio compilers. Since I did not have much time down there to look into it, I left the idea of buffered read hanging.&lt;/p&gt;&lt;p&gt;Now, during my ITO, I gave it a quick second shot and by a sheer luck I found a workaround that is not really penalizing in terms of performance, and makes the buffered stream work well. The solution is simple: before the read, seek to the end of the block that we want to read and then back to the position where we want to start to read. With this incantation, the subsequent read does not set any &lt;code&gt;badbit&lt;/code&gt; anymore and everything is nice in the best of the worlds. Nonetheless, if a &lt;i&gt;libstc++&lt;/i&gt; hacker is interested in investigating into this bug, I have a historical version of the stream with a sample document that always triggers the above mentioned behaviour.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Positioned objects in WP6+ and ODF reference implementation woes&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The main task I was prepared to accomplish since &lt;a href="http://fridrich.blogspot.com/2007/06/hackweek-devil-is-in-details-or-odf.html"&gt;our dear&lt;/a&gt; &lt;a href="http://fridrich.blogspot.com/2007/06/it-was-said-it-was-repeated-and.html"&gt;hackweek&lt;/a&gt; already, and waited only for an enough long contiguous free time, was to get the size, the position and the anchoring of the positioned objects (images, text boxes,...) right. The problem was in multiple places. First of all the way the box information is encoded in WP6+ files is really only remotely connected to an idea I have about a fun hacking. The box/frame style is an old good way binary encoded information (if the bit 15 is set, the following information is available... etc.). The code that is inserting the box/frame can override style and whether it does so or not is again given by some bits of a number at the begining of the code. Added to it an acquired mistrust towards the Corel provided documentations, I was not really hot to spend my week-ends on this. Nevertheless, some recent user demands and the vision of a well used ITO made me to bite the bullet. And surprisingly, the main difficulty was not where I expected it to be. This time the documentation was right (at least for the information that I currently use). This time the tool I trusted always the most, &lt;code&gt;wplook.exe&lt;/code&gt; from the WordPerfect Office 11 SDK, got some things wrong and segfaulted on accessing the box/frame information of certain documents. But once understood where to put my trust, the information I needed was extracted and ready to be processed.&lt;/p&gt;&lt;p&gt;And it is there where the real problems started. On one hand the WP6+ file-format is much more expressive then ODF concerning the object position. Thinks like &lt;i&gt;shifted one inch left from the center of the page text area&lt;/i&gt; is not mapping directly to anything in ODF. And given also the fact that in WordPerfect the page margins can be set different for each paragraph, the position is not as easy to compute as one could expect. Nevertheless, the biggest surprise came from the way the &lt;a href="http://www.openoffice.org"&gt;reference implementation of ODF&lt;/a&gt; handles page anchored objects that correspond to the second case of &lt;code&gt;text:anchor-type=&amp;quot;page&amp;quot;&lt;/code&gt; referenced at page 294 of &lt;a href="http://www.oasis-open.org/committees/download.php/19274/OpenDocument-v1.0ed2-cs1.pdf"&gt;this file&lt;/a&gt; as well as at the page 303 of &lt;a href="http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf"&gt;this one&lt;/a&gt;. According the specifications, if one omits the &lt;code&gt;text:anchor-page-number&lt;/code&gt; property, one would expect that the frame appears at the same page as the character immediately following the &lt;code&gt;draw:frame&lt;/code&gt; closing element. And this is exactly what happens inside WordPerfect, so I was happy like a child. Premature happiness though. When our dearest reference implementation finds a page-anchored frame without &lt;code&gt;text:anchor-page-number&lt;/code&gt; property, it assumes apparently that this is just a forgetful mind of the filter writer and adds a &lt;code&gt;text:anchor-page-number=&amp;quot;0&amp;quot;&lt;/code&gt; attribute. This invariably places all the page-anchored frames outside the specified range for page numbers (1..N) and thus outside the document (although they still remain in the file fortunately).&lt;/p&gt;&lt;p&gt;So, there are two possible workarounds that I managed to find. Although none of them is satisfactory for different reasons. The first consists in using the hints WordPerfect formatter leaves in the file for itself to improve the speed of rendering. One can use the soft page breaks and hard page breaks to count on which pages we are in the given moment positioned. It is a possible workaround, but does not do good job unless the documents are reasonably short. With long documents, font substitution and not completely correctly converted spaces between headers, footers and the text area, one will find oneself with frames drawn on completely unrelated pages. So, this solution has little of my sympathy. The second workaround is to use the &lt;code&gt;text:anchor-type=&amp;quot;char&amp;quot;&lt;/code&gt; with which the anchoring is also relative to the position of the first character that follows the &lt;code&gt;draw:frame&lt;/code&gt; closing element. And it works well as a workaround. My principal caveat is that although our reference implementation of ODF standard accepts in such cases the values &amp;quot;&lt;code&gt;page&lt;/code&gt;&amp;quot; and &amp;quot;&lt;code&gt;page-content&lt;/code&gt;&amp;quot; for &lt;code&gt;style:vertical-rel&lt;/code&gt; attribute, according to the tables on the page 660 of &lt;a href="http://www.oasis-open.org/committees/download.php/19274/OpenDocument-v1.0ed2-cs1.pdf"&gt;this file&lt;/a&gt; as well as at the page 672 of &lt;a href="http://docs.oasis-open.org/office/v1.1/OS/OpenDocument-v1.1.pdf"&gt;this one&lt;/a&gt;, they are not conforming to the specifications given the anchoring. So, although the files I generate using this workaround do the right thing&lt;sup&gt;TM&lt;/sup&gt; for me, they are strictly speaking not a correct ODF (although the validator is not detecting it) and other implementations might refuse them or render them completely incorrectly.&lt;/p&gt;&lt;p&gt;Frankly, I did not have time to dig into the code that implements this frame-related stuff, but someone who knows where to look might maybe find it rather trivial to fix. I said, &amp;quot;maybe&amp;quot;, right?&lt;/p&gt;&lt;p&gt;&lt;b&gt;The people wants screenshots!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I know, I know, and &lt;a href="http://go-oo.org/~fridrich/frametest1.png"&gt;here&lt;/a&gt; is one.&lt;/p&gt;&lt;p&gt;I want hereby also thank my distinguished employer for making this possible by giving us the privilege of ITO (Innovation Time Off). It is really sweet to be able to accomplish things like this in the company time. And for those who face customer requests for converted WordPerfect documents with images and text boxes, the &lt;code&gt;std::answer&lt;/code&gt; you will receive from me will be from now on to use the CVS HEAD of &lt;i&gt;libwpd&lt;/i&gt;, &lt;i&gt;libwpg&lt;/i&gt; and &lt;i&gt;writerperfect&lt;/i&gt; to produce the &lt;code&gt;wpd2odt&lt;/code&gt; tool that knows it all.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-4690719966543581869?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4690719966543581869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4690719966543581869'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/10/ito-sweet-ito.html' title='ITO, Sweet ITO'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-4171813887730121101</id><published>2007-10-11T12:57:00.000+02:00</published><updated>2007-10-11T15:16:02.293+02:00</updated><title type='text'>Password protected WordPerfect documents</title><content type='html'>&lt;p&gt;Because we live in very interesting times, some information might be pushed to background. Even though it is very important one. Last week-end an e-mail of &lt;a href="http://www.penguin.cz/~fojtik"&gt;Jaroslav Fojtik&lt;/a&gt; announced me his success in finding a way to decrypt password protected WP 3.x for Mac files. Just to precise, it is not about the protection cracking, just about the ability to read password protected documents using FOSS once you know the password. This masterpiece of reverse engineering (which is completely legal in some parts of the world) adds this file-format to the WP 4.x and WP 5.x for DOS/Windows that FOSS world was already able to decrypt.&lt;/p&gt;&lt;p&gt;The only file-formats that we are still not able to decrypt are WP 1.x for Mac and WP 6+. For the former, work is currently being done, for the later, it looks like it is a bit harder nut. If anybody of people reading this entry has any useful information about the encryption of the WP 6+ documents, please read &lt;a href="http://www.penguin.cz/~fojtik/wp2latex/crypto/decrypt.htm"&gt;here&lt;/a&gt;. We would like to stress that we are not interested in the password cracking and other illegal activity. We want simply to make it possible to a user of FOSS to read its own WordPerfect documents that she once protected using a password. So, abstain from communicating information whose publication could be illegal in your jurisdiction. OTOH, a genuine help with the decryption is most welcome.&lt;/p&gt;&lt;p&gt;The API for decrypting WP documents will most probably be part of libwpd 0.9.x series.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-4171813887730121101?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4171813887730121101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4171813887730121101'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/10/password-protected-wordperfect.html' title='Password protected WordPerfect documents'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1015474374563531395</id><published>2007-10-11T12:02:00.000+02:00</published><updated>2007-10-11T15:19:02.255+02:00</updated><title type='text'>Barcelona no s'acaba a Catalunya</title><content type='html'>&lt;p&gt;&lt;a href="http://libwpd.sf.net"&gt;libwpd&lt;/a&gt; 0.8.12, codename &amp;quot;&lt;i&gt;Barcelona no s'acaba a Catalunya&lt;/i&gt;&amp;quot;, left its mother's womb yesterday. Besides build fixes for the upcoming gcc 4.3, this release features initial (although not really so lame) support of tabulators for WP 2.x - 3.5e for Mac and WP 5.x for DOS/Windows file-formats, tabset conversion in WP 5.x, as well as some font ID to font name mappings for WP 1.x for Mac file-format. The cross-compilation framework was drastically updated and a compilation with Sun Studio 12 for Linux was also tested and this release is reputed to work with it.&lt;/p&gt;&lt;p&gt;As the name indicates, the major part of the code for this release was done during the wife-less nights spent at the OOoCon2007 in Barcelona. Although, as the name also indicates, some code was added even once outside the territory of the &lt;i&gt;Paisos Catalans&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;It is a free software released under LGPL and it is free as beer, so take it, taste it and enjoy it. The rpms for different SuSE and Fedora flavours can be found in my &lt;a href="http://build.opensuse.org"&gt;openSuSE build service&lt;/a&gt; &lt;a href="http://download.opensuse.org/repositories/home:/fstrba/"&gt;home repository&lt;/a&gt;. The cross-compiled win32 binaries are to be found on the &lt;a href="http://libwpd.sf.net/download.html"&gt;libwpd download page&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Besides the normal authors and contributors, the thanks for this release go to our very own Smokey Ardisson, to Rob Staudinger, Hub Figuiere and, last but not least, to my dearest employer, &lt;a href="http://www.novell.com"&gt;Novell, Inc.&lt;/a&gt; and its Innovation Time Off program.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1015474374563531395?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1015474374563531395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1015474374563531395'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/10/barcelona-no-sacaba-catalunya.html' title='Barcelona no s&apos;acaba a Catalunya'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7611953664960104594</id><published>2007-10-04T16:02:00.000+02:00</published><updated>2007-10-18T14:42:38.859+02:00</updated><title type='text'>Honest Broker?</title><content type='html'>&lt;p&gt;&lt;a href="http://www.mealldubh.org/index.php/2007/10/03/honest-broker/"&gt;John&lt;/a&gt;, I completely agree with your point that one can assign copyrights to an entity if one can trust it. Where I don't agree is in your conclusion whether Sun Microsystems is such a honest broker. My own experience from the project is that a lot of lip service is payed to improvements of all kind, but that more the things change more they are the same. And I have a tendency to distrust entities that are full of good intentions at &lt;a href="http://www.openoffice.org/white_papers/OOo_project/openofficefoundation.html"&gt;long term&lt;/a&gt;, but when the long term becomes shorter one is seeing basically no result.&lt;p&gt;&lt;p&gt;Not that I am expecting anything good to happen. Between helping to build a strong developer community and trying to accumulate other people's code for proprietary licensing, Sun already decided anyway.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7611953664960104594?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7611953664960104594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7611953664960104594'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/10/honest-broker.html' title='Honest Broker?'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1410275335370932018</id><published>2007-09-28T14:00:00.000+02:00</published><updated>2007-09-28T16:01:03.471+02:00</updated><title type='text'>On the way to desktop freedom</title><content type='html'>&lt;p&gt;Not so long ago, I &lt;a href="http://fridrich.blogspot.com/2007/09/emulators.html"&gt;blogged&lt;/a&gt; about my strive to get rid of the need of running non-free operating systems while developing and maintaining my (our) different libraries. One step towards freedom was to find different emulators that could help to generate WordPerfect documents. That problem solved, one last thing was forcing me to have access to a non-free operating system. By the respect to our users and knowing that a typical Windows user is not really very good at operating compilers, for each release of libwpd, libwpg and other related packages, I was booting the win32 partition to maintain the MSVC project files and to build release binaries for Windows.&lt;/p&gt;&lt;p&gt;This time is over now. First to contribute to my liberation was the &lt;a href="http://download.opensuse.org/repositories/CrossToolchain:/mingw/"&gt;CrossToolChain&lt;/a&gt; repository in &lt;a href="http://www.opensuse.org"&gt;OpenSUSE.org&lt;/a&gt; &lt;a href="http://build.opensuse.org/"&gt;Build Service&lt;/a&gt;. The &lt;a href="http://www.mingw.org"&gt;MinGW&lt;/a&gt; cross-compiler is already successfully used to build the infamous unowinreg.dll during the &lt;a href="http://tmp.go-oo.org"&gt;OpenOffice.org&lt;/a&gt; build process. So, I gave it a shot and, after some modifications of the makefiles, the cross-compiling is a reality. What a pleasure to be able to run &lt;code&gt;make -j9&lt;/code&gt; and have the libraries built faster then their shadow! Inspired by some ingenious scripts by my distinguished colleague &lt;a href="http://tml-blog.blogspot.com/"&gt;Tor Lillqvist&lt;/a&gt;, I even have a creation of release packages scripted and don't have to do much manually anymore. Some of the credits go also to an extraordinary expert in cross-compilations of all kinds, &lt;a href="http://advogato.org/person/robsta/"&gt;Rob Staudinger&lt;/a&gt;, who helped to implement some of needed configure options.&lt;/p&gt;&lt;p&gt;The last milestone that was remaining on the way to freedom was a need of Microsoft Visual Studio to maintain the MSVC project files in the different libraries. But, this problem is solved now too. The key of the solution is called &lt;a href="http://www.codeweavers.com/products/cxoffice/"&gt;CrossOver Linux Professional&lt;/a&gt;. Last night, helped by &lt;a href="http://www.google.com"&gt;Uncle Google&lt;/a&gt;, I managed to install Visual C++ 6.0 SP6 in a &lt;a href="http://www.codeweavers.com/products/cxoffice/bottles"&gt;managed bottle&lt;/a&gt;. The cool thing with the Professional version is that once the bottle properly installed and configured, one can create an RPM package and deploy it on other computers. And the application is basically accessible to all users of the computer.&lt;/p&gt;&lt;p&gt;For those who are impatient to see how MSVC running under linux looks, &lt;a href="http://www.go-oo.org/~fridrich/msvc6-linux.png"&gt;here is what you are waiting for&lt;/a&gt;!&lt;/p&gt;By the way, I forgot to say that if you are running one of SuSE or Fedora Linux distributions and are keen to have the newest of the newest for libraries that I maintain or contribute to, you might find useful packages in &lt;a href="http://download.opensuse.org/repositories/home:/fstrba/"&gt;my home project&lt;/a&gt; in our dear openSUSE build service. It is enough to chose your distribution and point the yum, zypper or other favourite package manager to the corresponding repository. So, pick the packages and taste how sweet they are!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1410275335370932018?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1410275335370932018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1410275335370932018'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/09/on-way-to-desktop-freedom.html' title='On the way to desktop freedom'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-5579837648296219959</id><published>2007-09-25T17:50:00.000+02:00</published><updated>2007-09-26T09:59:07.632+02:00</updated><title type='text'>WPG Import</title><content type='html'>&lt;p&gt;Recently in Barcelona, I was interested to hear there was some confusion over how the beautiful Word Perfect Graphics import was created. Since it is now shipping in most ooo-build based OO.o 2.3 versions, it'd be great to give full credit for all those who got over the time involved in it's creation and use in various FOSS applications.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Time-line&lt;/b&gt;&lt;/p&gt;&lt;p&gt;At certain point in 2006 I realized that because of lack of time I was neglecting one little useful library that I was also developing, &lt;a href="http://libwpg.sf.net"&gt;libwpg&lt;/a&gt; and I made in my blog a &lt;a href="http://fridrich.blogspot.com/2006/04/wordperfect-graphics-conversion-wants.html"&gt;call for new developers&lt;/a&gt; hoping that someone will bite the bullet.&lt;/p&gt;&lt;p&gt;Mathias Bauer (from Sun Microsystems) contacted me and proposed me work on this library could become part of OpenOffice.org SoC projects for 2006. After some e-mail exchanged, we agreed on the modalities of the participation: that libwpg will be developed as a standalone library (since it already existed as such) under LGPL because it was meant to be reused by other applications. Another agreement was that the goal was that the output of the Summer of Code will be standalone converter for wpg files to odg file format. This converter was supposed to be licensed under LGPL and its author was supposed to share his copyright with Sun under our beloved JCA terms.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Summer of Code candidate&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I was contacted by several students in private and my choice was &lt;a href="http://ariya.blogspot.com"&gt;Ariya Hidayat&lt;/a&gt; of &lt;a href="http://koffice.org/"&gt;Koffice&lt;/a&gt; fame. The reason was that I knew his code and was quite sure about him being able to do good work on the library and converter. I worked (in my own free time, btw) together with him during the SoC on separable features, like reverse-engineering the WPG1 palette or implementing OLE2 stream abstraction. And it was really great to collaborate with Ariya who is an extraordinary hacker. What was promissed, that was done. Ariya's project got accepted for the &lt;a href="http://wiki.services.openoffice.org/wiki/Summer_of_Code_2006#Writer:_Import_Filter_for_Word_Perfect_Graphics_files"&gt;Google summer of code&lt;/a&gt;, he signed the JCA, developed the library and added into it WPG2 support. In the same time, he developed a command-line tool called wpd2odg in a separate module. When the GSoC came to the end, the conditions for a successful accomplishment of the project were satisfied, the student got USD 4500 reward, Team OpenOffice.org e.V. got USD 500 and some Google swag like t-shirts and (paper) notebooks changed hands too. The &amp;quot;contract&amp;quot; was fullfilled and everybody was happy in the best of the worlds.&lt;/p&gt;&lt;p&gt;During the work on his Summer of Code, &lt;a href="http://ariya.blogspot.com"&gt;Ariya&lt;/a&gt; did an extensive blogging action, and one of &lt;a href="http://www.inkscape.org"&gt;Inkscape&lt;/a&gt; developers used a private copy of not yet released libwpg as a base for their &lt;a href="http://www.go-oo.org/~fridrich/wpg-inkscape.png"&gt;WPG import&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;After the Summer of Code&lt;/b&gt;&lt;/p&gt;&lt;p&gt;During the nights of the OpenOffice.org conference in Lyon, instead of sleeping, your servant was trying to implement a WPG import plugin as an add-on component for OpenOffice.org, one of those beasts that one builds using the SDK and that one installs using the &lt;i&gt;Extension manager&lt;/i&gt;. It became clear that one had to refactor the wpg2odg command-line tool from scratch so that it generates Sax messages instead of a string in ODG file-format. At the end of conference, there was a refactored version of the wpg2odg tool and a non-working wpg import filter plugin for OpenOffice.org. Your servant's little brain managed to debug the plugin and have it detect correctly the WPG files and actually show some images only at the begining of October 2006.&lt;/p&gt;&lt;p&gt;Immediately, an OpenOffice.org integration was intented. It means, your servant tried to incorporate this plugin into the OpenOffice.org build-system as a new module. Nevertheless, since the implementation met some problems of locking when trying to &lt;code&gt;imbue&lt;/code&gt; a locale into a C++ &lt;code&gt;std::ostingstream&lt;/code&gt;, and your servant was pretty busy looking for a job that would help him feed his family, the work stopped there.&lt;/p&gt;&lt;p&gt;In the meantime, &lt;a href="http://www.advogato.org/person/cinamod/"&gt;Dom Lachowicz&lt;/a&gt; of AbiWord fame modified the libwpg library adding into its API an SVG generating class so that it could be better reused by SVG supporting applications. Later, &lt;a href="http://uwog.net/news/?p=60"&gt;Marc &amp;quot;uwog&amp;quot; Maurer&lt;/a&gt;, implemented, using the libwpg SVG generation class, an AbiWord plugin enabling use of &lt;a href="http://www.go-oo.org/~fridrich/wpg-clipart-abiword.png"&gt;WPG cliparts in AbiWord files&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Hired in March 2007 by a &lt;a href="http://www.novell.com"&gt;nice company&lt;/a&gt; to work on OpenOffice.org, your servant requested permission to do some work on WPD and WPG filters in company time. The permission was granted and the whole odg generation framework used in the previous plugin rewritten to avoid having to use the problematic &lt;code&gt;imbue&lt;/code&gt; on the stream (or the stream at all). The result is a patch that landed into ooo-build on 7th of May 2007. Since then, it underwent many changes due to the sharp eyes of Rene Engelhard and also due to an extensive QA by Sum1 whose favourite sport of trying to crash and tear down anything I produce is a great way to assure that my software is having a good quality inspite of the limited brain activity that TrainedMonkey is capable of.&lt;/p&gt;&lt;p&gt;This Summer, Ariya worked again on the libwpg library and added conversion of WPG bitmaps embedded in WPG files. During the Novell Hackweek, your servant wrote a BMP generator to be able to pass these bitmaps to OpenOffice.org and also added handling of embedded binary objects in &lt;i&gt;alien&lt;/i&gt; file-formats (wmf, png, eps, ...). Again, thanks to AbiWord's Sum1, we were able to add handling of bitmaps in almost all supported colour-depths (indexed and direct). The result of this work is to be found in any &lt;a href="http://www.go-oo.org/~fridrich/wpg-go-oo.png"&gt;ooo-build based OpenOffice.org 2.3 version&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Who did what&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Libwpg library was written by &lt;a href="http://www.foddex.net"&gt;Marc Oude Kotte&lt;/a&gt;, Marc Maurer, Fridrich Strba, and Ariya Hidayat. Some of the copyrights are owned by Novell because your servant was working on this library in his company time too. Some build patches were submitted by &lt;a href="http://www.advogato.org/person/robsta/"&gt;Robert Staudinger&lt;/a&gt; of AbiWord fame. The library is released under the terms of LGPL with some parts being licensed under BSD license.&lt;/p&gt;&lt;p&gt;Wpg2odg (command-line tool and the OpenOffice.org WPG import plugin extension) was written by Ariya Hidayat and Fridrich Strba. Sun Microsystem is joint copyright holder of some parts of Ariya's code and Novell is owning copyrights of some code contributed by your servant. This tool/plugin is released under the terms of LGPL with some parts being licensed under BSD license. One can use it as an OpenOffice.org extension, provided that one has libwpg library installed on the system. As a matter of fact, it runs even on &lt;a href="http://www.go-oo.org/~fridrich/wpg-solaris-nevada.png"&gt;some non-free operating systems with some non-free office suites&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The integrated &lt;a href="http://svn.gnome.org/viewcvs/ooo-build/trunk/patches/src680/wpgimporter.diff?view=markup"&gt;WPG import filter&lt;/a&gt; &lt;a href="http://svn.gnome.org/viewcvs/ooo-build/trunk/patches/src680/libwpg.diff?view=markup"&gt;in ooo-build&lt;/a&gt; is licensed under the terms of LGPL and copyright holders are Fridrich Strba with Novell for a huge majority of the code, Ariya Hidayat jointly with Sun Microsystems (for certain parts of the code). The patches from the above-mentioned links are free software and can be used by anyone under the terms of LGPL.&lt;/p&gt;&lt;p&gt;I would like to thank all those who contributed to making wpg import a reality on the free software desktop. And for those who are interested, &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd 0.9.0&lt;/a&gt; (whenever its release happens), will use libwpg for converting &lt;a href="http://www.go-oo.org/~fridrich/et_pur_si_muove.png"&gt;images embedded in WordPerfect documents&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-5579837648296219959?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5579837648296219959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5579837648296219959'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/09/wpg-import.html' title='WPG Import'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-8957215399610117367</id><published>2007-09-13T11:49:00.001+02:00</published><updated>2007-09-13T11:59:08.278+02:00</updated><title type='text'>Emulators</title><content type='html'>&lt;p&gt;Writing import filters for different WordPerfect&lt;sup&gt;TM&lt;/sup&gt; file-formats can be fun and rewarding. Nevertheless, apart &lt;a href="http://www.go-oo.org/~fridrich/emulators/linux-wp.png"&gt;one rare exception&lt;/a&gt;, all WordPerfect&lt;sup&gt;TM&lt;/sup&gt; versions run on non-free systems (Solaris Sparc, Mac OS, Micro$oft Windows). As a free and opensource software developer, moved by the will to be consistent with my own convictions, I develop using free operating system. But for filter development, and especially in cases where the documentation available is rather sketchy, it is a necessity to do some reverse-engineering. For this, one is really obliged to have working copies of different versions of WP. And also to run some versions of non-free operating systems. Nevertheless, having a server room in one's appartment can be considered as wife-and-kids-unfriendly act, and rebooting every five minutes to another partition is not so efficient workflow-wise. The good news is that a big part of the problem can be solved using free software.&lt;/p&gt;&lt;p&gt;For Windows versions, a solution was already &lt;a href="http://ariya.blogspot.com/2006/06/emulator-for-filter-development.html"&gt;outlined by Ariya&lt;/a&gt; some time ago. I modified a little bit the software installed and managed to fit all the necessary Windows and DOS versions of WordPerfect&lt;sup&gt;TM&lt;/sup&gt; on less then half GB disk image running a &lt;a href="http://www.litepc.com/"&gt;98lite&lt;/a&gt;-modified version of Windows 98SE. The screenshot of this situation can be found &lt;a href="http://www.go-oo.org/~fridrich/emulators/qemu-all-wps.png"&gt;here&lt;/a&gt;. The advantage is that such an image is fitting quite confortably on a USB stick.&lt;/p&gt;&lt;p&gt;Another problem was the Mac OS versions. And here it is really crucial to have a running versions. Because for some of the old file-formats, the only documentation that web is able to give you is the &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt; source code and &lt;a href="http://fridrich.blogspot.com/2006/08/mac-mini-and-wp-mac-file-formats.html"&gt;this blog entry&lt;/a&gt;. And inspite of the &amp;quot;Mac Mini donated by unnamed on behalf of unnamed&amp;quot;, the situation was less then optimal. Besides the fact that my KVM switch supports only PS/2 keyboard/mouse ports and a normal VGA monitor connector, it is quite difficult to use the Mac Mini when traveling. And frankly, MacOSX is quite an overkill for applications that install and work happily in a MacOS8 running on a Quadra. After looking on internet, I decided to give a ride to the &lt;a href="http://basilisk.cebix.net/"&gt;Basilisk II emulator&lt;/a&gt;. After some time of struggling and helped extensively by Filip Molcan, &lt;a href="http://www.figuiere.net/"&gt;Hubert Figuiere&lt;/a&gt; and &lt;a href="http://www.mars.org/home/rob/proj/hfs/"&gt;hsfutils&lt;/a&gt;, I am able to run a &lt;a href="http://www.go-oo.org/~fridrich/emulators/BasiliskII-all-WPMac.png"&gt;little MacIntosh&lt;/a&gt; on each of my GNU/Linux computers, i386 as well as x86_64.&lt;/p&gt;&lt;p&gt;Although I installed all this thing on a disk image of 512MB, I realze that I have still more then 400MB of free space there. But even 512MB is small enough to back it up on a CD and put it somewhere on a USB stick. I also have to admit that I am quite impressed by the stability and speed of BasiliskII emulation. On modern processors, the emulated MacOS8 works faster than I ever have seen it running on a native Apple hardware back then when we were still young and handsome. I will not go into the details of the installation, but if the popular demand is there, I might document things that are not well documented on the web.&lt;/p&gt;&lt;p&gt;So, now only one little problem remains. How to run the WordPerfect&lt;sup&gt;TM&lt;/sup&gt; 5.1 for Solaris Sparc? Anybody knows about an emulator that could run the version 2.5 of this proprietary system?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-8957215399610117367?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8957215399610117367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8957215399610117367'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/09/emulators.html' title='Emulators'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-8264928963217746103</id><published>2007-09-12T12:10:00.000+02:00</published><updated>2007-09-12T12:41:46.367+02:00</updated><title type='text'>Amused</title><content type='html'>&lt;p&gt;I was mildly amused when reading &lt;a href="http://www.gnome.org/~michael/activity.html#2007-09-11"&gt;Michael's blog&lt;/a&gt;. Suarez-Potts had nothing else to invent to bash Novell then to start to criticise the way they spent money to bring developers to one place. In my not so humble opinion, inspite of the food served in the &amp;quot;World Capital of Gastronomy&amp;quot;, there was not really anything to say against that experience. It was way better then the some-special-selected-people dinner sponsored by another company in Koper.&lt;/p&gt;&lt;p&gt;I was just wondering whether it is the same Suarez-Potts that did not refuse to profit of Google hospitality (flight and hotel payed) during the Google Summer of Code &amp;quot;Mentor&amp;quot; Summit. Funny enough, I don't remember suddenly what was the Summer of Code project he was mentoring last year.&lt;/p&gt;&lt;p&gt;But the bottom-line of this is that LSP is even criticizing the fact that people want to contribute engineering resources and try to encourage developers to contribute to OpenOffice.org. Just wondering whether Louis has an idea about what a FOSS project is. It is all about producing software and as good software as possible. As a by-product of this, there can be human relationships of other type that come to be, but the focus is still on the software.&lt;/p&gt;&lt;p&gt;Although it is true that OpenOffice.org project &amp;quot;structures&amp;quot; are quite efficient at producing talking shops instead of developers, this situation should be considered more as a dysfunction then as a normality. As well as it should be considered dysfunctional to have someone who is not developer representing OpenOffice.org at hacker's meetings. What is the argument such a person can have to encourage contributions? What level of understanding of everyday concerns of a FOSS hacker?&lt;/p&gt;&lt;p&gt;Frankly, it should be our target to fight these dysfunctions. And only if we succeed in this, there is hope that the &amp;quot;OpenOffice.org Community Manager&amp;quot; will have actually something to manage.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-8264928963217746103?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8264928963217746103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/8264928963217746103'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/09/amused.html' title='Amused'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-5306801758123270802</id><published>2007-09-07T14:04:00.000+02:00</published><updated>2007-09-07T14:14:01.943+02:00</updated><title type='text'>x86_64 tinderbox slave</title><content type='html'>&lt;p&gt;Just to tell you that we just added into the OpenOffice.org tinderbox build an x86_64 slave. Moreover, it builds with gcc-4.1.2 and with FSF java. So, if your build breaks in java files, check whether you did not write in an &amp;quot;&amp;uuml;bersetz mich&amp;quot; or other umlaut containing words. The other typical errors might be extra qualifications in declarations of C++ classes and/or treating of ULONG/LONG as if they were assured to be 32-bits. Keeping this in mind might prevent too frequent red status.&lt;/p&gt;&lt;p&gt;Thanks to Intel that provided this machine last year. And thanks to Christian Lohmaier who is guiding it and forcing it to do the right thing.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-5306801758123270802?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5306801758123270802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/5306801758123270802'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/09/x8664-tinderbox-slave.html' title='x86_64 tinderbox slave'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-2345876687487200252</id><published>2007-08-08T18:25:00.000+02:00</published><updated>2007-08-08T18:57:14.182+02:00</updated><title type='text'>libwpg-0.1.0 - Initial release is out of the door</title><content type='html'>&lt;p&gt;Not without a lot of joy, I am announcing you that early this week a happy event took place and &lt;a href="http://libwpg.sourceforge.net"&gt;libwpg-0.1.0&lt;/a&gt; official release came to be. Libwpg is a library for reading and converting WordPerfect&lt;sup&gt;TM&lt;/sup&gt; Graphics (WPG) files. In can be used by converters or renderers. A convenience tool and API for generating Scalable Vector Graphics (SVG) from a WPG file is included. A private statically linked version of this library is currently used by &lt;a href="http://www.inkscape.org"&gt;inkscape&lt;/a&gt; in their WPG import filter. The &lt;a href="http://www.novell.com"&gt;Novell Edition&lt;/a&gt; of &lt;a href="http://www.go-oo.org"&gt;OpenOffice.org&lt;/a&gt; 2.3 will also contain a WPG import filter based on this library, as well as the upcoming AbiWord 2.6 release.&lt;/p&gt;&lt;p&gt;As every initial release, even this baby might have some rough edges. Nevertheless, we are confident that it will bring joy to its parents and to all those who will have any use of it.&lt;/p&gt;&lt;p&gt;The thanks for this release go to many people. First of all to Mark "uwog" Maurer and Will Lachance, of multiple fames, for instigating this project. To Mark Oude Kotte (aka Foddex) for starting it, to Ariya Hidayat for doing almost all the work. AbiWord's Sum1 took his time tearing the library down and filing bugs against it before it even came out of its mother's womb. Thanks to him, we were able to catch and fix many bugs. Last and indeed least, the thanks go also partly to me who will take all the glory and to whom you can send your donations and thank-you contributions. We definitely should not forget Uncle Google who put some $$$ into this endeavor in the frame of Google Summer of Code in 2006.&lt;/p&gt;&lt;p&gt;The source packages and convenience binaries for Win32 platform can be found &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=100237"&gt;here&lt;/a&gt;. You are encouraged to download the, pet them, delight in them and maybe use them before they finish in the Wastebasket.&lt;/p&gt;&lt;p&gt;Enjoy and send your bug reports and feature requests to &lt;a href="mailto:libwpg-devel@lists.sourceforge.net"&gt;libwpg-devel mailing list&lt;/a&gt; (you'll have to register to do that though). And if you feel an urge to code, your patches will be most welcome at the same address.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-2345876687487200252?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2345876687487200252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2345876687487200252'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/08/libwpg-010-initial-release-is-out-of.html' title='libwpg-0.1.0 - Initial release is out of the door'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-4174458176962828718</id><published>2007-06-29T15:04:00.000+02:00</published><updated>2007-06-29T15:11:06.129+02:00</updated><title type='text'>Hackweek: The devil is in the details (or ODF generation woes)</title><content type='html'>&lt;p&gt;Yesterday, I was poluting planets with my story of converting images included in WordPerfect files. There were still some missing links and thus it is nice to give you another screenshot. Christian Lippka, a supreme intelligence of OpenOffice.org Draw and Impress fame, helped me to examine the OpenDocument Drawing objects that I was creating. The problem was that they were not scaling to the frame they were supposed to sit in. And we found the problem. (OK, he found it!) The solution is to include in the drawing document this XML snippet:&lt;/p&gt;&lt;p&gt;&lt;code&gt;&amp;lt;office:settings&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;config:config-item-set config:name="ooo:view-settings"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;config:config-item config:name="VisibleAreaTop" config:type="int"&amp;gt;0&amp;lt;/config:config-item&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;config:config-item config:name="VisibleAreaLeft" config:type="int"&amp;gt;0&amp;lt;/config:config-item&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;config:config-item config:name="VisibleAreaWidth" config:type="int"&amp;gt;7941&amp;lt;/config:config-item&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;config:config-item config:name="VisibleAreaHeight" config:type="int"&amp;gt;19124&amp;lt;/config:config-item&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/config:config-item-set&amp;gt;&lt;br&gt;&amp;lt;/office:settings&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The two magic numbers are width and height of the image in 100ths of milimeter. BTW, I am interested to see what will happen when this code starts to be used for their WordPerfect importer also by KWord. But, here I will leave &lt;a href="http://ariya.blogspot.com"&gt;Ariya&lt;/a&gt; the pleasure to handle possible implementation differences.&lt;/p&gt;&lt;p&gt;And so, thanks to the light of Christian, &lt;a href="http://www.go-oo.org/~fridrich/et_pur_si_muove.png"&gt;this is how the document looks like now&lt;/a&gt;. Ok, I have to confess a little cheating. The dimension of the frame is for the while not read from the file by a parser. I was quite lazy to start to parse this information. It is for the time being hardcoded in the code, but should not be conceptually difficult to parse the information,... just boring to death.&lt;/p&gt;&lt;p&gt;I would like to mention also another person that gave me a useful tool that I was using during this week. Far from being anything close to XSL(T) fan, I found extremely useful Svante Schubert&amp;apos;s transforms that allow to load and export files in OpenDocument flat XML format in and from OpenOffice.org. It is a load easier like this to make little experiments with document without having to run zip and unzip zillion of time.&lt;/p&gt;&lt;p&gt;So, what remains to be done? Naturally, to write the parser of the box information for different WP file-formats inside libwpd. This is something I am really finding very boring and ungrateful task. So, if you want to be my personal hero, send me a patch.&lt;/p&gt;&lt;p&gt;For those WordPerfect users that have a load of documents with images, the documentation says that one &amp;quot;Graphics Filename&amp;quot; prefix packet can point to several &amp;quot;Graphics Cached File Data&amp;quot; packets that contain the graphic information. Nevertheless, the documentation does not say how the data is split in this case. In several full-blown WPG streams or in one WPG stream that has chunks stored in different prefix packets? I was unable to create a document with several pointers in the &amp;quot;Graphics Filename&amp;quot; prefix packet, so if you have some of them, here I am to receive them. Or even better, send me a patch for their handling in &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-4174458176962828718?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4174458176962828718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/4174458176962828718'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/06/hackweek-devil-is-in-details-or-odf.html' title='Hackweek: The devil is in the details (or ODF generation woes)'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-1532474024564544576</id><published>2007-06-28T16:21:00.001+02:00</published><updated>2007-06-28T16:31:56.037+02:00</updated><title type='text'>Hackweek @ Novell</title><content type='html'>&lt;p&gt;It was said, it was repeated and repeated. This week, is a hackfest week at Novell. We are hacking (programming for those who do not like the word) on different projects/ideas that are close to our heart. Naturally, TrainedMonkey(tm) could not remain behind. And guess, what projects he chose to hack on... Naturally, &lt;a href="http://libwpd.sourceforge.net"&gt;libwpd&lt;/a&gt;, &lt;a href="http://libwpg.sourceforge.net"&gt;libwpg&lt;/a&gt; and their &lt;a href="http://www.go-oo.org"&gt;OpenOffice.org&lt;/a&gt;-related filters. It is really nice to be upstream maintainer of several things, like that, when given a week of free hacking, one is likely not to lack ideas what to do with the time.&lt;/p&gt;&lt;p&gt;The import of embedded pictures is one of the most overdue features in our WordPerfect(tm) converter. So, I jumped on the task when this opportunity came. And fortunately, not everything had to be coded from scratch. &lt;a href="http://ariya.blogspot.com"&gt;Ariya&lt;/a&gt;, in the frame of a Google Summer of Code project gave a decisive push to libwpg and he has kept working on improving it. We came to the point, where standalone WordPerfect Graphics files can be nicely converted to SVG or ODG including embedded bitmaps. So, what were the steps to do?&lt;/p&gt;&lt;p&gt;First of all, it was necessary to port libwpd/writerperfect to generate OpenDocument instead of the legacy OpenOffice 1.0 file-format. This was needed because of the nice way, one can incorporate binary objects in OpenDocument represented as flat XML. This was accomplished on Monday, and the conversion of all documents from libwpd regression suite produces a nice ODF stream that validates against the OpenDocument 1.1 strict schema.&lt;/p&gt;&lt;p&gt;Next step was actually to parse the embedded image data in WordPerfect documents. A nice discovery is that in old WP5.x documents, the images are stored without the WPG header. So, one had to hack into libwpd a possibility to force the document parsing even if it does not recognize it. This was done on Tuesday.&lt;/p&gt;&lt;p&gt;The same day in the evening, I started to hack on passing the data libwpd gives us to libwpg and processing its output and incorporating the images into the OpenDocument text stream. This work continued on Wednesday and resulted in &lt;a href="http://www.go-oo.org/~fridrich/first_pictures.png"&gt;finally seeing an image&lt;/a&gt;. The scaling and anchoring was not good, but at least one could see something else then lines of cheesy C++. But it was really hard to make the generated documents (although valid according the ODF schema) load nice and display the pictures well. I poked some people whose brain should be a bit better then a brain of TrainedMonkey(tm), but did not manage to get more intelligent. And since a soup is never eaten as hot as it is cooked, I left it there for the night.&lt;/p&gt;&lt;p&gt;A night brought some rest for the mind and I started my day by a nice chat with the guy who is expert in pictures embedded in OpenOffice.org Writer documents. I came to the conclusion, that the best would be to include those images directly as &lt;code&gt;&amp;lt;draw:object&amp;gt; inside a &amp;lt;draw:frame&amp;gt;&lt;/code&gt;. The advantage is that this would keep the images as editable pictures, the same way the Corel customers can edit them inside the WordPerfect Office(tm) applications. This meant to throw a big chunk of Wednesday's code in favour of a more elegant solution. For those familiar with libwp* world, the OdgExporter class was copied to writerperfect too :-) (Now it is part of Novell's WPG import filter for OpenOffice.org, of wpg2odg tool, of perfectspot graphics viewer, and now of writerperfect). There is a way of improvement, since it is likely, that it should not be very difficult to join wpg2odg and writerperfect in one source package.&lt;/p&gt;&lt;p&gt;I spent some time trying to debug my code, since the images were not showing. Then, by chance, I discovered that the devil was in the right office:mimetype attribute of the embedded object :-(. So, now &lt;a href="http://www.go-oo.org/~fridrich/the_same_reloaded.png"&gt; one can see the images inside a frame&lt;/a&gt;. The scaling is still not correct, and I am not sure at this moment, whether I will be able to scale the image as whole or will have to scale every single shape on import, but it results in something that is editable. And that was the goal of the rewrite.&lt;/p&gt;&lt;p&gt;Tomorrow, I will try to code again the parser of the box information, so that we extract from the file information of the box anchoring, size and position. This promisses to be quite a boring stuff, but necessary missing link.&lt;/p&gt;&lt;p&gt;BTW, libwpd and libwpg will not refuse any fine hacker that would like to contribute to enhance our conversion feature-set while still keepeing &lt;a href="http://fridrich.blogspot.com/2006/07/upcomming-libwpd-086-more-robust-than.html"&gt;our stability and document import rate&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-1532474024564544576?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1532474024564544576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/1532474024564544576'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/06/it-was-said-it-was-repeated-and.html' title='Hackweek @ Novell'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6858429625802264404</id><published>2007-05-21T11:03:00.000+02:00</published><updated>2007-05-21T11:06:50.759+02:00</updated><title type='text'>An (almost) ideal OpenOffice.org build box :-)</title><content type='html'>&lt;p&gt;It was supposed to be cold this weekend, since it started by quite an abundant rain, and our central heating is not considering May as winter month anymore. So, I decided to do something to increase the temperature of our apartment. I have a little Sony Vaio PCG-SR11K laptop lying around. It used to be a nice little tiny and portable machine in its time with the cute 10.5&amp;quot; display with a resolution of 1024x768. But, given the Pentium III processor, running at 600 MHz, and 256 MB of memory, it is working quite well for reading e-mail, browsing web and doing some little other tasks, powered by SuSE Linux Enterprise Desktop naturally, but building OpenOffice.org does not look like a great idea.&lt;/p&gt;&lt;p&gt;Yes, sure, if a quick build is what one wants to obtain... Nevertheless, I gave it a try. Just for the sake of preventing the processor of being too idle during the build I tried two builds in parallel. A stock ooo-build (our dear Novell version) configured &lt;code&gt;--with-distro=SUSE&lt;/code&gt; and a vanilla &lt;code&gt;SRC680_m210&lt;/code&gt; with the CWS &lt;code&gt;writerfilter2&lt;/code&gt; integrated. The later build was with as many system libraries as possible and also with the &lt;code&gt;--without-stlport4&lt;/code&gt; option.&lt;/p&gt;&lt;p&gt;I put the laptop in a position to be sure that the CPU fan has a lot of air circulation and fired the two builds at 19:00 on Friday. The ooo-build one (without the SDK and binfilter) was finished on Sunday somewhere between 10:30 and 13:00 (I checked it when back from Church, so I cannot give smaller time fork). The vanilla build finished partially on Sunday at about 18:00. Yes, I forgot about the damned extra qualification in &lt;code&gt;sd&lt;/code&gt; module and was quite happy that I issued the build command with &lt;code&gt;--all --ignore&lt;/code&gt; options. Once fixed that one and patched out some stlport-only features from the &lt;code&gt;writerfilter&lt;/code&gt; module, the successful packaging process was announced at about 22:00.&lt;/p&gt;&lt;p&gt;The bottom-line is that the laptop survived it although it was nearly impossible even to read the e-mail while building. The temperature of the house was quite pleasant, partly also because the Sun (not Microsystems) decided to show up from Saturday morning. Nevertheless, the temperature of the air going out of the fan is indicating that putting that &amp;quot;laptop&amp;quot; on one&amp;apos;s laps while building can be quite dangerous for reproductive health :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6858429625802264404?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6858429625802264404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6858429625802264404'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/05/almost-ideal-openofficeorg-build-box.html' title='An (almost) ideal OpenOffice.org build box :-)'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-7059622821594573175</id><published>2007-05-21T10:23:00.000+02:00</published><updated>2007-05-21T11:08:16.829+02:00</updated><title type='text'>Qemu and kqemu on SLED10 SP1</title><content type='html'>&lt;p&gt;&lt;a href="http://ariya.blogspot.com/2007/05/qemu-09-with-acceleration-on-suse-102.html"&gt;Ariya&lt;/a&gt;, maybe an even easier way would be to take the kqemu and qemu source packages from SuSE Factory, and run &lt;code&gt;rpmbuild --rebuild kqemu-&amp;lt;version&amp;gt;.src.rpm&lt;/code&gt; and install the resulting kernel modules. After that, &lt;code&gt;rpmbuild --rebuild qemu-&amp;lt;version&amp;gt;.src.rpm&lt;/code&gt; and install the result as well :-) This is the way it worked nicely on my SLED 10 SP1.&lt;/p&gt;&lt;p&gt;Completely agree that Qemu is a nice tool for all filter developers.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-7059622821594573175?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7059622821594573175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/7059622821594573175'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/05/qemu-and-kqemu-on-sled10-sp1.html' title='Qemu and kqemu on SLED10 SP1'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-2391274591315192617</id><published>2007-03-02T11:44:00.000+01:00</published><updated>2007-03-02T18:54:22.267+01:00</updated><title type='text'>Focus on the logic behind a file-format, not on the container used</title><content type='html'>&lt;p&gt;Diving into the Office Open XML file-format and in the same run into all other MS Office file-formats (if one makes abstraction of the container, content is the same), one realizes the different ways that can be used to store the same thing. Unless designed with interoperability as a pricipal aim, a file-format's logic reveals nicely the way the application that produces it operates. And the fact that it be binary file, a compressed structured document composed by several xml streams, or a RTF-like file is not making much difference (apart of the difference in human-readability). And it is exactly the difference in the underlying logic that renders impossible to reach an optimal result in translation by using a descriptive tool like XSL transformations. Let's enjoy together the main difference between MS Office, WordPerfect and ODT/HTML file-formats:&lt;/p&gt;&lt;p&gt;&lt;b&gt;MS Office&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The main idea behind the MS Office word processing file-formats (.doc, .rtf, .docx and other xml-based attempts) is that the node (paragraph, section, ...) properties are &amp;quot;stored&amp;quot; in the &amp;quot;character&amp;quot; that marks the end of the node. I.e.: The paragraph properties will be all properties that the paragraph break marks finds set. And these properties will be properties of the paragraph whose end this paragraph break marks. From the point of view of the document flow, with some nuances, the paragraph properties are applied retroactively to the current paragraph. And it is similar with the section properties.&lt;/p&gt;&lt;p&gt;&lt;b&gt;WordPerfect&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The WordPerfect file-formats reflect also well the underlying conceptual model of its application: typewriter. As well as in MS file-formats, a WP file can have the paragraph or page properties defined anywhere in the document. And the codes are applied as soon as the formater is able to do it. Nevertheless (with the exception of headers/footers that appear in certain WP file-formats on the same page as the code that defines them), they are never applied retroactivelly. The properties are crossing the boundaries of hierarchically superiour elements. I.e.: If one sets direct code of &amp;quot;bold&amp;quot; somewhere in the document, this code will be valid and have effect untill another code that cancels it. The number of page, column, ... breaks between the two does not matter. If one changes a paragraph alignment in the middle of the paragraph, for instance, newer versions of WordPerfect will add a &amp;quot;temporary hard return&amp;quot; code before the alignment code to hint that a paragraph break is necessary in order to render this change. Nonetheless, older versions of WordPerfect (still using the same file-format) will leave the task to realize this fact to the formater/layout engine itself.&lt;/p&gt;&lt;p&gt;A direct result of the typewriter conceptual model in WordPerfect are those special tabs that disregard completely the tab-table and that contain themselves the information about their position and alignment (hard tabs, center on margins, flush right,...). A reader that did not yet get lost in this entry will appreciate how nice it is to translate these beasts into a file-format in which all tab properties are defined in a tab-table that has to be known at latest at the moment of beginning of the paragraph.&lt;/p&gt;&lt;p&gt;&lt;b&gt;ODT/HTML&lt;/b&gt;&lt;/p&gt;&lt;p&gt;These file-formats have the particularity that the information about an element is enclosed in the element's opening tag. The alignment, indentation or spacing of a given paragraph is known at the begining of the paragraph, better said at the moment of the paragraph opening. This is the same with the tab-table for those file-formats where it makes sense (a tab-table has no sense in the html file-format although some extensions are trying to implement it in some way).&lt;/p&gt;&lt;p&gt;&lt;b&gt;Document conversion&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Given the fact that a word processing document is read sequentially, the conversion between these different formats can be quite a pain in some posteriour place of one's body. For instance, if you want to convert directly from a MS Office file-format to HTML/ODT, you will have to parse the document two times: first to collect the styles of the nodes (that become manifest at the end of the corresponding node) and second to parse the content of the nodes. For a proper conversion of WordPerfect &amp;quot;special&amp;quot; tabs and headers/footers, one has to proceed in a similar way, besided a deep magic to incorporate the &amp;quot;special&amp;quot; tabs' position and alignment into a tab-table of the given paragraph.&lt;/p&gt;&lt;p&gt;&lt;b&gt;New OpenOffice Writer filter API&lt;/b&gt;&lt;/p&gt;&lt;p&gt;As I already mentined, the direct conversion is likely to be a pain in some posteriour place, unless...&lt;/p&gt;&lt;p&gt;...an import filter does not need to do the whole conversion and can feed the information into a structure where one can modify the properties of a given paragraph/section/text-run aka text-span during the content parsing. And this is exactly what the new filter API that is being implemented in the &lt;code&gt;writerfilter2&lt;/code&gt; CWS is designed for. &lt;i&gt;Stay tuned for some more exciting adventures concerning the file-formats!&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Just to add that the &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt; API gives the &amp;quot;node&amp;quot; properties in the openFoo callbacks. And it is more or less trivial to plug this logic into the new Writer API logic. Because it is much easier to have some information early and keep it for later on then the opposite case.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-2391274591315192617?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2391274591315192617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2391274591315192617'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/03/focus-on-logic-behind-file-format-not.html' title='Focus on the logic behind a file-format, not on the container used'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-2945883917916507178</id><published>2007-03-02T11:42:00.000+01:00</published><updated>2007-03-03T21:12:31.722+01:00</updated><title type='text'>Work @ Novell</title><content type='html'>&lt;p&gt;I am owing thanks to the Lord God Almighty for being merciful and gracious with me. He extended his hand over me and my family and accompanied us through the desert of the year 2006. He blessed us abundantly and exceedingly above all we could ever hope for. I am writing this because I want to give all the honour and all the glory to The One Who deserves it in first place.&lt;/p&gt;&lt;p&gt;I want to thank also the &lt;a href="http://www.novell.com/"&gt;Novell&lt;/a&gt; &lt;a href="http://www.go-oo.org/"&gt;OpenOffice.org Team&lt;/a&gt; for having considered me with favour for a position of Software engineer working on interoperability issues between MS Office and OpenOffice.org. I am excited to see my hobby activity becoming my regular job. I cannot thank you enough, guys, for giving me an opportunity to work full-time on this great FOSS project.&lt;/p&gt;&lt;p&gt;I want to give my thanks also to other people who were ready to help me throughout 2006: Sophie Gauthier, the lead of OOo French native language project, Mathias Bauer, former framework and current sw lead (and friend), Thorsten Behrens, the gsl co-lead (and a great person and friend), Marc "uwog" Maurer and Dom Lachowitz, AbiWord admins and fine hackers (and helpful friends), and to all those people from OpenOffice.org, AbiWord and libwp* projects that were very supportive in action and in kind words: Rob, Sum1 (really SomeOne), Will, Andrew, Ariya, Pavel, Caolan, Heiner, Stefan, Eric and all those whose names I might have forgotten to put down here. Thanks, good pexcitingeople, for your willingness to put hand in fire for a TrainedMonkey and to help and encourage him. I really appreciate!&lt;/p&gt;&lt;p&gt;Last, but in no way least, I want to thank particulary Michael Meeks, Distinguished Engineer and "hacker extraordinaire", for injecting in me the uncurable virus of OpenOffice.org. He helped me to enter the community. Thanks, dudie, for guiding and supporting me and for being a friend inspite of my big mouth!&lt;/p&gt;&lt;p&gt;I am looking forward to advancing the cause of the Free Desktop inside of a company that believes and puts in practice what it preaches.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-2945883917916507178?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2945883917916507178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/2945883917916507178'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/03/work-novell.html' title='Work @ Novell'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-6645218314516242607</id><published>2007-02-21T14:07:00.001+01:00</published><updated>2007-02-21T14:07:47.309+01:00</updated><title type='text'>Miriam (and us) in pictures</title><content type='html'>&lt;p&gt;Because of high demand from the public, &lt;a href="http://www.go-oo.org/~fridrich/miriam/"&gt;here you can find some photos of Miriam and associated folks&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-6645218314516242607?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6645218314516242607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/6645218314516242607'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/02/miriam-and-us-in-pictures.html' title='Miriam (and us) in pictures'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-3321396075087743910</id><published>2007-02-14T07:28:00.000+01:00</published><updated>2007-02-21T21:45:44.227+01:00</updated><title type='text'>Miriam Terezia Gladys</title><content type='html'>&lt;p&gt;The Lord is Good and his mercy endureth forever.&lt;/p&gt;&lt;p&gt;We thank the Lord God Allmighty for his goodness and abundant mercy. He blessed us in a mighty way by giving us our daughter and sister, &lt;a href="http://www.go-oo.org/~fridrich/miriam/WhoSaysIAmNotSmart.jpg"&gt;Miriam Terezia Gladys Strba&lt;/a&gt;. She came to this world on 14&lt;sup&gt;th&lt;/sup&gt; of February 2007 at 4:15 AM. Both Miriam and her mother are doing great and, together with the rest of us (in the role of passive spectators), thanking God for His blessings.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-3321396075087743910?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3321396075087743910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/3321396075087743910'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2007/02/miriam-terezia-gladys.html' title='Miriam Terezia Gladys'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116671668809464036</id><published>2006-12-21T16:53:00.000+01:00</published><updated>2006-12-21T17:01:43.080+01:00</updated><title type='text'>Uberdedicated TrainedMonkey?</title><content type='html'>&lt;p&gt;For those that do not want to wait for the integration of the &lt;a href="http://fridrich.blogspot.com/2006/12/microsoft-works-import-filter-for.html"&gt;CWS wpsimport01&lt;/a&gt;, the &lt;a href="http://ariya.blogspot.com/2006/12/one-trained-monkey-to-rule-them-all.html"&gt;Uberdedicated TrainedMonkey&lt;/a&gt; cloned the standalone writerperfect from the &lt;a href="http://libwpd.cvs.sourceforge.net/libwpd/writerperfect/"&gt;libwpd CVS repository&lt;/a&gt; and created a command-line tool alowing you to convert now your stack of MS Works documents into OpenOffice.org 1.0 file-format. The cloning was done mainly for debuging purposes, because the &lt;code&gt;com.sun.star.comp.Writer.XMLImporter&lt;/code&gt; seems more picky than the normal document-loading process, but it is usable for converting documents too. The module is called &amp;quot;wps2sxw&amp;quot; and lives in the &lt;a href="http://libwps.sourceforge.net"&gt;libwps&lt;/a&gt;&amp;apos; &lt;a href="http://sourceforge.net/svn/?group_id=176121"&gt;subversion repository&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;So run there to pick it while it is hot! And do not forget to subscribe the project&amp;apos;s mailing list and send some encouraging words to Andrew. Believe me, he does an excellent work!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116671668809464036?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116671668809464036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116671668809464036'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/12/uberdedicated-trainedmonkey.html' title='Uberdedicated TrainedMonkey?'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116652922268436691</id><published>2006-12-19T12:51:00.000+01:00</published><updated>2006-12-19T13:12:01.936+01:00</updated><title type='text'>One word that matters</title><content type='html'>&lt;p&gt;One word can change many things. And sometimes the words that one is not used to use so much might have a kind of magic in them.&lt;/p&gt;&lt;p&gt;Here is the problem &lt;a href="http://www.gnome.org/~michael/activity.html#2006-12-18"&gt;we were facing&lt;/a&gt; yesterday. This piece of code was refusing to compile:&lt;/p&gt;&lt;p&gt;&lt;code&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#include &amp;lt;vector&amp;gt;&lt;br&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;template&amp;lt; class key , class hashImpl , class equalImpl &amp;gt;&lt;br&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;class OMultiTypeInterfaceContainerHelperVar {&lt;br&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;typedef ::std::vector&amp;lt; std::pair &amp;lt; key , void* &amp;gt; &amp;gt; InterfaceMap;&lt;br&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceMap *m_pMap;&lt;br&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inline void * find() {&lt;br&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceMap::iterator iter;&lt;br&gt;8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return NULL;&lt;br&gt;9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;10&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/code&gt;&lt;/p&gt;&lt;p&gt;The complain was about an &lt;code&gt;expected &amp;apos;;&amp;apos; before &amp;apos;iter&amp;apos;&lt;/code&gt; on line 7. One can conclude by looking close that the code is correct and start to file a bug in the gcc bugzilla :-) And yet, inspite of the fact that it looks very reasonable for anybody who has a basic knowledge of C++, this code is not valid C++ and the compiler is right. For the line 7 to compile correctly, &lt;code&gt;InterfaceMap::iterator&lt;/code&gt; has to be a type. But the compiler cannot be 100% sure about this at the moment when it is compiling the template class. It will know more at the moment of the instantiation of the template, but not before. There is still a tiny little probability that there will be a specialization for a certain class &lt;code&gt;key&lt;/code&gt; where the &lt;code&gt;InterfaceMap::iterator&lt;/code&gt; will not be a type. Because the compiler is not 100% sure that the &lt;code&gt;InterfaceMap::iterator&lt;/code&gt; is a type, it assumes that it is not.&lt;/p&gt;&lt;p&gt;But now what? How can one make the compiler accept the code? Simply, by telling it that the &lt;code&gt;InterfaceMap::iterator&lt;/code&gt; &lt;b&gt;is&lt;/b&gt; a type. Here it is where a word that is not so often used (In fact, your servant never had to use it for the while) becomes handy. If you precede the statement at the line 7 by the keyword &lt;code&gt;&lt;b&gt;typename&lt;/b&gt;&lt;/code&gt;, everything compiles without a quirk. The presence of this keyword takes the compiler out of the uncertainty and, with its mind settled, it accepts the code.&lt;/p&gt;&lt;p&gt;So, the rule of the thumb is to precede the use of the dependent nested types in templates always by the magic word &lt;code&gt;&lt;b&gt;typename&lt;/b&gt;&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Having said this, I am quite happy that the long winter evenings spent with &lt;a href="http://en.wikipedia.org/wiki/Scott_Meyers"&gt;Scott Meyers&lt;/a&gt; were not amiss.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116652922268436691?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116652922268436691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116652922268436691'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/12/one-word-that-matters.html' title='One word that matters'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116645436890374782</id><published>2006-12-18T16:05:00.000+01:00</published><updated>2006-12-18T16:06:08.920+01:00</updated><title type='text'>Microsoft Works import filter for OpenOffice.org</title><content type='html'>&lt;p&gt;Some sweating was necessary but the result is worth it. To avoid that &lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; be too far behind &lt;a href="http://www.abisource.com/"&gt;AbiWord&lt;/a&gt; your servant came today with a Microsoft Works import filter for OpenOffice.org based on &lt;a href="http://libwps.sourceforge.net/"&gt;libwps&lt;/a&gt; library that has been &lt;a href="http://fridrich.blogspot.com/2006/12/on-clean-reusable-interfaces-and.html"&gt;blogged&lt;/a&gt; about last week. I would even gladly provide screenshots, but the CWS &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=4793&amp;Path=SRC680%2Fwpsimport01"&gt;wpsimport01&lt;/a&gt;, where the new filter lives, is based on milestone m196 that has some serious antialiasing issues on X11 platforms and thus the pictures would be just not nice at all. Nevertheless, it will be resynced several times as one writes the specifications, so stay tuned for the screenshots.&lt;/p&gt;&lt;p&gt;The integration strategy would be following: first integrate the CWS &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=4791&amp;Path=SRC680%2Ffs08"&gt;fs08&lt;/a&gt; that fixes some &lt;a href="http://fridrich.blogspot.com/2006/12/benefits-of-getting-lost.html"&gt;memory problems&lt;/a&gt; and &lt;a href="http://qa.openoffice.org/issues/show_bug.cgi?id=71487"&gt;crasher&lt;/a&gt; &lt;a href="http://qa.openoffice.org/issues/show_bug.cgi?id=72307"&gt;issues&lt;/a&gt; with the WordPerfect import filter. Make, in the same CWS, build the writerperfect module with as little warnings as it is humanly possible and refactor it to make it much easier for other libraries reusing &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt;'s public API to be plugged into it. After that, if a release of &lt;a href="http://libwps.sourceforge.net/"&gt;libwps&lt;/a&gt; happens and if inclusion of the tarball passes through all the necessary paperwork, integrate the CWS &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=4793&amp;Path=SRC680%2Fwpsimport01"&gt;wpsimport01&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As a bottom-line, the refactoring in &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=4791&amp;Path=SRC680%2Ffs08"&gt;fs08&lt;/a&gt; should make a possible shift to the use of the new filter API, that &lt;a href="http://blogs.sun.com/GullFOSS/entry/the_new_microsoft_word_filter"&gt;Henning&lt;/a&gt; blogged about, almost transparent.&lt;/p&gt;&lt;p&gt;So, now it is the time to study the new API in &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=3981&amp;Path=SRC680%2Fwriterfilter2"&gt;writerfilter2&lt;/a&gt; and see whether the libwpd-family libraries can use it directly, or some modifications should be proposed&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116645436890374782?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116645436890374782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116645436890374782'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/12/microsoft-works-import-filter-for.html' title='Microsoft Works import filter for OpenOffice.org'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116600854853714321</id><published>2006-12-13T12:14:00.000+01:00</published><updated>2006-12-13T12:28:36.200+01:00</updated><title type='text'>On clean reusable interfaces and the pleasure to see things happen</title><content type='html'>&lt;P&gt;As &lt;A HREF="http://www.advogato.org/person/cinamod/diary.html?start=128"&gt;Dom&lt;/A&gt; wrote it already, if you are having your documents mainly in MS Works format (yes, it is normally what comes often pre-installed on a new purchased computer along with some version of Windows) you are not excluded from the free desktop any more.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Focus on libwps, a Microsoft Works file word processor format import filter library&lt;/B&gt;&lt;/P&gt;&lt;P&gt;There is a nice neat tiny library, &lt;A HREF="http://libwps.sourceforge.net/"&gt;libwps&lt;/A&gt;, that allows you to read those documents and convert them to other formats. A plug-in for HEAD version of &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; exists and its integration into &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; should not take a lot of (coding, the QA and paperwork is other beast) time.&lt;/P&gt;&lt;P&gt;The library (not yet released, but ready to be soon) deserves to have some spot-lights on it. Not only it fills a gap in file-format coverage by FOSS word processing applications, it's author &lt;A HREF="http://sourceforge.net/users/andrewziem/"&gt;Andrew Ziem&lt;/A&gt; is an example of a hacker that &lt;A HREF="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;your servant&lt;/A&gt; likes and gets encouraged by. Being one of the great applicants for &lt;A HREF="http://code.google.com/soc/"&gt;Google Summer of Code&lt;/A&gt; with &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt;, his proposal was finally refused. It was a close call and the refusal was only due to the ridiculous number of 6 slots allocated for 69 eligible applications and 20 mentors standing on starting blocks. Many other would get discouraged and abandon the idea of contribution to the FOSS. Not Andrew! This great hacker started to code for his pleasure and &lt;A HREF="http://libwps.sourceforge.net/"&gt;libwps&lt;/A&gt; is the wonderful result of his work. Your servant has had the privilege to be assisting to the birth of the project and feels lucky.&lt;/P&gt;&lt;P&gt;&lt;B&gt;The number of reinvented wheels should be (almost) zero&lt;/B&gt;&lt;/P&gt;&lt;P&gt;For a FOSS project, the beginning is often important. The hacking has to be fun and the results have to come in a tangible manner quite quickly. Otherwise, one is more likely to reallocate one's free time for other activities and the nascent FOSS project experiences a cot-death. On the other hand, to get a library design right can be quite difficult especially if one does it for the first time.&lt;/P&gt;&lt;P&gt;The design choice of &lt;A HREF="http://libwps.sourceforge.net/"&gt;libwps&lt;/A&gt; was the right one: take and reuse the interface and design of a tried and true library used by &lt;B&gt;ALL&lt;/B&gt; free and open-source word processing applications, the &lt;A HREF="http://www.ohloh.net/projects/3800"&gt;libwpd&lt;/A&gt;. This allowed to avoid several possible iterations of bad designed interface and focus on the MS Works files conversion itself. A nice side effect of this choice is also that was super-simple to integrate a filter based on &lt;A HREF="http://libwps.sourceforge.net/"&gt;libwps&lt;/A&gt; into &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; and it will not be much more difficult to integrate it into &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; or &lt;A HREF="http://www.koffice.org/kword/"&gt;kWord&lt;/A&gt; as well. Well, from the design point of view, that is.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Clean and reusable interface design&lt;/B&gt;&lt;/P&gt;&lt;P&gt;That this was possible is a deliberate choice of &lt;A HREF="http://www.ohloh.net/projects/3800"&gt;libwpd&lt;/A&gt; maintainers. The thanks go especially to Marc “uwog” Maurer and William Lachance for the original design. The idea would be to extract the reusable interfaces from &lt;A HREF="http://www.ohloh.net/projects/3800"&gt;libwpd&lt;/A&gt; itself and provide it as a framework for developing import (and possibly export) filters from (to) binary file-formats at least. The &lt;A HREF="http://libwps.sourceforge.net/"&gt;libwps&lt;/A&gt; experience shows that it is possible. The advantage of the interface is that is does &lt;B&gt;NOT&lt;/B&gt; expose STL types to user, so it is usable for applications that use different STL implementations with different signatures from the STL implementation used by the underlying system. As it is the case of &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; that uses &lt;A HREF="http://stlport.sourceforge.net/"&gt;STLport&lt;/A&gt; internally. A library developed using this interface would be usable both as internal or system library for the given application. So, filter developers of all countries, unite!&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116600854853714321?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116600854853714321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116600854853714321'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/12/on-clean-reusable-interfaces-and.html' title='On clean reusable interfaces and the pleasure to see things happen'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116549541971931737</id><published>2006-12-07T13:34:00.000+01:00</published><updated>2006-12-07T22:17:38.030+01:00</updated><title type='text'>Benefits of getting lost</title><content type='html'>&lt;P&gt;I do not know whether it happened to you to get lost only to discover a new exciting landscape of your town, parts that you have never entered before. And so, in spite of the fact that you wasted some time, you feel lucky.&lt;/P&gt;&lt;P&gt;&lt;B&gt;A document crashing OpenOffice.org&lt;/B&gt;&lt;/P&gt;&lt;P&gt;This is exactly what happened to me last week. Everything started with the &lt;A HREF="http://www.openoffice.org/issues/show_bug.cgi?id=71487"&gt;issue 71487&lt;/A&gt;. &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; was crashing with the document, but the internal &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;'s &lt;code&gt;wpd2raw&lt;/code&gt; tool was spitting out a document that was well formed. &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; was opening the document without shouting loud, so the quick conclusion was that the culprit would be the writerperfect code. Writerperfect is the the base of a nice tool, &lt;code&gt;wpd2sxw&lt;/code&gt;, that uses &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; to read a WordPerfect document and produces a SXW. The core code of writerperfect is used also in &lt;A HREF="http://www.koffice.org/kword/"&gt;KWord&lt;/A&gt;'s and &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; Writer's import filters.&lt;/P&gt;&lt;P&gt;Nevertheless, writerperfect produced with this document a nice well formed flat XML in SXW file-format. Since the generated flat XMLs never really validated against the OpenOffice.org 1.0 DTD, the well formed-test is so far the only tool that we are able to use to track regressions.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Valgrinding writerperfect&lt;/B&gt;&lt;/P&gt;&lt;P&gt;The things started to be a little bit more tough. Gdb was giving a partially corrupted trace and the resulting crash was outside the writerperfect code. So, in a desperate attempt to get the issue fixed, I tried to use &lt;A HREF="http://valgrind.org/"&gt;valgrind&lt;/A&gt; and check whether writerperfect does not have somewhere a jump or a branch dependent on an uninitialized variable. I run all documents of our regression suite through &lt;A HREF="http://valgrind.org/"&gt;valgrind&lt;/A&gt; and realized that writerperfect had a lot a lot a lot of memory problems. It took me whole weekend and more to remove all the memory leaks (partially destroyed objects due to non-virtual destructor in base classes, a container of pointers going out of scope,...). This work lead to the inclusion of writerperfect &lt;A HREF="http://valgrind.org/"&gt;valgrind&lt;/A&gt; test in our &lt;A HREF="http://www.abisource.com/~uwog/libwpd-regression/"&gt;regression test-suite&lt;/A&gt; and in removal of all detected memory problems.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Problems with SXW generation on x86_64&lt;/B&gt;&lt;/P&gt;&lt;P&gt;After all this cleanup work, I tried to load the document again. And &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; crashed again exactly like the past times. Moreover, on my home machine that runs &lt;i&gt;Ubuntu Edgy amd64&lt;/i&gt;, the command-line tool &lt;code&gt;wpd2sxw&lt;/code&gt; produced a clean XML in SXW format on standard output, but the &lt;code&gt;content.xml&lt;/code&gt; in the zip file contained some garbage characters. On other machine, running &lt;i&gt;Ubuntu Edgy i386&lt;/i&gt;, the garbage was not there.&lt;/P&gt;&lt;P&gt;&lt;B&gt;The amazing permissivity of the WordPerfect file-format&lt;/B&gt;&lt;/P&gt;&lt;P&gt;A bit disgusted, I asked Mathias Bauer whether he cannot see anything. He took the document and confirmed that the trace (the part I could not see because of the corruption) originates from the WordPerfect importer. So, the last desperate move was to boot the Windows partition and examine the document in WordPerfect itself. I know, would be maybe the first step, but given that I have only one Windows partition and that one is on my wife's laptop... Side-by-side examination of the original document opened in WordPerfect and the converted document opened in &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; showed that it was true that &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; opened the document, but it did import only half of it. So, the time came to have some nice eye-to-eye session with &lt;A HREF="http://directory.fsf.org/ghex.html"&gt;ghex2&lt;/A&gt;. The close examination of the document using hexadecimal viewer showed that the document contains a footnote that itself contains 3 footnotes. WordPerfect reacts to such cases by ignoring completely the nested footnotes, but it leaves the functions in the stream unchanged. I am always puzzled seeing the way WordPerfect preserves user's errors for future generations. So the solution was simply to instruct libwpd to ignore foot/endnotes if it is already parsing a foot/endnote. Simple fix of some lines and the document loads correctly in &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt;, &lt;A HREF="http://www.abisource.com/"&gt;AbiWord&lt;/A&gt; and &lt;A HREF="http://www.koffice.org/kword/"&gt;KWord&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;&lt;B&gt;&lt;code&gt;gsf_output_printf&lt;/code&gt; and long strings on x86_64&lt;/B&gt;&lt;/P&gt;&lt;P&gt;wpd2sxw command-line tool uses &lt;A HREF="http://directory.fsf.org/All/libgsf.html"&gt;libgsf&lt;/A&gt; abstraction for writing different streams into the the SXW zip-file. So, after having audited our code thoroughly and not finding anything that could be wrong, my attention turned to libgsf, more exactly to the &lt;code&gt;gsf_output_printf&lt;/code&gt; function. I discovered that this function uses among others &lt;code&gt;g_vsnprintf&lt;/code&gt; call. Knowing the woes that one can have due to different implementations of &lt;code&gt;vsnprintf&lt;/code&gt; out there, I replaced the &lt;code&gt;gsf_output_printf&lt;/code&gt; calls by &lt;code&gt;gsf_output_puts&lt;/code&gt; calls and...&lt;/P&gt;&lt;P&gt;... the resulting SXW loaded into the OpenOffice.org without any problem. Instead of bugging Jody who should have by now enough of me for some weeks (so much I tried to suck knowledge out of his brain in my H.Opeless phase), I spoke to Dom Lachowicz about the problem and, eventually, Morten &lt;A HREF="http://cvs.gnome.org/viewcvs/libgsf/gsf/gsf-output.c?r1=1.44&amp;amp;r2=1.45"&gt;fixed&lt;/A&gt; it in &lt;A HREF="http://directory.fsf.org/All/libgsf.html"&gt;libgsf&lt;/A&gt; CVS. It turned out to be &lt;A HREF="http://cvs.gnome.org/viewcvs/libgsf/gsf/gsf-output-memory.c?r1=1.29&amp;amp;r2=1.30"&gt;the same problem&lt;/A&gt; that affected about a year ago the GsfOutputMemory.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Positive externalities of being lost&lt;/B&gt;&lt;/P&gt;&lt;P&gt;It is true that the real fix for &lt;A HREF="http://www.openoffice.org/issues/show_bug.cgi?id=71487"&gt;issue 71487&lt;/A&gt; did not take more than few lines of code, but the fact of being lost and H.Opeless for some time had nice positive externalities. Thanks to this situation, it came to my mind to start to &lt;A HREF="http://valgrind.org/"&gt;valgrind&lt;/A&gt; the writerperfect code (it was not on my todo list, at this time at least) and the memory problems got solved. A bug in &lt;A HREF="http://directory.fsf.org/All/libgsf.html"&gt;libgsf&lt;/A&gt; code was triggered and fixed.&lt;/P&gt;&lt;P&gt;And so, in spite of the fact that I lost quite a lot of time with this, I feel lucky when I look at the positive externalities.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116549541971931737?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116549541971931737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116549541971931737'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/12/benefits-of-getting-lost.html' title='Benefits of getting lost'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116238730160962134</id><published>2006-11-01T14:15:00.000+01:00</published><updated>2006-11-01T14:21:41.626+01:00</updated><title type='text'>On specifications, flame-wars and community building</title><content type='html'>&lt;P&gt;I am not really a big fan of lengthy flame-wars in mailing lists, but I have to recognize that sometimes they can be really having a positive effect in making things move. This conviction was born in me quite recently after I followed the &amp;quot;Specification Process&amp;quot; mega-thread on &lt;A HREF="news://news.gmane.org/gmane.comp.openoffice.releases"&gt;dev@openoffice.org&lt;/A&gt;. This thread was born out of a (quite legitimate, I must say) complaint about one community contribution to OpenOffice.org, then it went into some kind of criticism/defence of the current specification process and now it is heading to the core of all problems - developer community building. And that is exactly the issue that I would like to give some thoughts about in this blog.&lt;/P&gt;&lt;P&gt;&lt;B&gt;The question is how!&lt;/B&gt;&lt;/P&gt;&lt;P&gt;The first thing that one should realize is that the question is not now whether we should or not build a developer community. The current state of 93% of all contributions done by Sun is not an optimal state and does not profit anybody. If this figure does not change in favour of community contribution, quite frankly, the fact to open-source the whole monster will mean a net loss for Sun. Since it is most likely that the 7% of community contributions simply create more than that amount of overhead in the work amount of Sun engineers/QA/UserEx/administration. So, what is the solution? Close it again and release time to time a free (as beer) version of StarOffice? I do not think so! The only option that is having any sense is to build the developer community beyond the critical mass that brings a net win. Only then we can profit fully from the advantages of open-source model.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Hunting without target?&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Almost everybody will agree that it is quite unlikely (although statistically possible) to kill a rabbit, a deer or a pheasant by shooting into a forest and hoping that the target will find the bullet. It is somehow similar with community building. We have to be proactive in this task. Determine what can attract developers and do exactly that; determine what can hinder community participation and try to eliminate it as much as it is reasonably possible.&lt;/P&gt;&lt;P&gt;I pointed out some of the issues in my &lt;A HREF="http://ooocon-arnes.kiberpipa.org/media/From_TrainedMonkey_to_GoogleSoC_Fridrich_Strba/video.ogg.m3u"&gt;OOoCon2006 talk&lt;/A&gt; in Lyon. Quite frankly, I do not really believe that giving ODF talks in different conferences (although important from the marketing point of view) will bring any developer community to life. It is still in the line of what I would call &lt;I&gt;marketing of the product&lt;/I&gt; as opposed to the &lt;I&gt;marketing of the project&lt;/I&gt;. Maybe it is a time to have a developer speak to potential developers. Being able to understand one's target audience is not only an advantage, but a vital necessity for this task.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Waste their time, lose them&lt;/B&gt;&lt;/P&gt;&lt;P&gt;The miracle about the FOSS contributors is that they are really ready to spend their time giving out free work as long as they see that they make a difference and they satisfy their thirst of intellectual challenges. But if these intellectual challenges  are hindered by a big stone laid on their chest, they are likely to go somewhere else where they will have more impact and feel more like they matter.  Yes, it will require some extra work to lower the barriers for external contributors, but the discounted benefit for sure overweights the cost.&lt;/P&gt;&lt;P&gt;A frustrated employee might voice her frustration but will eventually STFU because her family needs the money. A frustrated FOSS contributor will voice her frustration (if the project is lucky) and eventually exit. Because the time spent fighting with the dragon means less time spent with those whom she loves and who love her. It is as simple as that.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Agile, XP vs. &amp;quot;Big Design Up Front&amp;quot;?&lt;/B&gt;&lt;/P&gt;&lt;P&gt;It has to be encoded somewhere in the human genes that when something is not giving optimal solution, a complete negation of that approach is considered as the miraculous way out. This specification discussion shows is also in a clear way. I do not really think that the two approaches are mutually exclusive and fundamentally incompatible. The truth is somewhere in the middle. A project of the size of the OpenOffice.org cannot live without any up front design. On the other hand, transposing Hamburg workflow into a normative specification process looks kind of sick too. Nobody ever can defend an idea that saving 10 minutes of his time is worth adding hours to the time wasted by others. Maybe it is now the time to gather all stakeholders and sit together as community and come up with a process that is satisfying all parts. If we are more inspired by agile principles (I speak about principles, not rules and fit-all methods), the overall quality of the product will benefit and - it is very likely, that in middle term - the developers, QA and UserEx will be less overworked too.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116238730160962134?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116238730160962134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116238730160962134'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/11/on-specifications-flame-wars-and.html' title='On specifications, flame-wars and community building'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116160519379061001</id><published>2006-10-23T14:04:00.000+02:00</published><updated>2006-10-23T14:06:33.803+02:00</updated><title type='text'>Open XML</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.sun.com/dancer/entry/ibm_s_bob_sutor_about1"&gt;Erwin&lt;/a&gt;, it does not necessarily have to be a big problem for &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; or other FOSS wordprocessing/spreadsheet/presentation software to support the Open XML document format. I do not say, it will be trivial (over 4000 pages of specifications is quite a long reading for sure), but the fact that M'soft is dumping into the format their internal data representation means that one would not start from scratch implementing it. The binary MS Office formats -- that FOSS applications support quite well -- are also in a big extent the dump of the Office's internal data representation and it is quite unlikely that M'soft is undertaking any significant rewriting of the MS Office's internals.&lt;/p&gt;&lt;p&gt;So, IMHO, the solution is to fight successfully the temptation that people have to speak without thinking about XSLT when they hear about XML to XML conversion, to look beyond the container at the content and realize that the code in the WW8 filters might be to a big extent reusable for supporting the Open XML .docx file-format at least.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116160519379061001?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116160519379061001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116160519379061001'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/10/open-xml.html' title='Open XML'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-116038687257752009</id><published>2006-10-09T11:35:00.000+02:00</published><updated>2006-10-09T11:41:13.193+02:00</updated><title type='text'>Cleaning up my mess</title><content type='html'>&lt;P&gt;When I was a child, my mother would really try to teach me to clean up my mess before I &lt;A HREF="http://fridrich.blogspot.com/2006/09/it-is-finished.html"&gt;leave a place&lt;/A&gt;. Not saying that she managed to train me to do it always, but I try to do the things right and, surprisingly, sometimes I even manage. So, here are the things that I really did not want to leave unfinished:&lt;/P&gt;&lt;P&gt;&lt;B&gt;WordPerfect Graphics Import filter&lt;/B&gt;&lt;/P&gt;&lt;P&gt;That is the &lt;A HREF="http://code.google.com/soc/ooo/appinfo.html?csaid=E0F7DFCE3B2025CD"&gt;Google Summer of Code project&lt;/A&gt; that I mentored. Our contract with &lt;A HREF="http://ariya.blogspot.com/"&gt;Ariya&lt;/A&gt; was that he does the hard part of implementing the library that actually reads the WPG files and converts them and that I will get all the glory by wrapping it into an import filter for OpenOffice.org.&lt;/P&gt;&lt;P&gt;The glory was quite costly though. Quite a hacking during the &lt;A HREF="http://marketing.openoffice.org/ooocon2006/"&gt;OOoCon2006&lt;/A&gt; in Lyon to extract from the command-line wpg2odg the converter itself and make it produce SAX messages instead of directly writing an XML in odg format.&lt;/P&gt;&lt;P&gt;For those that followed my &lt;A HREF="http://ooocon-arnes.kiberpipa.org/media/From_TrainedMonkey_to_GoogleSoC_Fridrich_Strba/video.ogg.m3u"&gt;presentation&lt;/A&gt; in Lyon, and thus they know that there was still a little hick in the filter at that time, this is the explanation: If you have an XML based filter in OOo that produces SAX messages in OpenDocument format, the service that should receive the messages should be &lt;code&gt;com.sun.star.comp.&lt;i&gt;&amp;lt;Application&amp;gt;&lt;/i&gt;.XML&lt;B&gt;Oasis&lt;/B&gt;Importer&lt;/code&gt;, where &lt;code&gt;Application&lt;/code&gt; can be &lt;code&gt;Writer&lt;/code&gt;, &lt;code&gt;Draw&lt;/code&gt;,... If you try to push those messages into &lt;code&gt;com.sun.star.comp.&lt;i&gt;&amp;lt;Application&amp;gt;&lt;/i&gt;.XMLImporter&lt;/code&gt;, designed to receive SAX messages in OpenOffice.org 1.x file-format, it will not shout loudly, but the resulting document will be empty. I know, I should have been aware of it, but as a TrainedMonkey&lt;sup&gt;TM&lt;/sup&gt;, I am designed to have some error rate in my functioning :-)&lt;/P&gt;&lt;P&gt;For those that want to try it, you can fetch modules libwpg and wpg2odg from the &lt;A HREF="http://sourceforge.net/projects/libwpg/"&gt;libwpg&lt;/A&gt; &lt;A HREF="http://sourceforge.net/cvs/?group_id=100237"&gt;CVS repository&lt;/A&gt;. Build the libwpg and install it, then configure your &lt;A HREF="http://download.openoffice.org/680/sdk.html"&gt;OpenOffice.org SDK&lt;/A&gt; and build the package inside the SDK shell using the &lt;code&gt;Makefile.ooo-external&lt;/code&gt;. Your &lt;code&gt;WPGImportFilter.uno.zip&lt;/code&gt; package will be found in LINUX.out/bin directory (yeah, I tested it on GNU/Linux, but it should be trivial to make it work on win32 and/or Solaris too). You can just install it using the Package manager and here you go with a WPG Import and a proper type-detection as a bonus.&lt;/P&gt;&lt;P&gt;Inspired by &lt;A HREF="http://artax.karlin.mff.cuni.cz/~kendy/blog/archives/monthly/2006-10.html#2006-10-02T17_14_44.htm"&gt;kendy's post about the svg import filter&lt;/A&gt; that he writes, I think that eventually rewriting the importer to use the UNO Drawing API would be not a bad idea. So if someone has some idle cycles and wants to change the horse that is winning, feel free to do it :-)&lt;/P&gt;&lt;P&gt;&lt;B&gt;libwpd 0.8.7&lt;/B&gt;&lt;/P&gt;&lt;P&gt;A big thanks to William that was so nice and did the legwork for the 0.8.7 release of  &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;. He named the release &lt;A HREF="http://libwpd.sourceforge.net/news.html"&gt;&amp;quot;Big Apple&amp;quot;&lt;/A&gt;. Thank God, we did not release it on 10/9 and not on 9/11. Given the latent paranoia everywhere, we might have a problem and my wife could eventually discover what is on my hard-disk :-)&lt;/P&gt;&lt;P&gt;The big feature is that now libwpd supports all existing WordPerfect file-formats. To a certain extent, naturally. The set of converted features is bigger for those file-formats where we own the underlying implementations. Because writing file-filter only using the documentation is harder that writing it not having the docs, but having the implementation. See the difference in feature-set between the WordPerfect 4.x file-format (we do not have WP 4.2, but we have the documentation) and the WordPerfect for Mac 1.x file-format (we do not have the documentation, but we have a working copy of the application).&lt;/P&gt;&lt;P&gt;&lt;B&gt;Writely&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Last week I had a quick glance at &lt;A HREF="http://www.writely.com/"&gt;Writely&lt;/A&gt;, the Google web-based text editor, that allows collaborative editing. As a filter writer and &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; developer, I am a bit puzzled that the document upload allows only &lt;code&gt;.doc&lt;/code&gt;, &lt;code&gt;.sxw&lt;/code&gt; and &lt;code&gt;.odt&lt;/code&gt; files. Given that there is a nice library for reading WordPerfect&lt;sup&gt;TM&lt;/sup&gt; documents and that this library is licensed under LGPL, it should not be really difficult to add &lt;code&gt;.wpd&lt;/code&gt; files to supported documents. If you are interested, guys, I know &lt;A HREF="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;someone&lt;/A&gt; who would be able to do it :-)&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-116038687257752009?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116038687257752009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/116038687257752009'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/10/cleaning-up-my-mess.html' title='Cleaning up my mess'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115995054123425933</id><published>2006-10-04T10:28:00.000+02:00</published><updated>2006-10-04T10:29:01.250+02:00</updated><title type='text'>Frustrations</title><content type='html'>&lt;P&gt;It is some months today that I am &lt;a href="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;desperately looking for a job&lt;/a&gt; that would allow me to feed my family and provide for them a more or less decent life. The task can make one feel frustrated until the point of asking oneself about one's own value and about the value of FOSS involvement.&lt;/P&gt;&lt;P&gt;One of the frustrating things is that some of the most hip companies in the market, after they screen you on the phone and/or after they make you come some hundreds of kilometres during your holiday for an interview, and after even promising you that you will have their news in some days, keep silence for sometimes as long as one year. Yes, it might be that your servant is not good at all and that the interview/telephone screen showed it clearly. The point is that the courtesy of saying: &amp;quot;Sorry, we chose other candidate&amp;quot; or &amp;quot;Sorry, you profile is not corresponding to our needs&amp;quot; would be at least a feed-back.&lt;/P&gt;&lt;P&gt;The impression is that my FOSS involvement is welcome and appreciated when it is a free work given (I do not say I did not do it gladly and that it did not bring me joy at certain point of time), but as soon as I put a price-tag on my competences, it stops being so interesting for many. Quite frustrating discovery&lt;/P&gt;&lt;P&gt;OK, just trying to ventilate some of my frustrations. Sorry for eating up of your reading time.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115995054123425933?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115995054123425933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115995054123425933'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/10/frustrations.html' title='Frustrations'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115876116146305982</id><published>2006-09-20T16:03:00.000+02:00</published><updated>2006-09-20T16:06:01.476+02:00</updated><title type='text'>It is finished</title><content type='html'>&lt;p&gt;It was really nice to be around, but the real life is stronger. TrainedMonkey&lt;sup&gt;TM&lt;/sup&gt; stops his FOSS activities. Once again, it was nice to be around and I learnt a lot.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115876116146305982?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115876116146305982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115876116146305982'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/09/it-is-finished.html' title='It is finished'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115852483441636300</id><published>2006-09-17T22:25:00.000+02:00</published><updated>2006-09-17T22:43:41.986+02:00</updated><title type='text'>It's a kind of magic</title><content type='html'>&lt;P&gt;As many of us, &lt;A HREF="http://fridrich.blogspot.com/"&gt;TrainedMonkey&lt;sup&gt;TM&lt;/sup&gt;&lt;/A&gt; also left Lyon and reached safely his home and rejoiced to meet again his beautiful wife and his handsome son. How long can be five days when your heart is missing someone!&lt;/P&gt;&lt;P&gt;As Louis rightly mentioned, each OOoCON has a special flavour. This one had a flavour of the &amp;quot;andouillettes&amp;quot; and &amp;quot;quenelles de poisson&amp;quot; ;-) For details, ask &lt;A HREF="http://blog.janik.cz/archives/2006/09/12/T00_30_30/"&gt;Pavel&lt;/A&gt; &lt;A HREF="http://blog.janik.cz/archives/2006/09/12/T01_07_57/"&gt;Jan&amp;iacute;k&lt;/A&gt;!&lt;/P&gt;&lt;P&gt;There is nevertheless something special, I would even say something magic, about the &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; community (and I speak with a special reference to the &lt;A HREF="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/A&gt; &lt;B&gt;developer&lt;/B&gt; community). It disregards almost all cleavages that exist in the FOSS realm. You can see during the dinner &lt;A HREF="http://www.gnome.org/~jody/blog/"&gt;Jody&lt;/A&gt; seconded by &lt;A HREF="http://fridrich.blogspot.com/"&gt;TrainedMonkey&lt;sup&gt;TM&lt;/sup&gt;&lt;/A&gt; discussing about the relevance of GObject framework with &amp;Eacute;ric Bischoff, a &lt;A HREF="http://www.kde.org/"&gt;KDE&lt;/A&gt; developer. You can see &lt;A HREF="http://www.novell.com/"&gt;Novell&lt;/A&gt;/&lt;A HREF="http://www.suse.cz/"&gt;Suse&lt;/A&gt; developers having nice time with the &lt;A HREF="http://www.redhat.com/"&gt;RedHat&lt;/A&gt; one; &lt;A HREF="http://www.ubuntu.com/"&gt;Ubuntu&lt;/A&gt; OpenOffice.org maintainer teasing (I have to confess that with a big help from your servant) the &lt;A HREF="http://www.debian.org/"&gt;Debian&lt;/A&gt; maintainer. You can even find &lt;A HREF="http://www.sun.com/software/star/staroffice/index.jsp"&gt;Sun&lt;/A&gt; developers running &lt;A HREF="http://www.microsoft.com/windows/default.mspx"&gt;MS Windows&lt;/A&gt; on their laptops ;-) A bunch of men and women, far from petty tribal conflicts, trying to have fun hacking on a project they believe in. And this is the setting that I really love and appreciate. The only negative part is that I was not able to get the &lt;A HREF="http://www.neooffice.org/"&gt;www.neooffice.org&lt;/A&gt; t-shirt. I do not know whether it is due to the fact that &lt;A HREF="http://blog.janik.cz/archives/2006/09/15/T13_00_43/"&gt;I have no car&lt;/A&gt; ;-)&lt;/P&gt;&lt;P&gt;And just to add: Charles, I may understand your disappointment with some events, but NO, I AM NOT IN WAR AGAINST ANYBODY!&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115852483441636300?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115852483441636300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115852483441636300'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/09/its-kind-of-magic.html' title='It&apos;s a kind of magic'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115703916703147472</id><published>2006-08-31T17:40:00.001+02:00</published><updated>2011-01-04T16:46:34.494+01:00</updated><title type='text'>Mac Mini and WP Mac file-formats</title><content type='html'>&lt;P&gt;&lt;B&gt;Mac Mini donated by unnamed on behalf of unnamed :-)&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Thank to a Mac Mini given to me for the purposes of libwpd development by a person that does not want to be mentioned, as a part of a bigger donation by a company that does not want to be mentioned either (I promised to be discrete, am I?), I was able to do some more work on the support of WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; for Mac file-formats inside &lt;A HREF="http://libwpd.sf.net/"&gt;libwpd&lt;/A&gt;. As from the version 0.8.6, &lt;A HREF="http://libwpd.sf.net/"&gt;libwpd&lt;/A&gt; has a support for WP Mac 2.x file-format and the CVS HEAD has an initial support for the oldest WP Mac file-format, 1.x.&lt;/P&gt;&lt;P&gt;Since I was looking for the specifications for these two file-formats for some time without any success, I would just want to give the information that I have:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;&lt;B&gt;WP Mac 2.x&lt;/B&gt; looks basically like the WP Mac 3.x file-format with the difference, that it does not support tables. Instead of tables, it uses parallel text columns (WP speciality?). Nevertheless, from the point of view of an import filter, this means that the code that is reading WP Mac 3.x files will work with WP Mac 2.x.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;&lt;B&gt;WP Mac 1.x&lt;/B&gt; file-format is a special one. It manifestly based on WP Dos 4.2, with some elements that one can find later in WP Mac 2.x and 3.x. Since we again do not have any documentation besides a working WordPerfect 1.0.5 (Could a company whose name starts by &amp;quot;M&amp;quot; and ends by &amp;quot;icrosoft&amp;quot; show us how functional is their word processor from 1988?), I will describe what I managed to understand from this format by reverse-engineering. Like that people who are without success looking for the specifications may find this blog and earn me some money by clicking on the adds :-)&lt;/P&gt;&lt;/UL&gt;&lt;P&gt;&lt;B&gt;WordPerfect for Macintosh 1.0 file-format&lt;/B&gt;&lt;/P&gt;&lt;P&gt;WP Mac 1.x is similar to WP Dos 4.2 in the fact that it has no header whatever, just a plain text with WP functions inserted. According to my observation, they are similar to the extend that a function that has certain purpose in WP 4.2, will have the same or at least very very very similar purpose in WP Mac 1.x, although the function lengths may be different between the two formats.&lt;/P&gt;&lt;P&gt;The block of codes between 0x80 and 0xBF are &lt;I&gt;Single byte functions&lt;/I&gt; that are identical (at least I did not find difference until now) in the two file-formats.&lt;/P&gt;&lt;P&gt;The codes from 0xC0 to 0xFF (?) are codes for &lt;I&gt;Multi-byte functions&lt;/I&gt;. They can have different sizes. A more or less accurate account of the sizes (including the opening and closing gates) can be found &lt;A HREF="http://libwpd.git.sourceforge.net/git/gitweb.cgi?p=libwpd/libwpd;a=blob;f=src/lib/WP1FileStructure.cpp;h=15dc67a07efeadf6ffef546c7767ab6953de7a8b;hb=HEAD"&gt;here&lt;/A&gt; and will be always updated as I am advancing in my study of the file-format. The functions where the length is mentioned as a positive number are &lt;I&gt;Fixed-length functions&lt;/I&gt; and those ones where there is &amp;quot;-1&amp;quot; instead of the length, are &lt;I&gt;Variable-length functions&lt;/I&gt;. It is in both subgroups of the &lt;I&gt;Multi-byte functions&lt;/I&gt; that the difference between the WP Dos 4.2 and WP Mac 1.x file-formats exists.&lt;/P&gt;&lt;P&gt;One of the differences is that where WP Dos 4.2 measures the margins, positions and other lengths in “text columns” (8-bit value), WP Mac 1.x uses points as 16-bit (unsigned?) big-endian ordered number (72 points = 1 inch). This is contributing to the difference concerning the length of &lt;I&gt;Fixed-length functions&lt;/I&gt; between the two formats.&lt;/P&gt;&lt;P&gt;As for the &lt;I&gt;Variable length functions&lt;/I&gt;, the difference between WP Dos 4.2 and WP Mac 1.x is big. In the WP 4.2 file-format, to know the length of the function one needed to scan for the closing gate, WP Mac 1.x gives the size of the data as a 32-bit big-endian ordered unsigned number just after the opening gate and just before the closing gate. It means that the function length is this number plus the 10 bytes that correspond to its double occurrence as well as to the opening and closing gate. Those that are used to work with Corel documentation will find this maybe more clear:&lt;/P&gt;&lt;P&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;lt;function code&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 byte&lt;br&gt;&amp;nbsp;&amp;nbsp;{size of data}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;32-bit big-endian ordered unsigned integer&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;data&amp;gt; x size of data&lt;br&gt;&amp;nbsp;&amp;nbsp;{size of data}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;function code&amp;gt;&lt;/code&gt;&lt;/P&gt;&lt;P&gt;When reverse-engineering the function codes, it is wise to be inspired by both WP Dos 4.2 and WP Mac 3.x file formats. Certain functions follow very closely the WP Dos 4.2 specifications (with above mentioned differences in the length and position information), certain functions follow the WP Mac 3.x logic (like the Tab Set is containing condensed tab tables that follow the logic of WP3 Set Tabs function).&lt;/P&gt;&lt;P&gt;&lt;B&gt;Help me!&lt;/B&gt;&lt;/P&gt;&lt;P&gt;I also met quite a big problem concerning the font information. The file-format is storing the font information in 16-bit number, that was identified by &lt;A HREF="http://www.figuiere.net/hub/blog/"&gt;hub&lt;/A&gt; as corresponding to Macintosh fontID. According to a newer &lt;A HREF="http://partners.adobe.com/public/developer/en/atm/5137.MacFontTips.pdf"&gt;Apple documentation&lt;/A&gt; and also according to a &lt;a href="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;sound mind&lt;/a&gt; (no more appropriate link &lt;a href="http://fridrich.blogspot.com/"&gt;here&lt;/a&gt; :-) ), identifying fonts by fontID is broken by design. Nevertheless, on the way towards the world domination of &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;, it would be an error not to try to convert the font information at least. If someone of you knows about a way to get unambiguously the font name from fontID (&lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; is being used on many platforms, so the presence of Apple API is not to be assumed), I will not refuse such information. OTOH, a table mapping 0xFFFF+1 numbers to strings would bloat a bit the &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;. But, if there is a way to place the fontIDs into groups and map the groups each one to one font that is representative of the group, it shouldn't be so difficult to convince me to try to implement it :-)&lt;/P&gt;&lt;P&gt;&lt;B&gt;World domination under way&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Having said this, it looks like libwpd 0.8.7 (whenever we release it) will probably support to a certain extent &lt;B&gt;&lt;U&gt;&lt;I&gt;ALL&lt;/I&gt;&lt;/U&gt;&lt;/B&gt; WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; file-formats on this &lt;a href="http://earth.google.com/"&gt;planet&lt;/a&gt;. Did WP Dos 1.x ever exist?&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115703916703147472?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115703916703147472'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115703916703147472'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/08/mac-mini-and-wp-mac-file-formats.html' title='Mac Mini and WP Mac file-formats'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115701421074840954</id><published>2006-08-31T10:42:00.000+02:00</published><updated>2006-08-31T11:05:00.930+02:00</updated><title type='text'>IZbot</title><content type='html'>&lt;p&gt;A cool new feature is now available at #openoffice.org@irc.freenode.net (Yes, &lt;a href="http://uwog.net/blog"&gt;Marc&lt;/a&gt;, that is where all the hip children hang :-P):&lt;/p&gt;&lt;p&gt;If in a conversation a string &amp;quot;issue &amp;lt;number&amp;gt;&amp;quot; or &amp;quot;#i&amp;lt;number&amp;gt;&amp;quot; or &amp;quot;&amp;lt;URL of an issue&amp;gt;&amp;quot; appear, IZbot, a dedicated bot, completes the information with the URL, number of the issue, its nature and subject line (whichever was missing in the conversation). This is saving time looking up the IssueZilla while discussing about issues. Whoever implemented it, big thank you!&lt;/p&gt;&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; The thanks go to Christian Lohmaier, aka cloph. Danke!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115701421074840954?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115701421074840954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115701421074840954'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/08/izbot.html' title='IZbot'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115261046452853771</id><published>2006-07-11T11:29:00.000+02:00</published><updated>2006-11-16T21:41:42.763+01:00</updated><title type='text'>Upcomming libwpd-0.8.6 - more robust than ever</title><content type='html'>&lt;p&gt;&lt;a href="http://hei.unige.ch/%7Estrba5/resume/FridrichStrba.html"&gt;Your servant&lt;/a&gt; was working &lt;a href="http://fridrich.blogspot.com/2006/06/stress-testing.html"&gt;last two-three weeks&lt;/a&gt; together with &lt;a href="http://www.abisource.com/"&gt;AbiWord&lt;/a&gt;'s QA expert &lt;a href="http://1mus.blogspot.com/"&gt;sum1&lt;/a&gt; extensively on improving libwpd stability. Here are the result of the work (comparison between libwpd-0.8.5 and upcomming libwpd-0.8.6)&lt;/p&gt;
&lt;pre&gt;                   libwpd 0.8.5                libwpd 0.8.6

Total tested:      46675                       46675
Unsupported:         122 ( 0.26%)                 15 ( 0.03%)
                   -----                       -----
Actually tested:   46553 (99.74% import rate)  46660 (99.97% import rate)

Parse exceptions:    660                           0
File exceptions:     555                           8
Unknown errors:        5                           0
Crashes:              13                           0
                   -----                       -----
Total failures:     1233 (2.65% failure rate)      8 (0.02% failure rate)&lt;/pre&gt;
&lt;p&gt;From the 15 unrecognised documents, some are not WordPerfect documents at all, some are corrupted to the extend that they contain only 4 or 8 bytes which is too little even for a very intelligent corruption repair utility. Some are corrupted WP 4.2 documents that we cannot repair because of reasons shown below.&lt;/p&gt;&lt;p&gt;The 8 documents that fail to be converted are mainly WP 6 documents with corrupted prefix area.&lt;/p&gt;&lt;p&gt;The improvement are due to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Handling of impossible situations that are indeed possible with Corel WordPerfect file format, like tables with unequal number of cells in each row. Now we are completing this kind of tables to produce a valid output. Before, we would throw ParseException in such a case.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Trying to handle situation of any missing data due to corruption (i.e. prefix packet containing footnote missing, but still referenced by the text body)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A new corruption repair mechanism that manages to detect corrupted areas in document body, skip the inconsistent information and restart the normal document parsing after the corrupted area. Empirical tests showed that libwpd containing this heuristics will be able to open correctly some corrupted documents that make WordPerfect itself crash. Comparison between corrupted documents opened directly by libwpd and corrupted documents repaired by &lt;code&gt;wplook.exe&lt;/code&gt;, a corruption repair utility from WordPerfect SDK, show that libwpd's corruption repair heuristics can add some garbage characters at the corrupted place (due to the way it operates), but does not recover less information than &lt;code&gt;wplook.exe&lt;/code&gt;.
The only document format that we are not repairing for now is the WP 4.2 file format. This format does not have anyheader or magic value to detect it as such. It is simply a plain text document that has WordPerfect functions embedded. The type detection for this file format is done by dry-run parsing of the document and determining whether it is a well-formed WP 4.2 document. Adding our corruption removal heuristic in this case would mean that virtually any document on the earth would be detected as a WP 4.2 document and this is not really the result we want to achieve.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The thanks goes to &lt;a href="http://1mus.blogspot.com/"&gt;sum1&lt;/a&gt; who was able to collect from the web more than 46k of real-life WordPerfect documents and ran the test loop over and over again for each of my commits. This is showing how important is a dedicated, non-bureaucratic, responsive QA for the quality of an FOSS project.&lt;/p&gt;&lt;p"&gt;We can now proudly say to the users that if they fail to open their corrupted WordPerfect document with WordPerfect itself, it is not necessarily lost. They can try to open it with one of the fine free and open source wordprocessing software, AbiWord, Kword or OpenOffice.org Writer, and statistically they will be able to recover their information.&lt;/p&gt;&lt;p&gt;Subliminal message: &lt;strong&gt;What would be the score of the proprietary, binary, stale and unmaintained WordPerfect import filters distributed with &lt;a href="http://www.sun.com/software/star/staroffice/index.jsp"&gt;StarOffice8&lt;/a&gt;?&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115261046452853771?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115261046452853771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115261046452853771'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/07/upcomming-libwpd-086-more-robust-than.html' title='Upcomming libwpd-0.8.6 - more robust than ever'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115150024185153599</id><published>2006-06-28T15:09:00.000+02:00</published><updated>2006-06-28T15:10:41.873+02:00</updated><title type='text'>Stress-testing</title><content type='html'>&lt;p&gt;Several times since last year I heard a complain about the lack or insufficience of QA in small FOSS projects. Judge yourself the example of &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Recently we had a crasher regression discovered just some days after a release and &lt;a href="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;your servant&lt;/a&gt; was not happy at all about it. To prevent this kind of situation to arrise again, I approached &lt;a href="http://1mus.blogspot.com/"&gt;sum1&lt;/a&gt; of AbiWord fame and he agreed to QA the cvs head tree after a major commit and before a release. Here is his methodology:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;First, he crawls the web and, using a nice &lt;a href="http://www.mozilla.com/"&gt;firefox&lt;/a&gt; add-on called &lt;a href="http://www.downthemall.net/"&gt;DownThemAll!&lt;/a&gt;, he downloads all WordPerfect documents he finds.&lt;/li&gt;&lt;li&gt;Like that, he created himself a stock of about 40k real life documents in different WordPerfect formats. He throws 10k - 15k of these documents on &lt;strong&gt;wpd2raw&lt;/strong&gt;, a nice small utility that is distributed a s part of &lt;a href="http://libwpd.sourceforge.net/download.html"&gt;libwpd-tools&lt;/a&gt; package and is used by libwpd developers in their &lt;a href="http://www.nl.abisource.com/~uwog/libwpd-regression/"&gt;regression test suite&lt;/a&gt;. This QA run takes about an hour.&lt;/li&gt;&lt;li&gt;The documents that crash the tool and/or throw an exception are filed as bugs in &lt;a href="http://www.abisource.com/"&gt;AbiWord&lt;/a&gt; &lt;a href="http://bugzilla.abisource.com/"&gt;bugzilla&lt;/a&gt;, so that they can be dealt with.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A simple plan that has a lot of benefits. First of all, the &lt;a href="http://libwpd.sourceforge.net/"&gt;library&lt;/a&gt; is stress-tested against a considerable quantity of real-life documents, so that the developers can deal with any crasher situation found. Second, this QA testing helps to find quite complicated documents in rare WordPerfect formats and renders much easier to add new features in the list of converted features; especially where the documentation is a bit fuzzy or unavailable. Third, the documents that produced crashes that were really hard to fix / not trivial to see take place in the above-mentioned &lt;a href="http://www.nl.abisource.com/~uwog/libwpd-regression/"&gt;regression test suite&lt;/a&gt; so that they do not bite anymore.&lt;p&gt;&lt;p&gt;Just a little question: &lt;strong&gt;How much stress-tested are the proprietary, binary, stale and unmaintained WordPerfect filters distributed with &lt;a href="http://www.sun.com/software/star/staroffice/index.jsp"&gt;StarOffice 8&lt;/a&gt;&lt;/strong&gt;?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115150024185153599?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115150024185153599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115150024185153599'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/06/stress-testing.html' title='Stress-testing'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115107270075046422</id><published>2006-06-23T16:21:00.000+02:00</published><updated>2006-06-23T17:18:50.786+02:00</updated><title type='text'>The change is urgent</title><content type='html'>&lt;p&gt;It is now urgent to find a new job. If you are interested in hiring me, check my &lt;a href="http://hei.unige.ch/~strba5/resume/FridrichStrba.html"&gt;resume&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Thanks in advance&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115107270075046422?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115107270075046422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115107270075046422'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/06/change-is-urgent.html' title='The change is urgent'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-115002020865048463</id><published>2006-06-11T11:57:00.000+02:00</published><updated>2006-06-11T12:03:28.806+02:00</updated><title type='text'>Kind request towards libwpd packagers/maintainers</title><content type='html'>&lt;p&gt;Hello, one of the best QA guys in the known universe, Sum1 of AbiWord fame, run a lot of WP documents through the wpd2raw 0.8.5 and discovered a &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt; crash in WP5 parser in a very rare situation (if the font descriptor packet is there, but not the font list packet). Although it is really rare case, the problem exists and &lt;a href="http://libwpd.sourceforge.net/libwpd-0.8.5-wp5nofontlistcrash.patch"&gt;this patch&lt;/a&gt; is solving it. I would kindly ask the libwpd packagers to reissue for their distribution a new package containing this patch.&lt;/p&gt;&lt;p&gt;This means that I will try to push the 0.8.6 sometimes in the beginning of July just after I stuff a little bit more the WP42 parser. My apology for this regression.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-115002020865048463?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115002020865048463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/115002020865048463'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/06/kind-request-towards-libwpd.html' title='Kind request towards libwpd packagers/maintainers'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114916870719257563</id><published>2006-06-01T15:28:00.000+02:00</published><updated>2006-06-01T15:32:35.293+02:00</updated><title type='text'>libwpd 0.8.5 "reward for your patience" in the wild</title><content type='html'>&lt;P&gt;It has been almost 6 months without a &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; release. So, after you waited for it patiently, the &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; developer community has the pleasure to announce you that &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; 0.8.5, &amp;quot;reward for your patience&amp;quot;, has been released today (1&lt;SUP&gt;st&lt;/SUP&gt; June 2006) just to throw some shadow on the rather insignificant event of &lt;A HREF="http://www.ubuntu.com/"&gt;Ubuntu Dapper&lt;/A&gt; release.&lt;/P&gt;&lt;P&gt;So, &lt;B&gt;what has been done&lt;/B&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;We added some new items in the list of converted features for WP5 and WP3 formats. Font information (face, size, colour), headers/footers and footnotes/endnotes for WP5 and headers/footers for WP3 file-format.&lt;/P&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;We fixed some bugs (from which one crasher) and annoyances.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;We are now having the page/section/paragraph margins right even in multicolumn sections, which allows us to know which absolute position corresponds to which column and to count the relative position from the begining of the column. This is also allowing us to count correctly tabulator positions in multicolumn sections.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;We are now preventing -- inside the document body -- negative paragraph margins that were resulting from page margin change in the middle of a page which removes the ugly text border lines running across the text in some WP documents opened inside OpenOffice.org. Although, it is still possible to craft a document the way that there will be negative margins --in header and footer --, it is very unlikely to find something like this in the real life.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;We are avoiding closing page spans and/or sections inside a paragraph which used to add paragraph breaks where they were not supposed to be. We defer now the page span change to the end of the paragraph.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;We added to the wpd2text tool an option switch &amp;quot;--info&amp;quot;; if called with this switch, wpd2text will not convert the document in plain text, but dump the document meta-data instead. This feature could be used in a beagle WPD indexer if designed as a wrapper of wpd2text.&lt;/P&gt;&lt;/UL&gt;&lt;P&gt;&lt;B&gt;Future plans&lt;/B&gt;:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;P&gt;A fine hacker known from several FOSS projects, &lt;A HREF="http://ariya.pandu.org/"&gt;Ariya Hidayat&lt;/A&gt;, is sponsored by Google to work on the wpg2odg converter. Which means that the conversion of images in WP documents is not an abstract issue anymore. Welcome to Ariya and thank you to Google.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;As for me, I would like to implement tabulators in WP3 and WP5 file formats for 0.8.6 as well as to try to bring all the formats to the same level of features converted. Which means add multicolumn sections for WP5 and list styles for both WP3 and WP5. In the same time, I would like to stuff a little bit the WP42 parser.&lt;/P&gt;&lt;LI&gt;&lt;P&gt;One of my other objectives would be to motivate someone with a copy of WP 5.x to do the QA of changes in this file-format. I would like to thank in the same token Smokey Ardisson for his great QA work of WP3 changes. Without Smokey it would not be possible to arrive so far in the WP3 support. Thanks, Smokey, for being my eyes :-)&lt;/P&gt;&lt;/UL&gt;&lt;P&gt;&lt;B&gt;Bottom-line&lt;/B&gt;: With this changes, the &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; based filter is more powerfull than the proprietary WP filters shipped with StarOffice 8. A time to get rid of stale, unmaintained, proprietary binaries, isn't it?&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114916870719257563?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114916870719257563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114916870719257563'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/06/libwpd-085-reward-for-your-patience-in.html' title='libwpd 0.8.5 &quot;reward for your patience&quot; in the wild'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114841252596227726</id><published>2006-05-23T21:25:00.000+02:00</published><updated>2006-05-23T21:28:46.030+02:00</updated><title type='text'>Some precisions</title><content type='html'>&lt;P&gt;/me is amused to see different &lt;A HREF="http://uwog.net/blog/?p=41"&gt;conjectures&lt;/A&gt; concerning the &lt;A HREF="http://wiki.services.openoffice.org/wiki/SummerOfCode2006#Writer:_Import_Filter_for_Word_Perfect_Graphics_files"&gt;WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; Graphics documents importer&lt;/A&gt;. It is true that the base of this importer will be code that was written mainly by your servant for the &lt;A HREF="http://sourceforge.net/projects/libwpg/"&gt;libwpg&lt;/A&gt; project. I do not see any reason why not to use what was already done and extend it instead of trying to reinvent the wheel. The result will be a library reading images in WPG1 and WPG2 format and a filter built on the top of this library with an API that will be easily used for writing either a command line converter or a filter based on XFilter framework. Exactly like our writerperfect module is an importer built on the top of &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;The resulting library may be used afterwards by other projects, like Inkscape or Karbon14, since the library's API will be following close the SVG properties of different objects. /me is looking forward to mentoring the student who is quite experienced in writing import/export filters for a &lt;A HREF="http://www.koffice.org/"&gt;big FOSS project&lt;/A&gt;.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114841252596227726?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114841252596227726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114841252596227726'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/05/some-precisions.html' title='Some precisions'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114672894216677416</id><published>2006-05-04T09:47:00.000+02:00</published><updated>2006-05-04T09:49:02.176+02:00</updated><title type='text'>GO STUDENTS GO STUDENTS GO !!!</title><content type='html'>&lt;P&gt;I am writing this blog to attract your attention to a &lt;A HREF="http://wiki.services.openoffice.org/wiki/SummerOfCode2006#Writer:_Import_Filter_for_Word_Perfect_Graphics_files" TARGET="_blank"&gt;great SoC2006 project&lt;/A&gt;. I encourage students to apply for it. Reasons: &lt;A HREF="http://hei.unige.ch/~strba5/mmeeks/fridrich_big.png" TARGET="_blank"&gt;great and highly motivated mentor&lt;/A&gt;, &lt;A HREF="http://wiki.services.openoffice.org/wiki/SummerOfCode2006#Writer:_Import_Filter_for_Word_Perfect_Graphics_files"&gt;great task&lt;/A&gt;, &lt;A HREF="http://wiki.services.openoffice.org/wiki/SummerOfCode2006" TARGET="_blank"&gt;great mentoring organization&lt;/A&gt;, success and prosperity almost assured.&lt;/P&gt;&lt;P&gt;But seriously, it is a nice starting point for a wannabe &lt;A HREF="http://www.openoffice.org/" TARGET="_blank"&gt;OpenOffice.org&lt;/A&gt; contributor. So, go students go students go!&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114672894216677416?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114672894216677416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114672894216677416'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/05/go-students-go-students-go.html' title='GO STUDENTS GO STUDENTS GO !!!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114605161192782775</id><published>2006-04-26T13:32:00.000+02:00</published><updated>2006-04-26T13:41:24.533+02:00</updated><title type='text'>Writerperfect and KWord - reusing of code with many benefits!</title><content type='html'>&lt;P&gt;&lt;EM&gt;Writerperfect&lt;/EM&gt; is the import filter for WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; Documents inside OpenOffice.org 2.x. It uses a library, &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;, to read  WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; Documents and converts &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt;'s output to SAX messages in OpenOffice.org 1.0 Text File format (designed originally as an add-on for OpenOffice.org 1.1 and not needing any of the advanced features of OpenDocument format, the sxw output remained and works well in OpenOffice.org 2.x too).&lt;/P&gt;&lt;P&gt;Written principally by William Lachance (big thanks, Will), &lt;EM&gt;Writerperfect&lt;/EM&gt; has an intelligent design that is not limiting it to a specific document handler. This allows us to use &lt;EM&gt;Writerperfect&lt;/EM&gt; as a base of wpd2sxw command-line conversion tool, of the import filter integrated inside OpenOffice.org 2.x, of an import filter add-on for OpenOffice.org 1.1.x, and, soon, of a WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; import filter for &lt;STRONG&gt;KWord&lt;/STRONG&gt;, the word-processing component of &lt;A HREF="http://www.kde.org/"&gt;KDE&lt;/A&gt; office suite, &lt;A HREF="http://www.koffice.org/"&gt;KOffice&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;In fact, your servant and &lt;A HREF="http://ariya.blogspot.com/"&gt;Ariya Hidayat&lt;/A&gt; of &lt;A HREF="http://www.kde.org/"&gt;KDE&lt;/A&gt; fame have been working last weeks on an integration of &lt;EM&gt;Writerperfect&lt;/EM&gt; with &lt;STRONG&gt;KWord&lt;/STRONG&gt;. KOffice has a nice feature that allows different filters to be chained.&lt;/P&gt;&lt;P&gt;Since the version 1.4.0, as all major FOSS word processors,  &lt;STRONG&gt;KWord&lt;/STRONG&gt; is using, the &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; library as a base of it's import filter for WordPerfect&lt;SUP&gt;TM&lt;/SUP&gt; Documents. Since the use of &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; was something new for KOffice, the existing import filter is a bit rudimentary. Reusing of &lt;EM&gt;Writerperfect&lt;/EM&gt;'s code allows the import filter to benefit almost instantly from all features converted by &lt;A HREF="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/A&gt; modulo those that &lt;STRONG&gt;KWord&lt;/STRONG&gt;'s sxw importer does not support. Along the way, as we already found bugs in the sxw importer, it benefits also from the change. And, last but not least, &lt;EM&gt;Writerperfect&lt;/EM&gt; itself is likely to become more robust too.&lt;/P&gt;&lt;P&gt;Kendy, would you ever believe that your servant would be contributing to &lt;A HREF="http://www.kde.org/"&gt;KDE&lt;/A&gt;? :-)&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114605161192782775?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114605161192782775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114605161192782775'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/04/writerperfect-and-kword-reusing-of.html' title='Writerperfect and KWord - reusing of code with many benefits!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114535478920495179</id><published>2006-04-18T12:01:00.000+02:00</published><updated>2006-04-18T12:23:07.603+02:00</updated><title type='text'>WordPerfect Graphics conversion WANTS YOU!</title><content type='html'>&lt;p&gt;I heard many times a complain about how difficult it is to join the OpenOffice.org project as a developer. Although giving credit to some of these voices, I would like attract your attention to a simple way to do some development for OpenOffice.org without having to be familiar with UNO or any other of the strange OpenOffice.org concepts. At &lt;a href="http://sourceforge.net/projects/libwpg"&gt;http://sourceforge.net/projects/libwpg&lt;/a&gt; there is an interesting project trying to write a library for reading (and converting) WordPerfect Graphics (WPG) files. It is a nice little project written in C++ that is somehow stale now because those who contribute to it are busy with other things (like, for instance, the WordPerfect Document import).&lt;/p&gt;&lt;p&gt;&lt;b&gt;What should be done?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;IMHO, there are some things that can be interesting for someone that is beginning. In no particular order:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;iostreams&lt;/i&gt; - Since the WPG files are not embedded in an OLE stream, it is not necessary to use libgsf for input and output stream layer abstraction. In order to reduce the list of dependencies of the library, porting the input/output operations to C++ standard library classes would be a good thing. Moreover, it could be a good starting point to understanding how the library works without needing to have an in-depth knowledge of the WPG file format.&lt;/li&gt;&lt;li&gt;Add conversion of &lt;i&gt;bitmap&lt;/i&gt; parts of &lt;i&gt;WPG1&lt;/i&gt; files.&lt;/li&gt;&lt;li&gt;Add conversion of &lt;i&gt;WPG2&lt;/i&gt; files supporting single and double precision.&lt;/li&gt;&lt;li&gt;Write a small command-line tool that would use this library to convert graphics into &lt;i&gt;OpenDocument Drawing&lt;/i&gt; file format.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;What already exists?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The vector parts of WPG1 files are quite correctly converted although some attributes may be omitted. There is a command line tool called &lt;i&gt;wpg2svg&lt;/i&gt; that can be used to convert and visualize the vector graphics from WPG files in SVG format.&lt;br&gt;If you are interested, just grab the cvs module "libwpg" and start hacking. Send your patches to &lt;a href="mailto:libwpg-devel@lists.sourceforge.net"&gt;libwpg-devel@lists.sourceforge.net&lt;/a&gt;. Your work will be most appreciated.&lt;/p&gt;&lt;p&gt;&lt;b&gt;What is the benefit for me when doing it?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;"I do not have silver or gold, but what I have I will give it to you ..." Again in no particular order:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You will be my personal hero :-)&lt;/li&gt;&lt;li&gt;You will learn a lot about how to design and optimize a library that will be possibly used by many applications.&lt;/li&gt; &lt;li&gt;You will have the opportunity to collaborate in integrating this library into Openoffice.org. You will become in fact an Openoffice.org developper. This will give you the possibility to work with people like Caol&amp;aacute;n McNamara, Michael Meeks, Pavel Jan&amp;iacute;k or Jens-Heiner Rechtien ;-)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So, come! The success, glory and prosperity are waiting for you!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114535478920495179?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114535478920495179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114535478920495179'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/04/wordperfect-graphics-conversion-wants.html' title='WordPerfect Graphics conversion WANTS YOU!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-114406847185047626</id><published>2006-04-03T14:44:00.000+02:00</published><updated>2006-04-03T15:02:14.786+02:00</updated><title type='text'>Back again</title><content type='html'>&lt;P&gt;Long time since I blogged the last time! No valid excuses coming to my mind, so not giving any.&lt;/P&gt;&lt;P&gt;&lt;B&gt;SF.net vs. Colab.net - close call&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Every time I find a bit of time, I am trying to advance in the field of converting headers and footers in older WordPerfect formats (WP 5.x for Unix/DOS/Windows and WP 3.0 - 3.5e for Mac). A nice bunch of code is sitting in my computer. The only problem is that I cannot commit it since the SF.net project CVS services are off-line (partial outrage) since Wednesday. Although the match SF.net vs. Colab.net was starting clearly bad for the later, it becomes a close call now.&lt;/P&gt;&lt;P&gt;&lt;B&gt;WordPerfect for Mac 3.5 extended file-format&lt;/B&gt;&lt;/P&gt;&lt;P&gt;It is starting to be a bit problematic to convert documents that I am not able to see with the original application. For simple features it was OK. For headers and footers, one has to go through about 2 A4 sheets of hexadecimal garbage for every meaningful paragraph. It was really a genial idea to incorporate all formatting information into the document stream. It makes WordPerfect to be quick to render the document, but a programmer with ghex2 trying to convert it has a hard task.&lt;/P&gt;&lt;P&gt;&lt;B&gt;mdbdriver02&lt;/B&gt;&lt;/P&gt;&lt;P&gt;Thanks to Hanno Meyer-Thurow of Gentoo phame and his skills with gdb, the M$ Access driver in mdbdriver02 CWS is not crashing any more with the Northwind.mdb Orders table. Nevertheless, there is still a bit of work to be done before it is ready for the spotlights. But, we are advancing.&lt;/P&gt;&lt;P&gt;&lt;B&gt;Code review&lt;/B&gt;&lt;/P&gt;&lt;P&gt;It is something that is missing in OpenOffice.org, but it could really improve the quality of the code. (IMHO of a trained monkey, naturally.) I am excited about the fact that Frank Sch&amp;ouml;nheit is wanting to review the code of the mdbdriver02 CWS.&lt;/P&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-114406847185047626?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114406847185047626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/114406847185047626'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2006/04/back-again.html' title='Back again'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-113404916854043960</id><published>2005-12-08T14:37:00.000+01:00</published><updated>2005-12-08T14:41:47.506+01:00</updated><title type='text'>libwpd-0.8.4 and others</title><content type='html'>&lt;p&gt;It has been a long time since I last time blogged. It is a moment to reverse the tendency.&lt;/p&gt;&lt;p&gt;&lt;b&gt;libwpd-0.8.4&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt;&lt;/b&gt; 0.8.4 has been released. This version contains fixes for building with gcc-4.1.x and for building on MacOSX. It adds conversion of tables in WP5.x file-format. The main changes are in the conversion of documents in format WP3.x for MacIntosh - conversion of tables including the colour of the cell background; conversion of font face, font size and font colour information; conversion of sections with multiple columns; and conversion of footnotes and endnotes. Being a bugfix release, &lt;b&gt;&lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt;&lt;/b&gt; 0.8.4 is binary compatible with all previous versions of 0.8.x series.&lt;/p&gt;&lt;p&gt;Those that build with system libwpd are encouraged to grab the tarball as soon as they can; the others will have to wait for the integration of CWS fs05.&lt;/p&gt;&lt;p&gt;&lt;b&gt;fs03 is dead!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;After months of hesitation, I decided that the &lt;a href="http://fridrich.blogspot.com/2005/07/left-to-right-override.html"&gt;solution of unicode control codes&lt;/a&gt; is not really a good solution for &lt;a href="http://fridrich.blogspot.com/2005/06/how-to-switch-off-automatic.html"&gt;my existential problem&lt;/a&gt; from some time ago. The documents converted with a fs03 enabled &lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; would look horrible in any earlier version.&lt;/p&gt;&lt;p&gt;This means that a proper solution with visual to logical reordering would be the only good solution. Nevertheless, this is not as simple as that for different reasons:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;The reverse BiDi algorithm is not defined as part of the standard. &lt;a href="http://icu.sourceforge.net/"&gt;ICU&lt;/a&gt; implements it although it gives warnings about the actual results in the API documentation. &lt;a href="http://fribidi.freedesktop.org/wiki/"&gt;Fribidi&lt;/a&gt; does not even try to implement it. If you ask the developers about their plans to do so, they will answer you that the best approximation of visual-to-logical is the logical-to-visual itself.&lt;/p&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; uses &lt;a href="http://icu.sourceforge.net/"&gt;ICU&lt;/a&gt; while &lt;a href="http://www.abisource.com/"&gt;AbiWord&lt;/a&gt; uses &lt;a href="http://fribidi.freedesktop.org/wiki/"&gt;Fribidi&lt;/a&gt;. It means that one will have to abstract the reordering inside libwpd and leave the respective applications to provide the corresponding implementations. This solution would require an ABI change and will not be considered untill such a change does not become an unavoidable necessity for several other reasons. So, for the while, the Hebrew and Arabic text will be in wrong order in converted WordPerfect&lt;sup&gt;tm&lt;/sup&gt; documents. Sorry...&lt;/p&gt;&lt;/ol&gt;&lt;p&gt;&lt;b&gt;mdbdriver02&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I managed to resync the CWS mdbdriver02 with SRC680_m143. Thanks to Heiner for a prompt solution of my cwsresync problem. About 10 minutes after I told him about the problem, it was solved and included in CWS hr23. I call this quick and responsive action. Thanks, Heiner once again!&lt;/p&gt;&lt;p&gt;I created a &lt;a href="http://mdbtools.sourceforge.net/"&gt;mdbtools&lt;/a&gt; tarball that contains only the LGPL-ed code. I will have to come with a patch that they could commit upstream (if they decide to answer) and that would implement &lt;code&gt;--without-utils&lt;/code&gt; in the same way they already implement &lt;code&gt;--without-gmdb2&lt;/code&gt;. This solution would just allow us to eliminate the GPL-ed code using simple configure options as oposed to a patched configure.in.&lt;/p&gt;&lt;p&gt;The integration of mdbdriver02 is on a good path. Only that I have to write the specifications. It is not really a hard thing to do, but there are so many more exciting things to do in one's life.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-113404916854043960?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/113404916854043960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/113404916854043960'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/12/libwpd-084-and-others.html' title='libwpd-0.8.4 and others'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-113022621291189942</id><published>2005-10-25T09:36:00.000+02:00</published><updated>2005-10-25T09:43:32.920+02:00</updated><title type='text'>2005-10-25</title><content type='html'>&lt;p&gt;The 2004 was basically about it. We thought about it, we read books in order to be prepared for it, we planned it, we were dreaming about it and even breathing with it. It was supposed to be ready sometimes in the middle of November, but the codebase became so mature that a release on 25 October 2004 imposed itself naturally. Since then we are spending almost all of our time maintaining it. We learned a lot about it and from it. It brought us a lot of new knowledge and even some new friends. It has become the main topic of our conversations. During the year, the length of code almost doubled and the resulting package is about three times the initial volume. Even though it was released under strictly proprietary terms, we love it and it brought us a lot of joy. It is highly unlikely that we will license it ever to anybody under any condition. What is it so precious?&lt;/p&gt;&lt;p&gt;His name is &lt;a href="http://hei.unige.ch/~strba5/patrick/im000047.jpg"&gt;Patrick &amp;Scaron;trba&lt;/a&gt; and he is the God-given son of ours. &lt;a href="http://mypage.bluewin.ch/susanandfridrich/pictures/PatrickAndParents1.jpg"&gt;We&lt;/a&gt; thank God for his first year of life and pray that He protects him in the mighty way He has been doing until now.&lt;/p&gt;&lt;p&gt;Happy birthday, sweetheart&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-113022621291189942?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/113022621291189942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/113022621291189942'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/10/2005-10-25.html' title='2005-10-25'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-112633936152469722</id><published>2005-09-10T10:01:00.000+02:00</published><updated>2005-09-10T10:02:41.530+02:00</updated><title type='text'>Děkuji, Jane!</title><content type='html'>&lt;p&gt;I just realized after having read my last blog entry once again that I missed out something important. More than 50% of the patches in CWS morejava are from &lt;a href="http://artax.karlin.mff.cuni.cz/~kendy/blog"&gt;kendy&lt;/a&gt;. So I take this occasion to say simply a thank you. Děkuji, Jane!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-112633936152469722?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112633936152469722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112633936152469722'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/09/dkuji-jane.html' title='Děkuji, Jane!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-112567871767308111</id><published>2005-09-02T17:38:00.000+02:00</published><updated>2005-09-02T18:53:44.053+02:00</updated><title type='text'>Miscellaneous</title><content type='html'>&lt;p&gt;&lt;font size="+1"&gt;&lt;span style="font-weight: bold;"&gt;libwpd&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;So, after about two months, we released a new version of &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt; (0.8.3). There are some nice changes that allow libwpd to convert the text formating in a more faithful way than before. It also helped to clean a bit the libwpd internals which can be quite an advantage for future development. Those who build with system libwpd are encouraged to upgrade and profit immediately. Those who use the internal libwpd have to wait untill the CWS fs04 is integrated.&lt;/p&gt;&lt;p&gt;&lt;font style="font-weight: bold;" size="+1"&gt;more java&lt;/font&gt;&lt;/p&gt;&lt;p&gt;On another note, if you have problem building &lt;a  href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; with certain version of &lt;a href="http://java.sun.com/"&gt;Java&lt;sup&gt;TM&lt;/sup&gt;&lt;/a&gt;, please consider checking whether CWS morejava is not solving your problem. With this CWS integrated, I have built SRC680_m125 using jdk 1.3.1 to 1.5.0. Many thanks to Cyrille Moureaux and others who gave hands with this work.&lt;/p&gt;&lt;p&gt;&lt;font style="font-weight: bold;" size="+1"&gt;chose promise chose due&lt;/font&gt;&lt;/p&gt;&lt;p&gt;In CWS mdbdriver02, we were introducing a new module in the &lt;a href="http://external.openoffice.org/"&gt;external project&lt;/a&gt;. &lt;a href="http://blog.janik.cz/"&gt;Pavel&lt;/a&gt; asked me to blog about the procedure and I kind of promissed it. Chose promise, chose due! So, I am doing it now.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;First of all, the alias has to be created. The best way is to ask the &lt;a href="http://blogs.sun.com/roller/page/ratte/"&gt;maintainer&lt;/a&gt; of the &lt;a href="http://external.openoffice.org/"&gt;external project&lt;/a&gt;, unless you want to know the &lt;a href="http://www.collab.net/"&gt;CollabNet&lt;/a&gt; procedures out of curiosity. But, even then, it is good idea to have his green light.&lt;/li&gt;&lt;li&gt;Once the alias is created, there will be no tag on this module. So you will have to work on HEAD and mention in the comments of your CWS that it introduces a new module.&lt;/li&gt;&lt;li&gt;When the alias is created, there will not be necessarily the directory corresponding to your module in the &lt;a href="http://external.openoffice.org/source/browse/external/"&gt;external project's CVS&lt;/a&gt;. You will have to create one and here is the difficulty:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;If you checkout from the CVS the "external" module (cvs co external), you will get actually the "util/external", the directory &lt;a href="http://util.openoffice.org/source/browse/util/external/"&gt;"external" from util project's CVS&lt;/a&gt;. If you create a new directory, it will be committed into the &lt;a href="http://util.openoffice.org/"&gt;util&lt;/a&gt; project that you do not really want.&lt;/li&gt;&lt;li&gt;In order to check out the "right" "external", you must checkout one of the directories of &lt;a href="http://external.openoffice.org/"&gt;external project&lt;/a&gt; whose name is not identical to a directory in "util/external". For instance, "cvs co external/libwpd". You will have to position yourselves besides the libwpd subdirectory (in this case) in external directory, create a new directory and commit it using cvsadd. After that, you can checkout your module and work on it as usual, still remembering that you are working on HEAD.&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;p&gt;Ok, I do not know whether it was clear enough, but if you meet the problem, you will understand it for sure.&lt;/p&gt;&lt;p&gt;&lt;font style="font-weight: bold;" size="+1"&gt;ooocon2005&lt;/font&gt;&lt;/p&gt;&lt;p&gt;I am looking forward to see you people &lt;a  href="http://marketing.openoffice.org/ooocon2005/"&gt;there&lt;/a&gt;. I also hope to find there a short moment to hack a little bit more the &lt;a href="http://libwpd.sourceforge.net/"&gt;libwpd&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-112567871767308111?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112567871767308111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112567871767308111'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/09/miscellaneous.html' title='Miscellaneous'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-112254508123867390</id><published>2005-07-28T11:58:00.000+02:00</published><updated>2005-07-28T12:04:41.243+02:00</updated><title type='text'>Artmedia Petrzalka 5 - Celtic Glasgow 0 (in words: ZERO)</title><content type='html'>&lt;p&gt;Pleased to see that a club of Bratislava&amp;apos;s suburb has won the Scottish football giant in such a &lt;a href="http://news.bbc.co.uk/sport1/hi/football/teams/c/celtic/4718461.stm"&gt;wonderful way&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-112254508123867390?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112254508123867390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112254508123867390'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/07/artmedia-petrzalka-5-celtic-glasgow-0.html' title='Artmedia Petrzalka 5 - Celtic Glasgow 0 (in words: ZERO)'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-112083740371396511</id><published>2005-07-08T17:42:00.000+02:00</published><updated>2005-07-08T17:43:23.716+02:00</updated><title type='text'>Holiday</title><content type='html'>&lt;p&gt;Out for 2 week. Long deserved holiday in &lt;a href="http://www.zilina.sk/"&gt;my town of birth and childhood&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-112083740371396511?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112083740371396511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112083740371396511'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/07/holiday.html' title='Holiday'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-112021591636060796</id><published>2005-07-01T12:55:00.000+02:00</published><updated>2005-07-01T13:05:16.363+02:00</updated><title type='text'>Left-to-Right Override</title><content type='html'>&lt;p&gt;My &lt;a href="http://fridrich.blogspot.com/2005/06/how-to-switch-off-automatic.html"&gt;existential problem&lt;/a&gt; is almost solved. The solution is quite simple: to prepend every span with Left-to-Right Override (LRO; U+202d) code.&lt;/p&gt;&lt;p&gt;Yes, I said almost, because &lt;a href="http://qa.openoffice.org/issues/show_bug.cgi?id=51400"&gt;#i51400&lt;/a&gt; is blocking &lt;a href="http://qa.openoffice.org/issues/show_bug.cgi?id=51402"&gt;#i51402&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;That is why I did not include this issue into cws fs02, but created a separate cws fs03.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-112021591636060796?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112021591636060796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/112021591636060796'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/07/left-to-right-override.html' title='Left-to-Right Override'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-111947850436987066</id><published>2005-06-23T00:01:00.000+02:00</published><updated>2005-06-23T00:19:40.296+02:00</updated><title type='text'>libwpd-0.8.2</title><content type='html'>&lt;p&gt;Just to tell the world that &lt;a href="http://libwpd.sf.net/download.html"&gt;libwpd-0.8.2&lt;/a&gt; was released &lt;a href="http://libwpd.sf.net/news.html"&gt;today&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This release is the &amp;quot;bestest&amp;quot; ever since libwpd-0.8.1 and features mainly a huge improvement of WP5 extended characters handling. Nevertheless some other bugs were fixed in this release too. For more details, consult the &lt;a href="http://sourceforge.net/project/shownotes.php?release_id=336965"&gt;release notes&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Those that build &lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org&lt;/a&gt; with system libwpd are kindly encouraged to upgrade, those that use internal libwpd will have to wait for the integration of &lt;a href="http://eis.services.openoffice.org/EIS2/servlet/cws.ShowCWS?Id=2575&amp;Path=SRC680%2Ffs01"&gt;CWS fs01&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;N.B.:&lt;/strong&gt; I am nowadays editing my blogs in pure html directly without using any kind of GUI help. It is my prayer and hope that this time I will not break &lt;a href="http://planet.go-ooo.org/"&gt;Planet Go-OOo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-111947850436987066?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111947850436987066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111947850436987066'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/06/libwpd-082.html' title='libwpd-0.8.2'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-111908294720755138</id><published>2005-06-18T09:59:00.000+02:00</published><updated>2005-06-20T10:23:16.310+02:00</updated><title type='text'>How to switch off the automatic bidirectional support ?!</title><content type='html'>&lt;p&gt;WordPerfect is not really a BiDi wordprocessor. At least the versions released in Europe and America. If you want to include an Arabic or Hebrew text, you have to enter it litterally backwards, so that it shows correctly.&lt;/p&gt;&lt;p&gt;Once the WordPerfect document converted by &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt;, the characters from the special Hebrew and Arabic character sets become normal UTF-8 encoded characters. Some logic inside &lt;a href="http://www.openoffice.org/"&gt;OOo&lt;/a&gt; detects that the characters are from unicode range that normally belongs to RTL languages and renders them right-to-left by default. This means that all Arabic and Hebrew text that shows correctly in WordPerfect is reversed in &lt;a href="http://www.openoffice.org/"&gt;OOo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I would not mind to have someone with clue explain me how to force &lt;a href="http://www.openoffice.org/"&gt;OOo&lt;/a&gt; to render ALL characters left-to-right, independently from the unicode range they belong to.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-111908294720755138?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111908294720755138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111908294720755138'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/06/how-to-switch-off-automatic.html' title='How to switch off the automatic bidirectional support ?!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-111908147328868795</id><published>2005-06-18T09:52:00.000+02:00</published><updated>2005-06-20T13:49:39.153+02:00</updated><title type='text'>Thanks, Smokey!</title><content type='html'>&lt;p&gt;Thank to Smokey Ardisson of &lt;a href="http://trinity.neooffice.org/modules.php?name=Forums"&gt;NeoOffice/J&lt;/a&gt; fame, &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt; is now converting Arabic characters inside WordPerfect documents.&lt;/p&gt;&lt;p&gt;After a bit of additional polishing of the conversion of other charsets, this improvement (and many others) is likely to land in the SRC680 tree in time for the 2.0 release.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-111908147328868795?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111908147328868795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111908147328868795'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/06/thanks-smokey.html' title='Thanks, Smokey!'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-111831519840608460</id><published>2005-06-09T13:01:00.000+02:00</published><updated>2005-06-09T16:37:24.796+02:00</updated><title type='text'>Evolution on Windows</title><content type='html'>It is nice to see that &lt;a href="http://tml-blog.blogspot.com/2005/06/evolution-limps-along-on-windows-and.html"&gt;tml&lt;/a&gt; managed to make run evolution on Windows. It means that besides a &lt;a href="http://www.openoffice.org/"&gt;fine opensource office suite&lt;/a&gt;, there will soon be a fine opensource groupware client for Windows. All this without a need to put on &lt;a href="http://groupware.openoffice.org/glow/"&gt;glow&lt;/a&gt;s :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-111831519840608460?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111831519840608460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111831519840608460'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/06/evolution-on-windows.html' title='Evolution on Windows'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry><entry><id>tag:blogger.com,1999:blog-13479614.post-111812506509659117</id><published>2005-06-07T08:10:00.000+02:00</published><updated>2005-06-20T13:48:10.096+02:00</updated><title type='text'>Blog Entry No 1.</title><content type='html'>&lt;p&gt;I was wanting to start my blog some time ago, but between the decision and the achievement is always a big gap :-) Nevertheless, it is here.&lt;/p&gt;&lt;p&gt;Since some time, I have been hacking on enhancing the mapping of WordPerfect character sets to unicode inside &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt;. Not really very exciting job, but quite necessary since &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt; is used by &lt;a href="http://www.openoffice.org/"&gt;OpenOffice.org 2.0&lt;/a&gt; and any problem will be seen by a huge amount of people.&lt;/p&gt;&lt;p&gt;After that, I will continue in some of my &lt;a href="http://libwpd.sf.net/"&gt;libwpd&lt;/a&gt; refactoring. Again, basically not really exciting work, but I do not see how to implement the funny WP tabs (flush right, hard tabs, etc.) without proper implementation of paragraph boundaries.&lt;/p&gt;&lt;p&gt;That's all folks!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13479614-111812506509659117?l=fridrich.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111812506509659117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13479614/posts/default/111812506509659117'/><link rel='alternate' type='text/html' href='http://fridrich.blogspot.com/2005/06/blog-entry-no-1.html' title='Blog Entry No 1.'/><author><name>Fridrich Strba</name><uri>http://www.blogger.com/profile/01546456836568779001</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_hDpUG0fgFvM/Sfb5hWrme4I/AAAAAAAAAAM/IBQ2ylV3pUA/s1600-R/fridrich-head.png'/></author></entry></feed>
