Virtual Pen Project History résumé
30 April 2003
- Fixed linking problem with Gfx::Box
methods. Some template methods were not used in the Grafix
DLL, and thus no code was emitted for them, which caused trouble for
external users. A new file gfx_basic_types.cpp
contains a dummy function which forces code generation for the template
- Added a new Gfx::Pixmap class to the
Grafix library, which can be used to insert 1:1 pixmaps into layers.
Incidentally, the Gfx::Surface class has
been modified to derive from Gfx::Pixmap,
which allows both classes to share code.
- Updated VP::DocAttr::ImageFrame to work
- Added surface pool trimming in Gfx::Engine
and improved surface memory recycling.
- Implemented VP::Tools::BitmapImage which
was formerly part of the stretched image cache in VP::DocAttr::ImageFrame.
- Fixed printing resolution. Formerly, GDI+ pretended that everything had a
100 dpi resolution when printing, but this is no longer the case when
we generate the bitmaps without going through GDI+.
- Implemented sliced rendering : the surfaces get cut down in pieces to
avoid eating up too much memory when printing on a high resolution printer.
- The micro-tile arrays implemented by libart are a great means to speed up
painting, especially when rendering to the printer, since this allows
Virtual Pen to discard every empty zone and avoids doing GDI Blt on
these zones. Here is an example (the black background has not been painted
at all) :
- There was a bug in the layer clearing code, which kept stale data in the
associated micro-tile array. Now calling Gfx::Layer::Clear
marks the tiles as invalid.
- When Gfx::Text::AppendGlyph was recording
empty glyphs (glyphs without any pixel data), the updating bounding box was
completely wrong, which caused too much pixels to be composited for
29 April 2003
- Fixed caret blinking problems, which were related to the way the caret
position was acquired and cleared. This required modifying the VP::DocView::RenderView
method and adding a flag to the rendering context, which specifies that the
caret position is to be recorded (FLAG_RECORD_CARET_POS).
28 April 2003
- Fixed text selection highlighting.
- Added support for opaque text in Gfx::Layer.
- Added support for glyph and text clipping in Gfx::Text,
Gfx::Surface and Gfx::RenderSurface.
27 April 2003
- Lots of e-mail to read and answer.
- Fixed a bug which haunted VP since I started ripping out GDI+ :
loading a document crashed VP. This was related to a little problem in VP::Render::Context
method UpdateBBox : it did not make
sure that a default Gfx::Path object existed
(which was not the case when a fresh rendering context was used).
21-26 April 2003
- Off duty, at last... to spend a few days in the Cinque
Terre walking. I can only recommend where we stayed in Manarola (the Ca'
d'Andrean). And don't miss the restaurant "Cappun Magru" in
Groppo, above Manarola.
20 April 2003
- Restored support for blinking caret.
- Fixed RecordCaretGeometry, the offset was
applied with the wrong sign.
- Fixed VP::TextLib::Fitter::ParaStore::FitLine
in order never to create nodes with partial words ending with a BREAK_NO
19 April 2003
- Fixed VP::DocAttr::TextFrame polygon path
collection to work in document coordinates, not display coordinates; since
the path is now stored in its transformed representation, it has to be
transformed back into document coordinates.
- Fixed VP.FrontEnd.Logic.TextState.CleanFontStyleName property setting,
which could cause the internal font style name to become empty if the user
clicked on a 'Regular' font with an optical adjustment (e.g. Warnock Pro
Subhead is the Regular version of Warnock Pro, optical Subhead).
- Made the scribe paint its glyphs; this was painful, but it finally works.
The orientation of FreeType coordinates are bottom-up, but all other
coordinates are top-down, and this caused several mutual complications. Me
being exhausted didn't help.
- Modified Gfx::TypeFace, Gfx::Text,
- The font style (in VP::DocText::State and VP.FrontEnd.Logic.TextState)
is now always specified as the combination of the font style name and the
font optical name (e.g. 'Italic*Display'),
if the font specifies an optical name.
18 April 2003
- Finished VP::TextLib::Font...
substitution. The code compiles, but it does not work yet.
- Simplified several methods of class VP::TextLib::Fitter::Context :
ConvertWordToGlyphs uses Gfx::TypeFace
for ligature handling, ComputeGlyphWidths
also uses Gfx::TypeFace for glyph width
measurement and automatic pair kerning.
- Replaced VP::TextLib::FontInfoInstance by
Gfx::TypeFace and a size specification in
- The FontInfo, FontInfoInstance,
FontInfoRecord and TempDC
implementation and header files are no longer used. They have been removed
from the project.
- Reimplemented VP::TextLib::Flow::Paint
to display text without using GDI+.
- Removed GDI+ from the scribe.
17 April 2003
- Re-enabling text support.
- Updated Klaas' latest Boolean fixes into the Grafix
- Made all projects use wchar_t as a native
type. This required a few changes, since some code did use Card16 or
variants instead of a wchar_t compatible
type. Among the more subtle changes was a name mangling dependency in the C#
- Updated command QueryFontList
to support Gfx::Type.
- Started removing all VP::TextLib::Font...
stuff from the sources, replacing it by equivalent Gfx::Type...
stuff. This required a lot of work in VP::DocText::State.
16 April 2003
- Optimised A-Hatch hit testing : the
full hatch does not get generated when the caller has set the FLAG_PAINT_ALPHA_BLACKNESS
flag in VP::Render::Context, since this
means that what is important is the shape; we knowingly forget about
transparent hatches here. This improved speed a lot.
- Finished cleaning up VP.Forms.Graphic.DocView.
The Controllers.DocView now uses the Graphic.DocView
timer for its own dashed line animation.
- Finished cleaning up repainting and refreshing code in VP.FrontEnd.Controllers.DocView.
- Fixed problem in art_uta_from_vpath
(when a path which should not execute gets executed, scary things happen in
the memory; I replaced this by a safe failure).
- Fixed VP::DocAttr::SelGrips::Paint
to always insert a closed path to the candidate layer.
- The BelowCursorFinder does
no longer send duplicate events.
- Added an additional layer for the candidates to VP::Renderer::Context,
which must also be handled by the DocView.
15 April 2003
- The multi-layer rendering is now in place at the core level, but the
front-end still does not benefit from it.
- Simplified following commands :
- DetectObjectsInBox calls VP::DocView::DetectObjInBox.
- DetectObjectOutlineAtPos calls VP::DocView::DetectObjOutlineAtPos.
The radius is now directly specified as a pixel number, rather than a
- DetectObjectSurfaceAtPos calls VP::DocView::DetectObjSurfaceAtPos.
- Active highlighting has been modified : when the user freshly selects
an object or clicks on one of its grips, the object becomes hightlighted
actively. This will modify its appearance, and the appearance of the objects
no longer uses a unique merged path containing the union of all selections
to find out if the point is in the selection or not; rather, it uses the
stack of selections and walks through it. This makes it possible to identify
which selections are hot.
- Updated the VP::DocView::RenderView
implementation, in order to make the new rendering model visible to the
outside (so that VP.FrontEnd.Controllers.DocView
and VP.Forms.Graphics.DocView can exploit
it). The caller can specify if he wants to render the document, the hints,
or produce output pixels, or a combination of these possibilities.
14 April 2003
- Updated articles on CodeProject, related to the XP
look & feel (fixed string width measurement; it did not work
properly when ClearType was active).
- Added a permanent flag to Gfx::Surface,
which can be used to specify that a surface should not be recycled when Gfx::Engine::UnlockSurface
is called on it. This is used by cache surfaces.
- Optimised Gfx::RenderSurface in order to
skip empty layers and support cached layers (Gfx::Layer).
- Generalised the composition of surfaces (Gfx::RenderSurface::ComposeSurfaces),
which were both used while rendering layers and soft maskes layers. The
operation is defined by a ComposeMode, which
will select the proper composition method (Gfx::Surface::CopyFromSurface,
ComposeWithSurface or MultiplyWithSurface).
- Fixed the Gfx::Layer to build the links
between child layers and their parents.
- Updated the candidate path collection algorithm : the candidates
build up in a soft mask layer rather than being combined on the path level.
For complex paths, this is much easier (this affects both VP::Render::Context
- Modified the way the renderer (VP::Render::Context)
renders its output. There is now a tree-like hierarchy of layers :
- The output view (LAYER_OUTPUT_VIEW)
contains both the document and the hints.
- The document (LAYER_DOC) contains
three layers : the one below the active object (LAYER_DOC_BELOW_ACTIVE),
the one containing the active object (LAYER_DOC_ACTIVE)
and the one above the active object (LAYER_DOC_ABOVE_ACTIVE).
- The hints (LAYER_HINTS) contains the
dotted, animated selection path.
- There is an independent layer called LAYER_OUTPUT_SCRAP
which is the default root layer used for rendering operations which do
not need to be cached.
- The VP::DocAttr::SelGrips class now
supports layer swiching when the active selection is reached.
13 April 2003
- Finished integration of kbool. The first
tests show that kbool is much slower than
libart (3-5 times), but it produces stable results. The logical operations
on the paths should not be used when rendering, or VP will quickly become
too slow; they should only be used to combine paths into other paths on the
user's request, for instance.
- Fixed problem with surface detection. This uses libart to find if the
point lies within the path or not (by computing the winding number at the
- Added Gfx::Path::NewSubPath to extract a
subpath from a given high-level path. This is used by the outline detection
algorithm to find on which subpath the user clicked (see class VP::DocProc::ProcDetect,
method Paint for details).
- Fixed a few details related to the detection radius being specified in
document space rather than in output space. Now, the detection radius is
always specified in output space (whatever the zoom factor, you will always
get the 3-pixel radius, for instance).
- Fixed command QueryViewAlphaAtPos to use
the drawing's alpha rather than its luminosity.
- Modifying Grafix in order to support cached layers.
12 April 2003
- Merged Klaas' Boolean (kbool) library into
- Started update of Gfx::Path in order to
use kbool for all the logic path operations.
11 April 2003
- The secret of the other libart users is simple :
- Do not use logical path operations (i.e. do not substract path stroke
from path surface before filling the surface).
- Create the stroke from the original vector path description (obtained
directly by converting the Bézier path into a vector path), not from an
unwound and uncrossed sorted vector path.
- Add random noise to the coordinates of the vector path before
converting it into a sorted vector path (art_vpath_perturb).
- Doing all this indeed removes all visible glitches... Even the hatches get
drawn properly (they still use logical path intersection).
- Small fixes in the Grafix library (accept
insertion of null paths or layers into layers; this is handled as a no-op,
supports empty paths).
- Fixed painting of hairlines in VP::Render::Context,
which causes A-Bezier to work properly
- Discovered several polygon clipping libraries :
(Michael Leonov), completely robust; does not support self-intersecting
paths; free only for non-commercial projects.
(Alan Murta), supports self-intersecting paths; free only for
- Boolean (Klaas
Holwerda), free algorithm usage; I don't know if it supports
(Klamer Schutte), LGPL but not numerically stable.
10 April 2003
- Found another bug in libart, but no solution.
- I am getting sick of all these numerical instability problems which affect
libart. This library, in its current form, is not usable for VP. I wonder
how others, like Sodipodi, Karbon
14 or librsvg can produce
nice output with it...
9 April 2003
- Found and fixed a bug in libart render_seg
which produced wrong paths when the angle between the considered segments
was 180° (an internal test was using #INF
and #IND values, or very huge values which
were quite wrong anyway).
- There is an alternative to libart for quick 2D rendering : AGG
(Anti-Grain Geometry), but it does not support logical operations on paths.
8 April 2003
- Updated Grafix path walker and closed path handling.
- Analysed and fixed bug in A-Hatch. This
was a tough one !
- libart intersector code is full of bugs, which show up when using the
hatches, which rely on path intersection and path substraction :
- Found and fixed a bug in libart x_order_2
function, which did not properly recognise colinear segments.
7 April 2003
- Added support for scaled line width in the Grafix
- With Gfx in place, it is now necessary to update the rendering model used
by VP. The buffering no longer needs to be done in the GUI, since Gfx
handles this too. And this will allow more responsive redraws, where only
the currently selected and active object really get redrawn; the rest of the
document can be composited (either below or above) the active object.
- Fixed path output positioning problem by modifying the rendering matrix in
- Libart produces incorrect output when the 3 points of a polyline are
- Finally checked in the new version... There is still plenty of work to
simply get the same behaviour as before, when GDI+ was used.
6 April 2003
- First successful build of VP without GDI+ (crashes while starting up).
- Fixed two bugs in Gfx::Path::CopyVector
and Gfx::Path::CopySorted which could trash
the memory (and they did !). The bug in CopySorted
was hard to track down... The memcpy used to
copy memory used the wrong size (this was probably a cut & paste bug).
- Added support for Grafix path transformation (through a 2D matrix and an
offset vector, stored in class Gfx::Context).
- The icons produced by the core and forwarded to the managed code through CallbackHub's
IconDefinition callback are
now alpha-premultiplied (Format32bppPArgb).
- First successful execution of VP without GDI+ (no crash, but document view
remains black) at 14:00 !
- Fixed painting bug in the document sampler class. The contents of the
pixel surface was sometimes drawn twice, which produced wrong output with
anti-aliased and alpha painting.
5 April 2003
- Rebuilding class VP::Render::Context and
- Added a Gfx::PathWalker class to enumerate
elements of a Gfx::Path.
4 April 2003
- Continuing removal of GDI+.
- Discussed with DB about Cresus.
- Small fix in Smaky software for PZ.
3 April 2003
- Start surgical removal of GDI+ from VP's Core.
This could be a painful (and long) process.
- Here are the classes which have been updated :
- All path construction operators (rectangle, curve, etc.).
- Update the Grafix library to fill the needs which appeared when tying it
2 April 2003
- Cleaned up and reworked most Grafix classes.
- Added support for kerning, ligature substitution and string length/layout
measurement. This is just a port from what existed in VP::TextLib
and an update to use FreeType.
Currently, FreeType 2 does not read the kerning information stored in
the GPOS table (which is the case for Warnock
Pro, but not for Palatino Linotype), and therefore not all open
type fonts will support kerning when layout. I will either wait for FreeType
to catch up or implement my own table walking code (just as I did for the
1 April 2003
- Finished implementation of the FreeType support : text can be
embedded into layers and it gets properly rendered, both in paint layers and
in shape layers.
- First test show that FreeType 2
really does an excellent job at rendering its glyphs. Sub-pixel positioning
is possible (which cannot be achieved with GDI), and the anti-aliasing code
produces very high quality output. Maybe some people will find it a bit too
blurred for small characters ?
31 March 2003
- Continued integration of FreeType support as a set of Gfx
classes (Type, TypeFace,
- Updated the code used to enumerate the fonts on the Windows platform.
30 March 2003
- Started implementation of FreeType support.
29 March 2003
- Implemented support for soft masks in the rendering architecture. A layer
can be used as a soft mask definition (the green component is used to
define the mask : 0 means nothing, 255 means full pixel).
28 March 2003
- Tested the layered rendering architecture. It just works ! Here is a
short description of what is currently supported :
- All rendering is done to a destination surface, which is implemented
as a DIB section, which means it can be directly used to be painted on
to the screen (using a simple GDI BitBlt
- All pixel values are stored in a premultiplied alpha + RGB
representation (32-bit). This speeds up the composition of surfaces,
since it saves a few multiplications. It is also handy, since the
standard composition function produces output components which are
anyway multiplied by the output alpha.
- The caller manipulates layers and paths. A layer is a logical entity
(a group), in which all objects get painted sequentially. The
transparency of the objects is applied as if the layer initially had a
fully transparent background. Painting a semi-transparent path over
existing paint will produce a composition of the new and old paint.
- When a layer is embedded within another layer, the contents of the
embedded layer is rendered first and the resulting paint is then applied
on the embedding layer (with correct transparency management).
- Paths use anti-aliasing, which generates partially transparent edges.
This transparency is preserved until the paint is finally applied on the
target surface (which is used for the output display). However, if the
target surface is first initialised with a fully transparent background,
then the transparency will be preserved there too.
- Paths and layers get only rendered when the caller requests the engine
to render its data to a target surface. The library tries hard to render
only the parts which will be useful in the end. For instance, when an
intermediate layer is rendered, only the parts which contain paint will
get erased, painted and finally copied to the containing layer. This
uses rough regions known internally as micro-tile arrays (thanks to
- It should be really straightforward to write a renderer which generates
PDF output instead of pixels. The layer/path structure is very similar to
the XObject groups/PDF path definitions.
- OpenType support still missing.
25, 26 and 27 March 2003
- Rebuilding the GDI+ functionality using a combination of IPPI, LIBART and
24 March 2003
- Microsoft DevDays in Geneva, with David Solomon, on debugging and
22-23 March 2003
- Week-end : tried out Intel IPPI. Experimented with LIBART.
21 March 2003
20 March 2003
- EPSITEC meeting on next Cresus version.
19 March 2003
- Worked on Crésus 6 design. Finished a document which will be
presented at the next EPSITEC meeting (20 March 2003).
- Worked on libart. Built successfully using VS.NET.
18 March 2003
- First release build in weeks. This required a few updates in order to get
the released build work.
- There seems to be a bug as soon as the user tries to work on a multi-page
document, with text flowing from one page to another one.
- Fixed a repainting bug which was related to page switching and text
- Worked on Crésus 6 design.
17 March 2003
- Cleaning up.
- Added support for open curves. This required me to do some more
- Fixed small problem with the visual feed-back during object creation. The
cursor shape is now dynamic again.
- The VP.Forms.KeySinkingForm now support a
mode (Mode.CloseHidesForm) which
specifies that the base class should handle the close event itself and not
close the form, just hide it. This simplified several form implementations.
- Updated the Cmd.Sink class in order to
accept a Press event as the command trigger.
The attached item must implement ISinkPressSource
and the sink's UsePressInsteadOfClick
property must be set to true.
- Page navigation is now fully tested; a special palette was added to
provide basic page insertion/removal to the document. This also works with
16 March 2003 (Sunday)
- Fixed hot grip updating bug introduced on 12 March, in VP.FrontEnd.Logic.Selector.
- Fixed command AppendTextStory : it
must fall back to a no-op if the second story object is empty.
- Fixed command SetTextFrameInfo in order to
generate notifications for changed selections and other changes.
- Added flags to VP::DocObj::Page::Record; a
page can be marked as being active and/or selected.
- Added command ChangePageFlag to manipulate
the flags of a page record; updated the other commands to include flag
- Commands ChangePhyPageRank and ChangeLogPageRank
now support undo/redo.
- Fixed several little problems with the VP.FrontEnd.GUI.PageBar
and with the VP.FrontEnd.Logic.PageManager
15 March 2003 (Saturday)
- Installed Intel IPP (30 days trial software).
- Finishing the text frame linking code.
- Fixed VP::TextLib::FlowManager::UpdateStoryAfterRemoveFrame,
since it did not properly update the frame_before_this_one
argument; this caused the SetTextFrameInfo
command to fail on basic undo operations.
- Finished the implementation of the frame linking and unlinking code in the
- The command AppendTextStory is now fully
undoable. This allows text frame linking to be undone.
- Prepared TextCursorMark for a future
extension, which would allow the command to save all active cursors, not
just CURSOR_ID_ACTIVE and CURSOR_ID_SEL_x.
14 March 2003
- Finally downloaded and installed the updated platform SDK, including the
new managed DirectX 9 SDK. However, after trying out a few C# samples
based on Direct3D, I realise that I can't possibly use DirectX as the
alpha-blending engine for Virtual Pen... Loading and updating textures is
much too slow to be useful.
- Read about XUL, the Mozilla
interface language description and engine. This seems a very powerful tool,
however, I have read that Mozilla is not as stable as you could wish for a
- Downloaded the rest of Office 11.
- Rediscovered Intel IPP, which is a set of optimized libraries, which
contain image manipulation code, which can be used for alpha blending.
- Downloaded the latest version of libart, the LGPL 2D rendering engine
13 March 2003
- GDI+ version 188.8.131.52 works fine on Windows 2000, where there is no
side-by-side DLL loading magic. However, under XP, I am still stuck with the
184.108.40.206 version. Experimented with the delay loading in the core DLL, but
this does not work. If I try to load a different GDI+ DLL than the one
loaded by .NET, I get a conflict later and VP crashes.
- Experimented a lot with competiting software, such as
Office 11 OneNote (nice ideas).
- Analysed solutions for alternate GUIs (for a future VP update, and for the
next generation Crésus software) which work on Windows, Linux and
MacOS X. I checked out following kits :
- wxWindows, which provides an
impressive support for native widgets, even under XP, with the luna look
and feel; I just hate the way the text lines have been re-implemented.
This is a standard C++ implementation, but it has lots of bindings for
other languages too (C# in
progress). I find the dialog editor somewhat clumsy.
- QT 3.1 (the foundation of KDE)
now supports the XP look and feel too. I don't like very much the way
things have been implemented with the signals and slots; this is not
easily portable to other languagues than the pre-processed C# version
Trolltech uses. The dialog editor seems powerful.
- Eclipse's SWT (Eclipse is a free
Java IDE) is great and has a nice widget set, which is built on top of
the platform's own widgets. This produces quick applications which have
a good integration with the host OS, even if they are written in Java.
- Swing (which is part of JAVA) has skinnable GUIs. They are not 100%
accurate reproductions of their hosts, but they are quite fast (Java has
changed a lot in the 10 last years !)
- Looked into DirectX 9, which could be the best candidate for the
drawing operations in Virtual Pen.
- Looked into Ghostscript 8 which supports the PDF 1.4 model for
group transparency. If GS were faster, this would be the ideal rendering
12 March 2003
- Implemented command AppendTextStory
which is used to merge two stories. The text and tags of the second story
get copied at the end of the first story, and then the second story gets
flushed. This command does not, however, delete the empty story.
- Fixed selector and document view handling of the hot
grip, which would sometimes return the wrong grip (e.g. after an
explicit grip update).
- Extended VP::DocText::Meta::CollapseFontState,
so that a whole document can be analysed in one single call.
- Method VP::DocText::Meta::MoveToLineBeginInText
now also works if the cursor is placed before the first paragraph format tag
(e.g. when using CURSOR_ID_V_BEGIN).
- Command SetTextFrameInfo is now undoable.
- Replaced flow ID with story index in the meta object, text
flow and scribe. Updated the dependencies.
- Simplified commands CreateTextStory and QueryTextStories.
- Updated store iterator (new flag FIND_OPT_SINGLE_BLOCK).
This was needed, since the former implementation of QueryTextStories
found even deleted stories.
- Command CreateTextStory is now undoable.
- Experimented with Office 11 Beta 2, which was available
since yesterday at Microsoft. Great software, which does a lots of things
which were initially VP's competitive advantage (ligatures, smart non
breaking spaces, etc.).
- Tried to make Virtual Pen use GDI+ version 1.1 (distributed with
Office 11). This does not work under Windows XP (creating a
VirtualPen.EXE.LOCAL file did not help), but it works under
Windows 2000 (and the graphical bugs have indeed been fixed !)
11 March 2003
- Still working on GUI for text chaining. I am getting the first results...
- Made DocView's SetCustomCursor
and ClearCustomCursor available
- Fixed DocView.GripHoverActive handling.
- Better Attach/Detach handling of the
plug-ins in classes VP.FrontEnd.Logic.MainToolBase,
- Exposed internal functionality from the image and I-beam main tools.
- Implemented the MainToolCursor in
the TextFrame plug-in; it provides
the basic linking facility.
10 March 2003
- Working on GUI for text chaining. This required work on the main tool
cursor management, since the chaining operation requires the use of a
special tool. This tool is not available from the main tool bar; it is
activated automatically after the user clicks on a text frame link grip.
- Fixed VP::DocAttr::TextFrame
linking grip generation.
- Fixed VP::TextLib::FlowManager::UpdateStoryAfterInsertFrame,
which did not properly link a frame if inserted at the beginning of a story.
06-09 March 2003
- No work on Virtual Pen.
- Lots of reading (mainly on SQL).
- Physically moved my workstation and my server to a separate room and built
a noise-absorbing case; I am using a 5m VGA high quality cable to connect
the displays to my workstation. Even in 2048x1536, the quality of the video
signal is still quite good.
- Maybe, I got some flu virus ?
05 March 2003
- Working on GUI for text chaining.
- Improved command QueryTextFrameInfo.
It runs a wealth of information about the frame, its position in the story
and in the document (page, rank in the page, preceding frame, following
- The selector exports a QueryObjectGrips
method, which is used by the frame attribute plug-in to locate the grips of
- The document view now propagates the grip hover
events even in normal operating mode (previously, these events were only
produced during the creation of an object).
- Added support for fit status in the fitter, which reports
how a text fit finished (this is used by the text frame attribute to
generate different grips, for instance to show that the text is too long to
fit into the frames).
04 March 2003
- Updating the way the text is stored in the stories. The model used
originally was difficult to use with the frame linking interface I am
currently building (frames had page and frame IDs, which were mere numbers).
The new implementation makes the story object the repository of all frame
objects; the order in which the frame objects appear determines the flow.
- The text story object, when dumped, outputs the list of all associated
- Text placed on another page than the logical page with rank=0
can now be displayed and manipulated properly.
- Updated commands CreateTextStory, QueryTextStoryInfo,
QueryTextFrameInfo and SetTextFrameInfo
to work with the new internal representation.
- The Flow, FlowFrame
and FlowManager classes needed a lot of
small adjustments. I finally kept the frame ID and the page ID in the FlowFrame.
These are generated automatically based on runtime information provided by
the VP::DocAttr::TextFrame::Paint method and
the frame array found in the story object.
- The text frame attribute no longer stores information about the page ID or
the frame ID.
- Fixed small problem with the text ruler which did not show up on the
proper frame, when a story spans over several frames.
03 March 2003
- No work for Virtual Pen today.
02 March 2003
- Fixed a bug in the hyphenator, which caused characters with accents to be
improperly substituted. The hyphenation was affected and produced wrong
01 March 2003
- Working version of the simple curve plug-in.
- There are two new interesting Corel products on the market :
Designer 10 and Grafigo.
History of previous months.