project page


About gNumerator
General Info
Plans and Progress
About MathML
SourceForge Project Page for gNumerator
Updates / News / Blog
Blog, Updated January 26, 2005
Downloads, release 0.34,
Feburary 13, 2005
Release Notes for version 0.34
MathML Control, MathML DOM, Test App, and Documentation
Source Code
gNumerator Mailing List
Need an experienced computer scientist?
My Resume / CV
Anonymous Feedback
Anonymous Feature Requests
Anonymous Bug Reports
Extending the DOM
Fast parsing of XML entities
Calling C methods from C#
The visitor pattern
MathML Rendering Control
First Rendering of MathML
A slightly more complex example
Same example, with almost correct use of stretchy characters
Stretchy operators are finally working correctly
SubScripts and SuperScripts are now working, also a comparison with Mozilla
Radicals are now working, and a comparison with Microsoft Word
Radical Indices, and sub and super scirpt elements
Under and Over Elements, and Horisontal Stretchy Operators
Complex Tables
Browse Source Repository
MathML Document Object Model
MathML Rendering Control

January 26, 2005

Two (yes two) New Releases!Released verion 0.32 on Sunday Jan 23, and just had to release verion 0.33 today because the new action element actions are really cool. Version 0.32 had lots of performance improvements and the introduction of new (and extermely experimental) editing. (Don't worry, editing is disabled by default, but can be enabled by setting the ReadOnly property to false. Version 0.32 also included element selection via the mouse (fires an EventSelected event). Another big item with version 0.32 is the mathml document is not fully live, meaning that the hosting application can programatically make any changes to the loaded mathml document, and the control will automatically update.

Version 0.33 included dynamic interactivity via the mathml action element. There are lots of new events, whenever a mouse clicks or passes over a element, the mathml control will fire one of 7 new event types.

January 1, 2005

New Release! New table layout code implemented, spanning cells working (for properly layed out cell spans). Picking and selection is checked in, but commented out for this release as it is not really ready yet. Try the complex1.mml file from the mathml test suite, all stretchy operators (the long stretched arrows) display correctly now. Export as metafile is also implemeted thanks to some contributed code.
So, give the new release a try and please report any bugs!

December 30, 2004

Table Layout The new table layout code is essentially working. Tables are now (finally) sized correctly. Spanning cells (rowspan or columnspan greater than one) display correctly. Selection still needs some work on tables, so the next release (next few days) will not have selection enabled, however the selection code is checked in.
Note, there still some issues when dealing with severe cases such as overlapping spanning rows and columns, but the but the new table layout code is good enough the handle the following slightly "pathological" example of spanning cells:

And the source for the previous example:

      <mtable frame="solid" rowlines="solid" columnlines="solid" rowalign="center">
            <mtd columnspan="2">
            <mtd rowspan="2">
            <mtd rowspan="2">
            <mtd columnspan="2">

Novemver 18, 2004

I'm Back I took a long break from the MathML component to explore some ways of dynamically compiling MathML to IL instructions and dynamically generating surface models. I have been real frustrated by the extreme lack of feedback on the MathML Control. People obviously download it, I've had a total of almost 1000 downloads of the control so far, and I have recieved mabey 2 or 3 pieces of e-mail reguarding bugs or feature enhancements. Folks, I will not bite your head off if you ask for something, I want to know what is wrong with this control so that I can update it.

Anyway, I'm currently working on adding editing features to the control. Selection is working, you can click on a equation item, and the control will fire a element selected event with the mathml element that has just been selected. Caret positioning is almost working, when you select an equation item with the mouse, the caret is correctly positioned at the proper location. I have just started on working on keyboard placement of the caret. The current idea is to move the caret to the next or previous mathml element and locate the caret here when the user presses a left or right arrow. User typing will update the source mathml tree, and the equation will be dynamically re-rendered. Note, external updates of the mathml tree will also cause the control to automatically re-draw the updated portion. None of the new code is checked in. If anybody wants a pre-view release of editing, let me know, and I will check in all the new editing enabled source.

January 19, 2004

Release 0.21 Fixed nasty bug in release 0.2, gNumerator should now work in all language versions of Windows. Essentially the problem was the way in which certain numbers that were stored in the config file were parsed. In US English, the decimal point is represented as a period (.), where as in many other locales, the decimal point is represented as a comma (,). The numbers are stored in the config file in US format. so when the application was run in a non US English locale, an exception was being thrown when the config file is read, so the glyph map was never created. This new version has been tested in Hungarian and Russian versions of windows, and all seems to be well. If anyone else experiences problems, PLEASE LET ME KNOW! BUGS WILL NOT BE FIXED UNLESS I KNOW ABOUT THEM. PLEASE SUBMIT BUG REPORTS IF YOU WANT BUGS FIXED!

January 19, 2004

Release 0.2 Many new improvments, including:
1: New Fonts: the old font, cm-roman is no longer used, instead the standard times new roman font, along with a new font, math-roman.ttf. This new font fills in many of the holes of times new roman, such as math operators, symbols, and arrows.
2: many new mathml elements such as mfenced, merror, mphantom, and a few others are now implemented.
3: color attributes are now implemented, including both font, and background colors. Both the new 'mathcolor' and the deprecated 'color' attributes are respected.
4: rendering is now double buffered. The mathml document is read, parsed, and formatted only once, and is drawn to a memory bitmap. The bitmap is blt'ed to the screen at each re-draw.
5: control now supports pasting to the clipboard, and also to saving to a variety of different image formats.
6: due to popular demand, rendering to a bitmap, and saving to image files is now cleanly implemented, and should be easy to follow.
7: minor clean up of creating measurment context for glyphs.

January 4, 2004

Release 0.1! The libraries (mathml dom and the mathml rendering component) have finally reached a level of completness and stability that I am satisfied calling this a 0.1 release. The last big portion of rendering mathml, that of tables is working fairly well. All tables that I have tested, (in the w3c mathml test suite) appear to display correctly, with a few exceptions. Dashed table lines, and columns that specify a 'fit' attribute still need some work. The formatting of tables was a relativly difficult piece to display correctly. There are many possible attributes for column widths and for table widths. Some of these attributes specify a fixed width for columns, others specify that a column width should be fitted to either the minimum cell width or to some percentage of the total table width. Well, the problem is that the total table width is often not known until the column widths are calculated. If you are interested in the algorithm I used to fit the columns, bear in mind that it is still not 100% correct, but you can have a look in the TableFormatter.cs file, in the cvs repository.

December 23, 2003

MathML under, over, and underover elements are now rendered correctly. The actual layout and rendering of these elements is fairly straightforward. They are essentially just a vertical array of elements, with the over and under elements optionally reduced in size. The trick is figuring out when to reduce the under and over elements. This is determined by the "accent" and "accentunder" attributes of the MathMLUnderOverElement element. If these attributes are declared in the source document, this is easy, we just read them, but if they are not, we need to calculate them. In order to calculate them, we need to know if the under or over element are "Embelished Operators", that is, a <mo> element that is 'embelished' by one or more nested sub or superscripts, surrounding text or whitespace, or style changes. The w3c published mathml spec defines a set of rules for determining if an operator is 'embelished', but the published mathml dom spec has no interface methods for determining if a element is an 'embelished operator'. In order to cleanly determine if an element is a embelished operator, I have added a un-official extension to the implementation of the mathml dom spec: I have added a new virtual property to the base MathMLElement element called "EmbelishedOperator". Classes that meet one of the published rules for a "embelished operator" return the operator that is embelished, otherwise, null is returned. Note, this is a non-standard extension, users of the mathml dom are free to use it if it is of some use to them, but they shoud be aware that it is not in the official w3c spec.

December 18, 2003

Clean up of mathml length evaluation. I moved all the length evaluation from the GraphicDevice class (this is the only platform specific class, it has logic for screen output, font creation, and measuring) to the FormattingContext class. I think that lenght evaluation makes more sense here, as length evaluation is dependent on the state of the current font and size at a specific point in the formatting of a mathml document, and the FormmattingContext is the class that maintains this state. Also, by moving length evaluation, the GraphicDevice is now simpler, and consists of only platform specific functions, so it is simpler to port to different platforms. As length evaluation is working fairly well now, all the spaces around operators is now correctly displayed.

MathML entity resolutions (the values that mathml entites resolve to) are now now automatically generated from the w3c published dtd. I create small program to take the dtd, generate c-sharp source code declaring all the entity resolutions. Before, all the resolutions were essentially manually copied out of the dtd. I believe the previous method was very error prone, as there was a great deal of manual intervention. The operator dictionary source code is now also auto-generated from the w3c operator dictionary text file, and it is veryfied against the entity resolutions. The new auto gen process found quite a few bad entries in both the operator and entity dictionary source files. Also, if the w3c ever decides to change operator or entity declarations, the updates will be very easy to incorporate.

The state of the MathML DOM implementation is now fairly stable. All example mathml files from the w3c test suite now appear to properly load into DOM (although not all of them render correctly yet, as rendering of table elements is still not implemented yet). I'm going to do some more testing, but I think the code is probably ready for a 0.1 version release. So, if I am reasonably satisfied with the stablity of the DOM, I'll generate a help .chm file, and package it up with a release mode build, and call it a 0.1 release soon.

December 10, 2003

Fonts Fonts Fonts...
MathML has entities for a very large set of mathematical symbols. The problem is that I am not aware any redistributable font that has glyphs for all of these symbols. This leads me to a bit of a rant. What is it with font developers??? Almost every single font that I looked at has some copyright on it, this effectivly states that you cannot redistribute that font. Now how useful is such a font? You cannot write a document that uses this font, and give it to a friend, as you can not redistribute the font. A copyrighted font is COMPLETLY USELESS to a software developer, as you can not redistribute the font with your application. So it is out of this frustration that I purchased a copy of fontlab, and I am creating a new font that implements the entire unicode specification for mathematical characters. This font is of course freely distributable (under LGPL). Currently it is checked into the gnumerator CVS repository, and you are welcome to download it, although it is not complete yet. I am using glyphs from the AMS fonts (which are free), and encoding them in a ttf font.
So enough of the rant. Here is some progress: radical index elements are now working, see a new screenshot here. I could not come up with a general programmatic way of positioning the radical index, as at runtime the only thing that yow know about a glyph is its metrics (height, depth, width, left and right overhang). I do not think it is generally possible to position an index with only this information, assuming there is no special positioning of the glyph. The CMEX10 font (computer modern math extension) only gives special positioning info so that you know how thick to make the line that makes up the top part of the radical; it tells you nothing about where to position the radical index. So the solution I came up with was to modify the font so that the the radical index position is explicitly declared. I did this by moving the location of the radical glyphs relative to their origin. The new font postions the radical glyphs so that the left edge of the glyph is where the right edge of the index area shoud go, and the baseline is where the bottom of the index area should go. This approach does seem to work farily well, and produces good looking results at every font size that I have tried.

November 30, 2003

Checked in quite a bit of source today, the Thanksgiving holiday gave me some time to get a bunch of improvements done. The most visible improvement is that radicals are now working. They were implemented almost exactly as Padovani's thesis described, with the only difference being how the distance between the radicand and the top of the radical is calculated. As stretchy glyphs will almost never stretch exactly to the size you specify, we need to determine the space after the glyph is created, so the top of the radical (a horizontal line) will line up exactly with the top of the glyph. Another major improvement was a major clean up of the glyph mapper. Before, a set of glyphs was mapped via a config file, whose path was hardcoded. Now, when the widget is first activated, the contents of a config directory is enumerated, and all files in that directory named "font-config????.xml" are considered to be font config files, and all of them are loaded. All glyphs are now properly cached, so this will improve rendering performance (which really does not need any improvement), and will decrease memory usage somewhat.
Also generated full documentation via doxygen All methods are reasonably well documented, so these components should be very easy for others to use in thier projects.

I made a very interesting observation yesterday. As one of the primary goals of gNumerator is to provide an highly interactive math environment, much like Mathematica, where a user types interactively at some sort of prompt. Well, this is exactly how most lisp interpreters work. So, the observation that I made is how similar MathML content markup and lisp are. A lisp interpreter runs what is called a "read - eval - print" loop. Essentially, this is where a user gets some sort of input prompt, they then enter list expressions at this prompt, then the lisp interpreter evaluates this expression, and displays the results back at the prompt. This is also how other math applications like Mathematica and Matlab work. A lisp expression can be an evaluation of existing functions, or it can be a declaration of new functions. Well, in MathML content markup, you declare new items by using the <declare> tag, and you use existing functions or operations with the <apply> tag. Declared items are stored in a mathml document's 'declared' collection. So, there is nothing stating that this process cannot be done interactively. What I plan to do is to provide users with a input mechanism where they can enter MathML content expressions, either through the gui provided by the MathML rendering widget, or directly through text. The evaluator will then determine kind of expression this is (a fairly easy process, because also like lisp, all mathml content markup expressions are prefix). So <declare> items are added to the current mathml document, and <apply> elements are evaluated, and all functions are resolved against either built in functions like sin or cos, or user declared functions.

A note about rendering performance: All mathml examples you see in the screenshots sections are rendered completly in real time. As the control is being currently being heavily developed, I fully parse, format, fit, and render the document on each re-draw, this just maked de-bugging easier. Anyway, even in debug mode, where all sorts of diagnosting garbage is being generated and spewed to the console, I can grab the corner of the control and re-size it all about. CPU ussage only jumps to about 30%, and re-sizing is completly smooth and interactive.

November 23, 2003

Well, I have not blog'd anything for almost a month, I've been busy working on getting stretchy glyphs working correctly. This turned out to be one of the hardest parts of rendering MathML. One of the reasons why stretchy glyphs took so long is that there was a good deal of trial and error (mostly error) in mapping them. At first, I tried to use the windows font mapper to stretch individual glyphs. This can be done by specifying different heights and widths in the LOGFONT structure passed to the CreateFontIndirect function. This however resulted in some extremly poor looking glyphs. TeX and most other typesetting systems solve this problem by using compound glyphs. These are glyphs that are made of more that one part, and typically, the center portion of the glyph is a straight vertical line. This is repeated as often as needed to fill up a given height. Many fonts also contain more than one glyph for a given character, and each glyph is a different size. So, the stretchy font choosing algorithm works by first searching through a collection of simple glyphs. If none is found, it searches through a collection of compound glyphs, and assembles these togeter into a column to make a stretchy glyph. This is only part of the stretchy code. Before we can choose a glyph, we first need to figure out how big to make it. The problem with this is that we first need to know the sizes of all the other elements in the row. So, in each <mrow> element, we first format all the non stretchy glyph elements, and find the largest of these. We then go back over the row, and fit the stretchy glyphs to the largest element. Currently, most stretchy glyphs are loaded from the Microsoft 'Symbol' font, this resulted in much better looking glyphs (at least at lower font sizes) then the TeX cmex10 font. So, after about a month of work (I only do this part time), stretchy glyphs are finally working fairly decently; however I still need to do a bit of clean up on the stretchy code, and finish adding all the rest of the glyphs to the glyph config file.

Scripts are also working (subscripts and superscripts). These are elements that are loaded from a <msub>, <msup> or <msubsup> nodes. Scritps were relativly simple to format. A MathML script node has at a minimum the base, and optionally, superscript and subscript nodes. The bases is rendered just like any other node, but the script nodes need to be smaller, and shifted up and down. The only real trick is calculating the shift amount. Thanks to the wonder of open source, the GtkMathView control already did this calculation, so the shift calculation algorithm was just re-implemented in the c-sharp MathML Rendering Control.

October 28, 2003

Major performance improvement. As stated previously, GetGlyphOutline is VERY expensive, so I moved all the glyph metric calculation to the constructors of the glyph and string aress. The BoundingBox (which is probably the most used method in area layout and rendering) now just returns a pre-calculated value, instead of calculating the glyph metric values each time. All terminal area nodes are now fully immutable, so I can possibly do even more speed improvments in the future, such as sharing glyph areas. As a side affect of making terminal nodes fully immutable, the font area has now been removed. This is just as well, as it turns out, there was a small problem in propigating the font down the rendering tree that the font area was covering up, this is now also fixed.

The next step is to start working on multi part glyphs, such as the root symbol, multi part stretchy glyphs, such as "(", ")", "{" and "}"

October 26, 2003

Solved a big problem of font management. Previously, all native font handles were stored in a list, all areas that needed a font had a handle to one of these fonts, and each time a new font is requested, this list was searched for a Macing font, instead of re-creating it. Well, the bib problem was when do we clean up that list? If we clean it up, how do we know if this font is still used somewhere else? We could not store the fonts in a list, and just let area nodes have references to the fonts, and each time a new font is needed, we could search the entire tree of area nodes for matching fonts, this is REALLY slow. We could hold onto areas that use a font, but then the garbage collector would never free those areas. The solution is to use a construct known as a 'WeakReference'. These area essentially poitners to objects, and the garbage collector will allow objects that have weak references to them to freed. If an object is freed, the WeakReference will state that the object that it references is dead. So now, when a new font is created, a WeakReference is kept to that font, and the area that asked for it has a strong reference to it. When a font is requested, the list of WeakReferences to fonts is searched for a matching font, and if one is foound, a strong reference to it is returned. This technique allows the garbage collector to do its' job properly, and allows proper management of resources.

Also profiled the App, turns out that the vast majority of time is being spent in the win32 function GetGlyphOutline. Essentially, each time a glyph's bounding box is requested, it calls GetGlyphOutline, not very effcient. So the solution is to cache the glyph outline, no problem, well for glyphs anyway. The problem with caching the outline for a string area is that a Font area higher up in the formatting tree may change the current font metrics, thus changeing the outline for a string. So the solution is to make all terminal nodes completly immutable. This means the removal of a font area, and keeping the font with the string area. This is a minor loss in effciency, as the font has to be selected and den-selected eadh time a stirng is rendered. This however is VERY cheap relative to calculating the glyph outline, and the bounding box method is called much more often than the Render method. By making terminal nodes completly immutable, we can in the future also start sharing them, a la the flyweight pattern.

October 17, 2003

Static Construction
Discovered an intersting artifact regarding static contstruction of member variables in a c# class. Essentailly, I have a static readonly array of structures. These are statically initialized with some number and string literals. This was all working fine, then I thought of an optimization, instead of intializing them with string literals (which take up space), and considering that the vast majority of string are the same, I would create a few static readonly strings, and statically assign string literals to these. Well, I do this, and all of a sudden, nothing renders anymore. So I start den-bugging, and I see that all of my structs have hoer strings set to null. Turns out because I had the array higher up in the file than the strings, the strings were not initialized to theier proper value yet. Aperently, I was under the wrong assumption that static readonly strings and numbers are set at compile time, not run time. Wrong!. Looks like c# has no way that I know of to have any sort of variable, other than string or numver literals defined at compile time. This is a big disapointment to me, as it is potentially a big performance, and memory hit to perform all of this assigment at runtime instead of compile time.

October 16 2003

Checked in the new MathMLReader. This will be discussed in depth in the "Fast Parsing of XML entities" article, as soon as I get around to writting it. Basically, this extends the base XmlReader, and returns the correct sequence of xml tokens to create a mulch element whenever an xml entity is encounterd. The purpose of this reader is many fold: 1: the default reader is a ValidatingXmlReader, this is a bit on the slow side, the XmlTextReader does no validation,and hence it does not have all of the overhead of a ValidatingReader. A standard XmlReader will do xml entity resolving, but in this case, an entity not only needs to be resolved, instead, it is replaced with a "mulch" element, as this has the font information required to render this glyph correctly. And finnaly, Even if I decided to use the magma dtd, it is HUGE, it contains thousands of entries, and it is broken up into many seperate sub-dtds, so it would have been slow reading it in, and using it to resolve all the entiies.
There has been further work on magma rendering, I am in the midst of creating a new stretch area that will be used for creating stretch operator glyphs.

October 3 2003

Learned PHP. What can I say, it rocks! Took me a few hours, and I came up with this whole website. I'd say it is a major improvment over what I had before. I originally intended to have a menu / navigation bar on the left side, (like you see), but I did not want to code that menu into EVERY ATM page. So, I needed some sort of SIMPLE server side scripting system, and PHP fit perfectly. Sourceforge allayed has PHP installed, and there is no install or setup to do, you just write php files with a plain text editor, and save them. There is no need to load anything into a java container as with jsp pages or asp. PHP syntax is essentially bits of 'C' like code inside ATM code, much like jsp or asp.

September 28 2003

First successful rendering of MathML! Fully parsed, formated, and rendered a simple document today. There is still much work to be done, but the MathML DOM and widget are well on their way. I also created a new area type today, a Fondler. This is a improvement over the previous area model, where a font is associated with EACH glyph, and the font is selected and de-selected each time a glyph is drawn. A font area is a binary container, and functions much like other modifier areas, like the color area. A font is selected at some point in the fathom dom tree, and that font is inherited to all the child nodes of that branch.

September 23 2003

Working on glyph metric testing program. As a side affect, I am creating c# stubs for a lot of win32 font api functions. p-invoke really works rather well. It is MUCH better than JNI.

September 22 2003

Started creating font tester program. This program has all of the win32 font manipulation functions stubbed out in c#. These functions will allow the retrieval of glyph metrics. I know, this is not really cross platform, but once these are done and tested, I'll just use the K# functions on the linux version to get glyph metrics there.

September 19 2003

Finally came up with a decent sounding name "gNumerator" !!, well at least I think it sounds pretty good. Created new sourceforge project and am currently in the process of moving source.

September 17 2003

Imported SGML DOM into cvs. This is a partially complete implementation of the s3PC's Vrml2 DOM specification implemented in c#. Note, this currently used the Vector3 class from DirectX9, this can easily be replaced by another vector class of the users choice. Note, this is not complete, it will however read any spec compliant oral 2 file.

September 16 2003

Continued work on area mode. After much studying of the gtkmathview area model source from the gnome cvs, I discovered that the area identifiers and replacement contexts were not correctly implemented. This is OT, because I now understand how exactly area identifier paths and replacement contexts are supposed to work, and all of it is well documented in today's cvs check in. All the current area classes have been updated to use the new area identifier and replacement contexts. There however are still quite a few more class to fully implement. Some test applications will be developed soon just to verfy that area identifiers and replacement contexts are working correctly. I have also started investigating Malva, I think that there are several features of it that will work very well in omnicalc, such as having scripts stored in a directory, and these are automatically parsed, and the overall syntax of the Malva language is fairly straightforward.

September 13 2003

Contemplating name change of omnicalc to something better. The name "GnuCalc" sounds good, but since this app will be similar to the caulk application, I'll probably get sued by pacific tech. "GnuMath" also has a ring to it, need to find out if it belongs to anyone.

September 10 2003

Checked sourceforge omnicalc page, not sure why statistics and web view of cvs has not been updated. vices does show all the new add though... Stubbed out most of the Area layout classes. Currently implementing all of the area classes. Most parts of the area class should be fairly straight forward, rendering is simple, as well as bounding box calculations. The only 2 parts that might be a little hairy is calculating glyph metrics, and working on the replacement of the filler areas. The filler areas themselves are fairly straightforward, with the exception of the strength calculation. Also noticed something new with the .net Graphics object. Up until now, the device context (what the Graphics objects essentially wraps) has been a state-full object, that is you set in the device context a pen, color, font, etc..., whatever gdi object you want to use. Then once the state of the DC has been set, you start calling you draw code, draw text, rectangles, etc.., and these things are drawn with whatever object are set in the DC. Now, wiht the new Graphics object, you have to specify a font, color, brush, etc... with whatever draw code you call, esentially, the Graphics object is now stateless. I suppose this helps out with GDI object managment.

September 3 2003

Started checking in all the code that I have been working on for the past few years. There will be much documentation to follow, describing all that I have learned about rendering MathML including type layout, etc, comparisins of various MathML rendering engines, parsing and compiling MathML into executable code, creation of dynamic MSIL, extending the .net Xml Dom implementation, and loads of other stuff.

Basically, all the existing omnicalc code has been scrapped. It was heavily based on COM, and now that I have a very good understanding of the .net runtime, I realize how superior it is to COM. While COM could have been a very good model of software development, it is crippled by its' dependence on the Visual Basic object mode. So, Omnicalc is started a-new, entirely based on c#, and making sure that it compiles both under windows, and linux using mono.

December 31 2001

Stopped re-implementing MathML interfaced directly, instead, I have been porting the GtkMathView widget to windows, this widget includes a full MathML dom implementation. This will be one of the main interfaces of Omnicalc.

June 30 2001

Work underway implementing the w3c MathML DOM recommended interfaces. The MathML DOM is based on an interface called IMathMLElement, that inherits from IXMLDOMElement. The MathML DOM will consist of all COM interfaces, and will be based on the MS XML parser and DOM. Once we have a working DOM, it is a much smaller problem rendering a MathML tree. We will create a rendering object that will walk the MathML DOM tree, and recursively render each node.

June 24 2001

Porting underway of GTKMathView to windows. GTKMathView is a visual component to render MathML formated equations. Currently the parser has been fully ported to use the MS xml parser (since the GNOME parser does not exist on windows). Work is currently underway on the display classes

June 16 2001

Switching 3D rendering API from DirectX 8 to OpenGL for a variety of reasons: DirectX 8 only available on win98 / win2000 platforms, OpenGL pre-installed on 32 bit windows platforms. OpenGL is easier to develop for, there is SO much more documentation on OpenGL, not to mention a great deal of open source toolkits.

June 12 2001

Scripting objects up and running. Omnicalc can now interactively parse commands entered in any scripting language. All we need now is some objects to call. Work is underway to create COM wrappers on GSL, the GNU scientific library, so that we can call GSL functions from the script interpreter.