Re: Generic Embeddable plugins.

From: Tomas Frydrych <tomasfrydrych_at_yahoo.co.uk>
Date: Tue Jan 11 2005 - 09:34:58 CET

Sounds good Martin. I have two suggestions:

(1) Allow jpg snapshots alongside png and svg (once fjf implements the
jpg storage in documents). JPG is more suitable for some things than
PNG, and the plugin designer should have the option to provide JPG if
she knows that preferable. I suggest each plugin should provide
getSnapshotType() method, with return value based on or-able enum for
the types: some plugins might return PNG | JPG | SVG, some just JPG, etc.

(2) Provide a preference that would allow the user to force PNG or JPG
snapshots for everything in the document. This way if you sent a doc
with a formula and I complain it has no formulas in it (no SVG plugin)
you will be able to make me a usable one.

Tomas

msevior@physics.unimelb.edu.au wrote:
> Hi Folks,
> I've taken the comments of people asking for a generic
> embeddable API on-board and now propose the following.
>
> The idea is to have a generic XP class with a well defined API with
> default implementations. Plugins are subclasses of this class which
> overide the default implementations.
>
> OK here is the header file for the base class:
> -------------------------------------------------------------
> #ifndef __gr_Abi_EmbedManager_h__
> #define __gr_Abi_EmebdManager_h__
> #include "ut_string_class.h"
> #include "ut_types.h"
> #include "pt_Types.h"
>
>
> class GR_Graphics;
> class UT_ByteBuf;
> class PD_Document;
> class ABI_EXPORT GR_EmbedView
> {
> public:
> GR_EmbedView(PD_Document * pDoc, PT_AttrPropIndex api );
> virtual ~GR_EmbedView(void);
> PD_Document * m_pDoc;
> PT_AttrPropIndex m_iAPI;
> bool m_bHasSVGSnapshot;
> bool m_bHasPNGSnapshot;
> UT_ByteBuf m_SVGBuf;
> UT_ByteBuf m_PNGBuf;
> }
>
> class ABI_EXPORT GR_Abi_EmbedManager
> {
> public:
> GR_Abi_EmbedManager(GR_Graphics * pG);
> virtual ~GR_Abi_EmbedManager();
> const char * getObjectType(void) const;
> GR_Abi_EmbedManager * createMe(GR_Graphics * pG);
> virtual void initialize(void);
> GR_Graphics * getGraphics(void);
> virtual void setGraphics(GR_Graphics * pG);
> virtual UT_sint32 makeEmbedView(PD_Document * pDoc,
> PT_AttrPropIndex api) ;
> virtual void setColor(UT_sint32 uid, UT_RGBColor c);
> virtual UT_sint32 getWidth(UT_sint32 uid);
> virtual UT_sint32 getAscent(UT_sint32 uid) ;
> virtual UT_sint32 getDescent(UT_sint32 uid) ;
> virtual void loadEmbedData(UT_sint32 uid);
>
> virtual void setDefaultFontSize(UT_sint32 uid, UT_sint32);
> virtual void render(UT_sint32 uid, UT_sint32 x, UT_sint32 y);
> virtual void releaseEmbedView(UT_sint32 uid);
> virtual void initializeEmbedView(UT_sint32 uid);
> virtual void makeSnapShot(UT_sint32 uid);
> virtual bool isDefault(void);
> private:
> GR_Graphics * m_pG;
> UT_Vector<GR_EmbedView *> m_vecSnapshots;
> };
>
> We will have two methods in the XAP_App class which are used to register
> and discover embeddable plugins. Two register the plugin creates a copy of
> the itself and calls:
>
> XAP_App::registerEmbeddable(GR_Abi_EmbedManager * pEmbed)
>
> Which places the pointer to this manager in a vector in XAP_App.
>
> We have invented a new type of piecetable object like a field or image.
> The object type is
> PTO_Embed.
>
> The PTO_Embed object has an attribute "object-type". The value of this
> attribute is the type of embeddable object. For MathML we would have the
> object/attribute pair "object-type:MathML"
>
> When the layout classes encounter a PTO_Embed object they look in
> fl_DocLayout to see if a manager has been loaded for it. If one has they
> use that, otherwise a new manager is created via the XAP_App method:
>
> GR_Abi_EmbedManager * XAP_App::getEmbeddableManager(GR_Graphics * pG,
> const char * szObjectType)
>
> This method scans the vector of loaded plugins looking for a match to
> szObjectType via the
>
> GR_Abi_EmbedManager::getObjectType(void)
>
> method.
>
> If a match is found a new instance of the manager is created and returned
> to the caller via the
>
> GR_Abi_EmbedManager * GR_Abi_EmbedManager::createMe(GR_Graphics * pG)
>
> Method.
>
> If none are found a default implementation is created and returned to
> fl_DocLayout which stores it in a vector as well.
>
> OK now we have either the default embeddable or the requested implementation.
>
> I'll go through the rest of the API.
>
> virtual void initialize(void);
>
> This initializes the manager.
>
> GR_Graphics * getGraphics(void);
> virtual void setGraphics(GR_Graphics * pG);
>
> As you might expect. The setGraphics method is called when the document is
> zoomed.
>
> virtual UT_sint32 makeEmbedView(PD_Document * pDoc,
> PT_AttrPropIndex api) ;
>
> This method makes a specific instance of the render for the object in
> question. It returns an integer which is an index (a "handle") to the
> specific instance of the renderer. The PD_Document and PT_AttrPropIndex
> index are used to determine specific attributes of the object as well as
> being used to make snapshots of the renderer.
>
> virtual void setColor(UT_sint32 uid, UT_RGBColor c);
> virtual UT_sint32 getWidth(UT_sint32 uid);
> virtual UT_sint32 getAscent(UT_sint32 uid) ;
> virtual UT_sint32 getDescent(UT_sint32 uid) ;
> virtual void setDefaultFontSize(UT_sint32 uid, UT_sint32);
>
> These do as expected.
>
> virtual void loadEmbedData(UT_sint32 uid);
>
> OK these load the data from data-item in the associated with the object.
> This data could be:
>
> MathML for a the GtkMathView plugin
> Gnumeric XML for a Gnumeric plugin
> Postscript text for a postscript plugin
>
> Some generic bonobo XML data for a generic bonobo plugin.
> Whatever you like...
>
> virtual void render(UT_sint32 uid, UT_sint32 x, UT_sint32 y);
>
> Draw the object at locattion (x,y) in the graphics class.
>
> virtual void releaseEmbedView(UT_sint32 uid);
>
> Delete this specific renderer
>
> virtual void initializeEmbedView(UT_sint32 uid);
> Initialize a specific instance of this view.
>
> virtual void makeSnapShot(UT_sint32 uid);
>
> Make a snapshot of the current view. This snapshot can be either in SVG or
> PNG form. SVG is clearly prefered. The snapshot data is stored in the
> PD_Document as a data item. The attribute/value is recorded for the
> PTO_Embed object as either
>
> "snapshot-svg:dataitem-val#" or "snapshot-png:dataitem-val#"
>
> Where dataitem-val# is some unique string to identify the object.
>
> If idea is that if a document loaded by an instance of AbiWord without the
> plugin, the default implementation can render the snapshot of the object.
>
> I will make a PNG snapshotter for which just takes a screenshot of the
> object.
>
> Once the SVG backend for gnome-print is in wide use, and printable
> document which employs gnome-print can be snapshotted.
>
> virtual bool isDefault(void);
>
> Returns true if the manager is the default implementation.
>
> Here is my current working of the MathML plugin header file...
>
> Cheers
>
> Martin
>
> -----------------------------------------------------------------------
>
> #include "ut_string_class.h"
> #include "gr_Abi_EmbedManager.h"
> #include <MathView/libxml2_MathView.hh>
>
> class GR_Graphics;
> class GR_Abi_MathGraphicDevice;
> class GR_Abi_RenderingContext;
> class MathMLOperatorDictionary;
> class GR_AbiMathView;
>
> class ABI_EXPORT GR_Abi_MathManager : pubic GR_Abi_EmbedManager
> {
> public:
> GR_Abi_MathManager(GR_Graphics * pG);
> virtual ~GR_Abi_MathManager();
> GR_Abi_EmbedManager * createMe(GR_Graphics * pG);
> virtual void initialize(void);
> GR_Graphics * getGraphics(void);
> virtual void setGraphics(GR_Graphics * pG);
> virtual UT_sint32 makeEmbedView(PD_Document * pDoc,
> PT_AttrPropIndex api) ;
> virtual void setColor(UT_sint32 uid, UT_RGBColor c);
> virtual UT_sint32 getWidth(UT_sint32 uid);
> virtual UT_sint32 getAscent(UT_sint32 uid) ;
> virtual UT_sint32 getDescent(UT_sint32 uid) ;
> virtual void loadEmbedData(UT_sint32 uid, UT_UTF8String &
> sMathBuf);
> virtual void render(UT_sint32 uid, UT_sint32 x, UT_sint32 y);
> virtual void releaseEmbedView(UT_sint32 uid);
> virtual void initializeEmbedView(UT_sint32 uid);
> virtual void makeSnapShot(UT_sint32 uid);
> virtual bool isDefault(void);
> private:
> virtual UT_sint32 _makeMathView(void) ;
> virtual void _releaseMathView(UT_sint32 uid);
> virtual void _resetRootElement(UT_sint32 uid, void);
> virtual void _loadMathML(UT_sint32 uid, UT_UTF8String &
> sMathBuf);
> UT_sint32 _getNextUID(void);
> UT_sint32 m_CurrentUID;
> SmartPtr<AbstractLogger> m_pLogger;
> SmartPtr<GR_Abi_MathGraphicDevice> m_pMathGraphicDevice;
> GR_Abi_RenderingContext * m_pAbiContext;
> SmartPtr<MathMLOperatorDictionary> m_pOperatorDictionary;
> UT_Vector<GR_AbiMathView *> m_vecMathView;
> };
>
>
>
>
>
Received on Tue Jan 11 09:36:07 2005

This archive was generated by hypermail 2.1.8 : Tue Jan 11 2005 - 09:36:09 CET