• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

gr_Graphics.h

Go to the documentation of this file.
00001 /* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */
00002 /* AbiWord
00003  * Copyright (C) 1998 AbiSource, Inc.
00004  * Copyright (C) 2002 Tomas Frydrych, <tomas@frydrych.uklinux.net>
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00019  * 02110-1301 USA.
00020  */
00021 
00022 #ifndef GR_GRAPHICS_H
00023 #define GR_GRAPHICS_H
00024 
00025 #include "xap_Features.h"
00026 
00027 #include "ut_types.h"
00028 #include "ut_units.h"
00029 #include "ut_growbuf.h"
00030 #include "ut_misc.h"
00031 #include "gr_Image.h"
00032 #include "gr_Caret.h"
00033 #include "gr_Transform.h"
00034 #include "gr_CharWidthsCache.h"
00035 #include "ut_vector.h"
00036 #include "ut_stack.h"
00037 #include "ut_TextIterator.h"
00038 
00039 #ifdef ABI_GRAPHICS_PLUGIN
00040 #define VIRTUAL_SFX = 0
00041 #else
00042 #define VIRTUAL_SFX
00043 #endif
00044 
00045 class UT_RGBColor;
00046 class XAP_PrefsScheme;
00047 class XAP_Frame;
00048 class UT_String;
00049 class GR_RenderInfo;
00050 class GR_Itemization;
00051 class GR_ShapingInfo;
00052 
00053 
00068 class GR_Graphics;
00069 class GR_Painter;
00070 class GR_Caret;
00071 
00072 typedef enum {
00073     GR_FONT_UNSET=0,
00074     GR_FONT_UNIX,
00075     GR_FONT_UNIX_PANGO,
00076     GR_FONT_WIN32,
00077     GR_FONT_WIN32_USP
00078 } GrFontType;
00079 
00080 class ABI_EXPORT GR_Font
00081 {
00082     friend class GR_Graphics;
00083     friend class std::map<std::string, GR_Font*>;
00084 
00085  public:
00086     // want the destructor public so that the derrived graphics classes can delete font
00087     // objects without having to be declared here as friends
00088     virtual ~GR_Font();
00089 
00090 
00091     typedef enum { FF_Unknown = 0, FF_Roman, FF_Swiss, FF_Modern,
00092                    FF_Script, FF_Decorative, FF_Technical, FF_BiDi, FF_Last } FontFamilyEnum;
00093     typedef enum { FP_Unknown = 0, FP_Fixed, FP_Variable } FontPitchEnum;
00094 
00095     // The following is actually implemented in platform code.
00096     // It is primarily used to characterize fonts for RTF export.
00097     static void s_getGenericFontProperties(const char * szFontName,
00098                                            FontFamilyEnum * pff,
00099                                            FontPitchEnum * pfp,
00100                                            bool * pbTrueType);
00101 
00102     virtual const char* getFamily() const { return NULL; }
00103     UT_uint32           getAllocNumber() const {return m_iAllocNo;}
00108     virtual UT_sint32 measureUnremappedCharForCache(UT_UCSChar cChar) const = 0;
00109     virtual const std::string & hashKey(void) const;
00110     UT_sint32 getCharWidthFromCache (UT_UCSChar c) const;
00111 
00112     /*reimplement if you want to instanciate something else */
00113     virtual GR_CharWidths* newFontWidths(void) const;
00114     /*
00115        implemented using character widths; platforms might want to
00116        provide different implementation
00117        NB: it is essential that this function is fast
00118     */
00119     virtual bool doesGlyphExist(UT_UCS4Char g) const;
00120 //
00121 // UT_Rect of glyph in Logical units.
00122 // rec.left = bearing Left (distance from origin to start)
00123 // rec.width = width of the glyph
00124 // rec.top = distance from the origin to the top of the glyph
00125 // rec.height = total height of the glyph
00126 
00127     virtual bool glyphBox(UT_UCS4Char g, UT_Rect & rec, GR_Graphics * pG) = 0;
00128     static  bool s_doesGlyphExist(UT_UCS4Char g, void *instance)
00129     {
00130         UT_return_val_if_fail(instance, false);
00131         GR_Font * pThis = static_cast<GR_Font*>(instance);
00132         return pThis->doesGlyphExist(g);
00133     }
00134 
00135     GrFontType getType()const {return m_eType;}
00136 
00137   protected:
00138 
00139     GR_Font();
00140 
00141     GR_CharWidths * _getCharWidths() const {return m_pCharWidths;}
00146     mutable std::string     m_hashKey;
00147 
00148     GrFontType               m_eType;
00149 
00150 private:
00151 
00152     static UT_uint32 s_iAllocCount;
00153     UT_uint32        m_iAllocNo;
00154     mutable GR_CharWidths*  m_pCharWidths;
00155 };
00156 
00157 
00158 /*
00159     GR_GraphicsId defines IDs returned by GR_Graphics::getClassId()
00160     used to identify the class in communication with GR_GraphicsFactory.
00161 
00162     There are three types of IDs: default, built-in and plugin.
00163 
00164     Default IDs are not assigned permanently to any class and are used
00165     by the factory to allocate default graphics. These IDs are
00166     reallocable -- if the factory receives a request to register a
00167     class under one of these IDs, it will automatically unregister any
00168     class currently registered under that ID.
00169 
00170     Built-in IDs are permanently assinged to specific derrived
00171     classes. The factory will refuse to register a class under one of
00172     these IDs if another class is already registered with it.
00173 
00174     Plugin IDs are dynamically generated for a graphics class by the
00175     factory. The main draw-back of plugin IDs is that they cannot be
00176     stored in preference profiles. A plugin desinger might prefer to
00177     request a fixed ID from the built-in range (we could use UUIDs to
00178     identify graphics, but that seems an overkill).
00179  */
00180 enum GR_GraphicsId
00181 {
00182     /* default id's */
00183     /* these id's can be reregistered at will */
00184     GRID_DEFAULT         =  0x0,
00185     GRID_DEFAULT_PRINT   =  0x1,
00186 
00187     GRID_LAST_DEFAULT    =  0xff,
00188 
00189     /* IDs for built-in classes: DO NOT CHANGE THE ASSIGNED VALUES !!!*/
00190     /* (these classes cannot be unregistered) */
00191     GRID_COCOA           =  0x102,
00192     GRID_WIN32           =  0x104,
00193     GRID_UNIX            =  0x105,
00194     GRID_UNIX_PS         =  0x106,
00195     GRID_CAIRO_NULL      =  0x107,
00196 
00197     /*add new built-in ids here*/
00198 
00199     GRID_LAST_BUILT_IN = 0x200,
00200 
00201     /* IDs for extension classes (can be both built-in and plugins) */
00202     /* (these classes can be unregistered by explicit call to
00203        unregisterClass()) */
00204     GRID_UNIX_PANGO      =  0x201,
00205     GRID_WIN32_UNISCRIBE =  0x202,
00206     GRID_UNIX_PANGO_PRINT = 0x203,
00207     GRID_UNIX_PANGO_PIXMAP = 0x204,
00208         GRID_COCOA_PANGO     = 0x205,
00209 
00210     GRID_LAST_EXTENSION = 0x0000ffff,
00211 
00212     /* id's for plugins will be auto-generatoed from between here */
00213 
00214     GRID_UNKNOWN = 0xffffffff
00215 };
00216 
00217 // or-able graphics type
00218 enum GR_Capability
00219 {
00220     GRCAP_UNKNOWN            = 0,
00221     GRCAP_SCREEN_ONLY        = 1,
00222     GRCAP_PRINTER_ONLY       = 2,
00223     GRCAP_SCREEN_AND_PRINTER = 3
00224 };
00225 
00269 class ABI_EXPORT GR_AllocInfo
00270 {
00271   public:
00272     virtual ~GR_AllocInfo() {}
00273 
00274     virtual GR_GraphicsId getType() const {UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return GRID_UNKNOWN;}
00275     virtual bool isPrinterGraphics()const {UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return false;}
00276 };
00277 
00278 typedef GR_Graphics * (*GR_Allocator)(GR_AllocInfo&);
00279 typedef const char *  (*GR_Descriptor)(void);
00280 /*
00281    The purpose of GR_GraphicsFactory is to allow us to have parallel
00282    graphics implementations. For example, on win32 we could have a
00283    graphics class using Uniscribe, graphics class without shaping
00284    support and graphics class using SIL Graphite. The user then could
00285    specify through preferences which shaping engine s/he wishes to
00286    use. The factory provides access to all graphics classes known to
00287    the application.
00288 */
00289 class ABI_EXPORT GR_GraphicsFactory
00290 {
00291 
00292   public:
00293     GR_GraphicsFactory(){};
00294     virtual ~GR_GraphicsFactory(){};
00295 
00296     UT_uint32     getClassCount() const {return m_vClassIds.getItemCount();}
00297 
00298     bool          registerClass(GR_Allocator, GR_Descriptor, UT_uint32 iClassId);
00299     UT_uint32     registerPluginClass(GR_Allocator, GR_Descriptor);
00300 
00301     void          registerAsDefault(UT_uint32 iClassId, bool bScreen)
00302                          {
00303                              if(bScreen)
00304                                  m_iDefaultScreen = iClassId;
00305                              else
00306                                  m_iDefaultPrinter = iClassId;
00307                          }
00308 
00309     UT_uint32     getDefaultClass(bool bScreen) const {if(bScreen) return m_iDefaultScreen; else return m_iDefaultPrinter;}
00310     bool          unregisterClass(UT_uint32 iClassId);
00311     bool          isRegistered(UT_uint32 iClassId) const;
00312 
00313     GR_Graphics * newGraphics(UT_uint32 iClassId, GR_AllocInfo &param) const;
00314     const char *  getClassDescription(UT_uint32 iClassId) const;
00315 
00316 
00317   private:
00318     UT_GenericVector<GR_Allocator>       m_vAllocators;
00319     UT_GenericVector<GR_Descriptor>       m_vDescriptors;
00320     UT_NumberVector m_vClassIds;
00321 
00322     UT_uint32       m_iDefaultScreen;
00323     UT_uint32       m_iDefaultPrinter;
00324 };
00325 
00326 
00327 enum GRShapingResult
00328 {
00329     GRSR_BufferClean = 0x00,                  // clear all bits; see notes above !!!
00330     GRSR_None = 0x01,                         // bit 0 set
00331     GRSR_ContextSensitive = 0x02,             // bit 1 set
00332     GRSR_Ligatures = 0x04,                    // bit 2 set
00333     GRSR_ContextSensitiveAndLigatures = 0x06, // bit 1, 2 set
00334     GRSR_Unknown = 0xef,                      // bits 0-6 set, initial value for text in our runs
00335     GRSR_Error = 0xff                         // bits 0-7 set
00336 };
00337 
00338 /*
00339   GR_Graphics is a portable interface to a simple 2-d graphics layer.  It is not
00340   an attempt at a general purpose portability layer.  Rather, it contains only
00341   functions which are needed.
00342 */
00343 
00344 #define GR_OC_LEFT_FLUSHED 0x40000000 // flip bit 31
00345 #define GR_OC_MAX_WIDTH    0x3fffffff
00346 
00347 class ABI_EXPORT AllCarets
00348 {
00349     friend class GR_Graphics;
00350  public:
00351     AllCarets(GR_Graphics * pG,
00352               GR_Caret ** pCaret,
00353               UT_GenericVector<GR_Caret *>* vecCarets  );
00354     virtual ~AllCarets(){}
00355     GR_Caret *  getBaseCaret(void);
00356     void        enable(void);
00357     void        disable(bool bNoMulti = false);
00358     void        setBlink(bool bBlink);
00359     void        JustErase(UT_sint32 xPoint,UT_sint32 yPoint);
00360     void        setWindowSize(UT_uint32 width, UT_uint32 height);
00361     void        setCoords(UT_sint32 x, UT_sint32 y, UT_uint32 h,
00362                           UT_sint32 x2 = 0, UT_sint32 y2 = 0, UT_uint32 h2 = 0,
00363                           bool bPointDirection = false,
00364                           const UT_RGBColor * pClr = NULL);
00365     void        setInsertMode (bool mode);
00366     void        forceDraw(void);
00367 
00368  private:
00369     GR_Graphics * m_pG;
00370     GR_Caret **    m_pLocalCaret;
00371     UT_GenericVector<GR_Caret *>* m_vecCarets;
00372 };
00373 
00374 
00375 class ABI_EXPORT GR_Graphics
00376 {
00377     friend class GR_Painter;
00378     friend class GR_Caret;
00379     friend class AllCarets;
00380  public:
00381     virtual ~GR_Graphics();
00382 
00383     // the static method allows us to retrive the the class id for
00384     // purposes of registration; we also need the virtual to identify
00385     // the class from a generic GR_Graphics pointer
00386 //  static UT_uint32 s_getClassId() {UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return GRID_UNKNOWN;}
00387     virtual UT_uint32 getClassId() = 0;
00388 
00389     virtual GR_Capability getCapability() {UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return GRCAP_UNKNOWN;}
00390 #if 0
00391     // the following two static functions have to be implemented by all
00392     // derrived classes and registered with GR_GraphicsFactory
00393     static const char *    graphicsDescriptor(void){UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return "???";}
00394     static GR_Graphics *   graphicsAllocator(GR_AllocInfo&){UT_ASSERT_HARMLESS(UT_NOT_IMPLEMENTED); return NULL;}
00395 #endif
00396 
00397     AllCarets * allCarets();
00398     void        disableAllCarets();
00399     void        enableAllCarets();
00400 
00401     UT_sint32   tdu(UT_sint32 layoutUnits) const;
00402     UT_sint32   tlu(UT_sint32 deviceUnits) const;
00403     double      tduD(double layoutUnits) const;
00404     double      tluD(double deviceUnits) const;
00405     void        antiAliasAlways(bool bAntiAlias)
00406     { m_bAntiAliasAlways = bAntiAlias;}
00407     bool        getAntiAliasAlways(void)
00408     { return m_bAntiAliasAlways;}
00409 
00414     UT_sint32   ftlu(UT_sint32 fontUnits) const;
00415     double      ftluD(double fontUnits) const;
00416 
00417     virtual void      setFont(const GR_Font* pFont) = 0;
00418     virtual void      clearFont(void) = 0;
00419     virtual UT_uint32 getFontAscent() = 0;
00420     virtual UT_uint32 getFontDescent() = 0;
00421     virtual UT_uint32 getFontHeight() = 0;
00422     void              invalidateCache(void);
00423     virtual bool      canQuickPrint(void) const { return false;}
00424     virtual UT_uint32 measureString(const UT_UCSChar*s,
00425                                     int iOffset,
00426                                     int num,
00427                                     UT_GrowBufElement* pWidths, UT_uint32 *height = 0);
00428 
00429     virtual UT_sint32 measureUnRemappedChar(const UT_UCSChar c, UT_uint32 * height = 0) = 0;
00430     virtual void getCoverage(UT_NumberVector& coverage) = 0;
00431 
00432     /* GR_Font versions of the above -- TODO: should I add drawChar* methods too? */
00433     virtual UT_uint32 getFontAscent(const GR_Font *)  = 0;
00434     virtual UT_uint32 getFontDescent(const GR_Font *) = 0;
00435     virtual UT_uint32 getFontHeight(const GR_Font *)  = 0;
00436     virtual double    getResolutionRatio(void) const {return 1.0;}
00437 
00438     void         getMaxCharacterDimension (const UT_UCSChar*s, UT_uint32 Length, UT_uint32 &width, UT_uint32 &height);
00439 
00440     virtual void      setColor(const UT_RGBColor& clr) = 0;
00441     virtual void      getColor(UT_RGBColor& clr) = 0;
00442     virtual GR_Font*  getGUIFont() = 0;
00443 
00444     GR_Font*  findFont(const char* pszFontFamily,
00445                        const char* pszFontStyle,
00446                        const char* pszFontVariant,
00447                        const char* pszFontWeight,
00448                        const char* pszFontStretch,
00449                        const char* pszFontSize,
00450                        const char* pszLang);
00451 
00452     /* Static 'virtual' -- if you are providing an implementation for this
00453      * function in a derrived graphics class, please define
00454      * XAP_HAVE_GR_findNearestFont in platform xap_*Features.h file
00455      */
00456 #ifdef XAP_HAVE_GR_findNearestFont
00457     static const char* findNearestFont(const char* pszFontFamily,
00458                                        const char* pszFontStyle,
00459                                        const char* pszFontVariant,
00460                                        const char* pszFontWeight,
00461                                        const char* pszFontStretch,
00462                                        const char* pszFontSize,
00463                                        const char* pszLang);
00464 #else
00465     static const char* findNearestFont(const char* pszFontFamily,
00466                                        const char* /*pszFontStyle*/,
00467                                        const char* /*pszFontVariant*/,
00468                                        const char* /*pszFontWeight*/,
00469                                        const char* /*pszFontStretch*/,
00470                                        const char* /*pszFontSize*/,
00471                                        const char* /*pszLang*/)
00472         {return pszFontFamily;}
00473 #endif
00474 
00475     const char *      invertDimension(UT_Dimension, double) const;
00476 
00477     bool              scaleDimensions(const char * szLeftIn,
00478                                       const char * szWidthIn,
00479                                       UT_uint32 iWidthAvail,
00480                                       UT_sint32 * piLeft,
00481                                       UT_uint32 * piWidth) const;
00482 
00483     virtual GR_Image* createNewImage(const char* pszName,
00484                                      const UT_ByteBuf* pBB,
00485                                      const std::string& mimetype,
00486                                      UT_sint32 iWidth,
00487                                      UT_sint32 iHeight,
00488                                      GR_Image::GRType iType = GR_Image::GRT_Raster);
00489 
00490     virtual void      setLineWidth(UT_sint32) = 0;
00491 
00492     virtual void      setClipRect(const UT_Rect* pRect) = 0;
00493     const UT_Rect *   getClipRect(void) const { return m_pRect;}
00494     virtual void      scroll(UT_sint32, UT_sint32) = 0;
00495     virtual void      scroll(UT_sint32 x_dest,
00496                              UT_sint32 y_dest,
00497                              UT_sint32 x_src,
00498                              UT_sint32 y_src,
00499                              UT_sint32 width,
00500                              UT_sint32 height) = 0;
00501 
00502     typedef enum { DGP_SCREEN, DGP_PAPER, DGP_OPAQUEOVERLAY } Properties;
00503 
00504     typedef enum
00505       {
00506         JOIN_MITER,
00507         JOIN_ROUND,
00508         JOIN_BEVEL
00509       } JoinStyle ;
00510 
00511     typedef enum
00512       {
00513         CAP_BUTT,
00514         CAP_ROUND,
00515         CAP_PROJECTING
00516       } CapStyle ;
00517 
00518     typedef enum
00519       {
00520         LINE_SOLID,
00521         LINE_ON_OFF_DASH,
00522         LINE_DOUBLE_DASH,
00523         LINE_DOTTED
00524       } LineStyle ;
00525 
00526     virtual void setLineProperties ( double inWidthPixels,
00527                      JoinStyle inJoinStyle = JOIN_MITER,
00528                      CapStyle inCapStyle   = CAP_BUTT,
00529                      LineStyle inLineStyle = LINE_SOLID ) ;
00530 
00531     virtual bool      queryProperties(GR_Graphics::Properties gp) const = 0;
00532     /* the following 3 are only used for printing */
00533 
00534     virtual bool      startPrint(void) = 0;
00535 
00536     virtual bool      startPage(const char * szPageLabel,
00537                                 UT_uint32 pageNumber,
00538                                 bool bPortrait,
00539                                 UT_uint32 iWidth,
00540                                 UT_uint32 iHeight) = 0;
00541 
00542     virtual bool      endPrint(void) = 0;
00543 
00544     virtual void      flush(void);
00545 
00546     /* specific color space support */
00547 
00548     typedef enum { GR_COLORSPACE_COLOR,
00549                    GR_COLORSPACE_GRAYSCALE,
00550                    GR_COLORSPACE_BW
00551     } ColorSpace;
00552 
00553     virtual void      setColorSpace(GR_Graphics::ColorSpace c) = 0;
00554     virtual GR_Graphics::ColorSpace getColorSpace(void) const = 0;
00555 
00556     /* multiple cursor support */
00557 
00558     typedef enum { GR_CURSOR_INVALID=0,
00559                    GR_CURSOR_DEFAULT,
00560                    GR_CURSOR_IBEAM,
00561                    GR_CURSOR_RIGHTARROW,
00562                    GR_CURSOR_IMAGE,
00563                    GR_CURSOR_IMAGESIZE_NW,
00564                    GR_CURSOR_IMAGESIZE_N,
00565                    GR_CURSOR_IMAGESIZE_NE,
00566                    GR_CURSOR_IMAGESIZE_E,
00567                    GR_CURSOR_IMAGESIZE_SE,
00568                    GR_CURSOR_IMAGESIZE_S,
00569                    GR_CURSOR_IMAGESIZE_SW,
00570                    GR_CURSOR_IMAGESIZE_W,
00571                    GR_CURSOR_LEFTRIGHT,
00572                    GR_CURSOR_UPDOWN,
00573                    GR_CURSOR_EXCHANGE,
00574                    GR_CURSOR_GRAB,
00575                    GR_CURSOR_LINK,
00576                    GR_CURSOR_WAIT,
00577                    GR_CURSOR_LEFTARROW,
00578                    GR_CURSOR_VLINE_DRAG,
00579                    GR_CURSOR_HLINE_DRAG,
00580                    GR_CURSOR_CROSSHAIR,
00581                            GR_CURSOR_DOWNARROW,
00582                            GR_CURSOR_DRAGTEXT,
00583                            GR_CURSOR_COPYTEXT
00584     } Cursor;
00585 
00586     virtual void      setCursor(GR_Graphics::Cursor c) = 0;
00587     virtual GR_Graphics::Cursor getCursor(void) const = 0;
00588 
00589     virtual void      setZoomPercentage(UT_uint32 iZoom);
00590     inline UT_uint32  getZoomPercentage(void) const {return m_iZoomPercentage; }
00591     static UT_uint32  getResolution(void) { return UT_LAYOUT_RESOLUTION; }
00592     inline void       setPortrait (bool b) {m_bIsPortrait = b;}
00593     inline bool       isPortrait (void) const {return m_bIsPortrait;}
00594 
00595     typedef enum { CLR3D_Foreground=0,              /* color of text/foreground on a 3d object */
00596                    CLR3D_Background=1,              /* color of face/background on a 3d object */
00597                    CLR3D_BevelUp=2,                 /* color of bevel-up  */
00598                    CLR3D_BevelDown=3,               /* color of bevel-down */
00599                    CLR3D_Highlight=4                /* color half-way between up and down */
00600     } GR_Color3D;
00601 #define COUNT_3D_COLORS 5
00602 
00603     virtual void      setColor3D(GR_Color3D c) = 0;
00604     virtual bool      getColor3D(GR_Color3D /*name*/, UT_RGBColor & /*color*/)
00605     { return false; }
00606 
00607     const GR_Transform & getTransform() const {return m_Transform;}
00608 
00609     /* returns true on success, false on failure */
00610     bool              setTransform(const GR_Transform & tr)
00611                          {
00612                              bool ret = _setTransform(tr);
00613                              if(!ret)
00614                                  return false;
00615                              m_Transform = tr;
00616                              return true;
00617                          }
00618 
00619     void              createCaret()
00620         {
00621             UT_ASSERT_HARMLESS(!m_pCaret);
00622             m_pCaret = new GR_Caret(this);
00623         }
00624 
00625     GR_Caret *        createCaret(const std::string& sID);
00626     GR_Caret *        getCaret(const std::string& sID) const;
00627     GR_Caret *        getNthCaret(UT_sint32 i) const;
00628     void              removeCaret(const std::string& sID);
00629 
00630     virtual void      saveRectangle(UT_Rect & r, UT_uint32 iIndx) = 0;
00631     virtual void      restoreRectangle(UT_uint32 iIndx) = 0;
00632     virtual UT_uint32 getDeviceResolution(void) const = 0;
00633 //
00634 // Use these methods to fix off by 1 errors while scrolling. Add the
00635 // the logical difference to these first, then calculate how much
00636 // the screen needs to scroll in device units
00637 //
00638     UT_sint32         getPrevYOffset(void) const { return m_iPrevYOffset;}
00639     UT_sint32         getPrevXOffset(void) const { return m_iPrevXOffset;}
00640     void              setPrevYOffset(UT_sint32 y) { m_iPrevYOffset = y;}
00641     void              setPrevXOffset(UT_sint32 x) { m_iPrevXOffset = x;}
00642 
00643     UT_sint32         _tduX(UT_sint32 layoutUnits) const;
00644 
00645 
00647     // complex script processing; see default implementations of these
00648     // functions for documentation
00649     //
00650     virtual bool itemize(UT_TextIterator & text, GR_Itemization & I) VIRTUAL_SFX;
00651 
00652     // translates GR_ShapingInfo into GR_RenderInfo which then can be
00653     // passed to renderChars()
00654     virtual bool shape(GR_ShapingInfo & si, GR_RenderInfo *& ri) VIRTUAL_SFX;
00655 
00656     // like drawChars, except uses generic (platform specific) input
00657     // the default implementation simply maps to drawChars and needs
00658     // to be replaced by platform code
00659     virtual void prepareToRenderChars(GR_RenderInfo & ri) VIRTUAL_SFX;
00660     virtual void renderChars(GR_RenderInfo & ri) VIRTUAL_SFX;
00661 
00662     virtual void appendRenderedCharsToBuff(GR_RenderInfo & ri, UT_GrowBuf & buf) const VIRTUAL_SFX;
00663     virtual void measureRenderedCharWidths(GR_RenderInfo & ri) VIRTUAL_SFX;
00664 
00665     // expects ri.m_iOffset set to the run offset condsidered for break
00666     //         ri.m_pText set positioned at start of the run
00667     //         represented by ri, its uper limit set appropriately
00668     //         ri.m_iLength is set to the run length
00669     // iNext -- if break is not possible at the given offset, the
00670     //          class might return the next possible break offset in
00671     //          iNext, relative to start of the text represented by ri
00672     //          (not relative to m_iOffset); if the class does not
00673     //          know where the next break point lies, it should set
00674     //          iNext to -1; if it knows that there is no break in this run, it should set
00675     //          iNext to -2
00676     // bAfter indicates whether we are quering for a break after the character at given offset
00677 
00678     virtual bool canBreak(GR_RenderInfo & ri, UT_sint32 &iNext, bool bAfter) VIRTUAL_SFX;
00679 
00680     // indicates if special caret positioning has to be done for the run of text; this allows us
00681     // to speed things up when this is not needed
00682     virtual bool needsSpecialCaretPositioning(GR_RenderInfo & /*ri*/) VIRTUAL_SFX {return false;}
00683 
00684     // adjusts caret position if given script restricts where caret can be placed
00685     // the caller has to set initial position within the run in ri.m_iOffset, overall length of
00686     // the run in ri.m_iLength and provide a text iterator over the text of the run in ri.m_pText
00687     //
00688     // return value is the adjusted offset
00689     // the default implementation simply returns the passed value
00690     virtual UT_uint32 adjustCaretPosition(GR_RenderInfo & ri, bool bForward) VIRTUAL_SFX;
00691 
00692     // Adjusts position for delete if given script restricts deletion to character clusters.
00693     // The caller has to set initial position within the run in ri.m_iOffset, overall length to be
00694     // deleted in ri.m_iLength and provide a text iterator over the text of the run in ri.m_pText
00695     // on return ri.m_iOffset contains the adjusted (run-relative) position and ri.m_iLength the count
00696     // the adjusted length of the delete
00697     //
00698     // the default implementation simply returns the passed value
00699     virtual void adjustDeletePosition(GR_RenderInfo & ri) VIRTUAL_SFX;
00700 
00701     // the AbiWord line breaking was designed looking for breaks at the right edge of a character,
00702     // i.e., the character that can break is included with the left part of the split run.
00703     // the Uniscribe library, however, holds breaking info for left edge, and sometimes it is useful
00704     // to know what system we are dealing with.
00705     virtual bool nativeBreakInfoForRightEdge() VIRTUAL_SFX {return true;}
00706 
00707     virtual UT_sint32 resetJustification(GR_RenderInfo & ri, bool bPermanent) VIRTUAL_SFX;
00708     virtual UT_sint32 countJustificationPoints(const GR_RenderInfo & ri) const VIRTUAL_SFX;
00709     virtual void justify(GR_RenderInfo & ri) VIRTUAL_SFX;
00710 
00711     virtual UT_uint32 XYToPosition(const GR_RenderInfo & ri, UT_sint32 x, UT_sint32 y) const VIRTUAL_SFX;
00712     virtual void      positionToXY(const GR_RenderInfo & ri,
00713                                    UT_sint32& x, UT_sint32& y,
00714                                    UT_sint32& x2, UT_sint32& y2,
00715                                    UT_sint32& height, bool& bDirection) const VIRTUAL_SFX;
00716 
00717     virtual UT_sint32 getTextWidth(GR_RenderInfo & ri) VIRTUAL_SFX;
00718 
00719     // should be overriden by any classes implemented as plugins
00720     // NB: you must not use s_Version to store the version of derrived
00721     // classes, but have your own static variable for the derrived
00722     // class !!!
00723     virtual const UT_VersionInfo & getVersion() const {UT_ASSERT_HARMLESS( UT_NOT_IMPLEMENTED ); return s_Version;}
00724     UT_uint32         getPaintCount(void) const
00725         { return  m_paintCount;}
00726 
00727     /* all drawing should happen between calls to these two functions. this
00728      * arranges for cairo contexts to be created/destroyed etc.  if you don't
00729      * call these functions, bad things can and will happen */
00730     void beginPaint ();
00731     void endPaint ();
00732 
00733     static GR_Graphics* newNullGraphics();
00734 
00735  protected:
00736 
00737     GR_Graphics();
00738     GR_Caret *        getCaret() { return m_pCaret; }
00739 
00740     // todo: make these pure virtual
00741     virtual void _beginPaint () {}
00742     virtual void _endPaint () {}
00743 
00744     UT_sint32         _tduY(UT_sint32 layoutUnits) const;
00745     UT_sint32         _tduR(UT_sint32 layoutUnits) const;
00746 
00747     void _destroyFonts ();
00748 
00749     virtual GR_Font* _findFont(const char* pszFontFamily,
00750                                const char* pszFontStyle,
00751                                const char* pszFontVariant,
00752                                const char* pszFontWeight,
00753                                const char* pszFontStretch,
00754                                const char* pszFontSize,
00755                                const char* pszLang) = 0;
00756 
00757     // only called by GR_Painter
00758     virtual void drawLine(UT_sint32 x1, UT_sint32 y1, UT_sint32 x2, UT_sint32 y2) = 0;
00759 #if XAP_DONTUSE_XOR
00760 #else
00761     virtual void xorLine(UT_sint32 x1, UT_sint32 y1, UT_sint32 x2, UT_sint32 y2) = 0;
00762 #endif
00763     virtual void invertRect(const UT_Rect* pRect) = 0;
00764 #if XAP_DONTUSE_XOR
00765 #else
00766     void xorRect(UT_sint32 x, UT_sint32 y, UT_sint32 w, UT_sint32 h);
00767     void xorRect(const UT_Rect& r);
00768 #endif
00769 
00770     virtual void fillRect(GR_Image *pImg, const UT_Rect &src, const UT_Rect & dest);
00771     virtual void fillRect(const UT_RGBColor& c, const UT_Rect &r);
00772     virtual void fillRect(const UT_RGBColor& c, UT_sint32 x, UT_sint32 y,
00773                           UT_sint32 w, UT_sint32 h) = 0;
00774 
00775     virtual void clearArea(UT_sint32 x, UT_sint32 y, UT_sint32 w, UT_sint32 h) = 0;
00776     virtual void drawImage(GR_Image* pImg, UT_sint32 xDest, UT_sint32 yDest);
00777     virtual void fillRect(GR_Color3D c, UT_Rect &r) = 0;
00778     virtual void fillRect(GR_Color3D c,
00779                           UT_sint32 x, UT_sint32 y,
00780                           UT_sint32 w, UT_sint32 h) = 0;
00781     virtual void polygon(UT_RGBColor& c, UT_Point *pts, UT_uint32 nPoints);
00782     virtual void polyLine(UT_Point * pts, UT_uint32 nPoints) = 0;
00783     virtual void drawGlyph(UT_uint32 glyph_idx, UT_sint32 xoff, UT_sint32 yoff) = 0;
00784     virtual void drawChars(const UT_UCSChar* pChars,
00785                            int iCharOffset,
00786                            int iLength,
00787                            UT_sint32 xoff,
00788                            UT_sint32 yoff,
00789                            int* pCharWidths = NULL) = 0;
00790 
00791     virtual void drawCharsRelativeToBaseline(const UT_UCSChar* pChars,
00792                                              int iCharOffset,
00793                                              int iLength,
00794                                              UT_sint32 xoff,
00795                                              UT_sint32 yoff,
00796                                              int* pCharWidths = NULL);
00797 
00798     virtual GR_Image *    genImageFromRectangle(const UT_Rect & r) = 0;
00799 
00800  private:
00801     virtual bool _setTransform(const GR_Transform & /*tr*/)
00802         {
00803             UT_ASSERT_HARMLESS( UT_NOT_IMPLEMENTED );
00804             return false;
00805         }
00806 
00807  public:
00808     // TODO -- this should not be public, create access methods !!!
00809     //
00810     // Postscript context positions graphics wrt top of current PAGE, NOT
00811     // wrt top of document. The screen graphics engine, though positions
00812     // graphics wrt the top of the document, therefore if we are printing
00813     // page 5 we need to adjust the vertical position of the graphic in the
00814     // postscript image printing routine by (current_page_number-1) * page_height
00815     // I'm going to call this variable m_iRasterPosition, for want of a better name,
00816     // it's not acutally a rasterposition --- any better names would be a good idea,
00817     // I jusy can't think of one right now.
00818     UT_uint32         m_iRasterPosition;
00819 
00820  protected:
00821     UT_uint32         m_iZoomPercentage;
00822     UT_uint32         m_iFontAllocNo;
00823 
00824     static XAP_PrefsScheme *m_pPrefsScheme;
00825     static UT_uint32 m_uTick;
00826 
00827     const UT_Rect *  m_pRect;
00828 
00829     bool m_bHave3DColors;
00830 
00831     UT_uint32 m_paintCount;
00832 
00833     // Double buffering infrastructure.
00834 
00835     // The default implementation here leads to no double buffering,
00836     // as they perform no action at all. Should be overriden in derived
00837     // classes
00838     virtual void _DeviceContext_SwitchToBuffer() { };
00839     virtual void _DeviceContext_SwitchToScreen() { };
00840 
00841     // returns the token for the current call
00842     bool beginDoubleBuffering();
00843 
00844     // does the actual buffer-to-screen switch only when it gets
00845     // the correct token
00846     void endDoubleBuffering(bool token);
00847 
00848     // SUSPEND / RESUME drawings infrastructure
00849     // Drawing code (through gr_Graphics) will have no effect between SUSPEND - RESUME.
00850     // The default implementation does not suspend anything
00851     // (ie. changes are still taking effect)
00852 
00853     virtual void _DeviceContext_SuspendDrawing() { };
00854     virtual void _DeviceContext_ResumeDrawing() { };
00855 
00856     bool suspendDrawing();
00857     void resumeDrawing(bool token);
00858 
00859     // Device context switch management
00860     bool m_bDoubleBufferingActive;
00861     bool m_bDrawingSuspended;
00862 
00863     typedef enum {
00864         SWITCHED_TO_BUFFER = 0,
00865         DRAWING_SUSPENDED
00866     } DeviceContextSwitchType;
00867 
00868     UT_NumberStack m_DCSwitchManagementStack;
00869 
00870  private:
00871     GR_Caret *       m_pCaret;
00872     bool             _PtInPolygon(UT_Point * pts,UT_uint32 nPoints,UT_sint32 x,UT_sint32 y);
00873     bool             m_bIsPortrait;
00874     bool             m_bSpawnedRedraw;
00875     UT_Rect          m_PendingExposeArea;
00876     UT_Rect          m_RecentExposeArea;
00877     bool             m_bExposePending;
00878     bool             m_bIsExposedAreaAccessed;
00879     bool             m_bDontRedraw;
00880     bool             m_bDoMerge;
00881 //
00882 // These hold the previous x and Y offset calculated from the scrolling code
00883 // in Logical units. We need them to avoid off by 1 errors in scrolling.
00884 //
00885     UT_sint32        m_iPrevYOffset;
00886     UT_sint32        m_iPrevXOffset;
00887     GR_Transform     m_Transform;
00888 
00889     typedef std::map<std::string, GR_Font*> FontCache;
00890     FontCache  m_hashFontCache;
00891 
00892     static UT_VersionInfo   s_Version;
00893     static UT_uint32        s_iInstanceCount;
00894     static UT_UCS4Char      s_cDefaultGlyph;
00895     UT_GenericVector<GR_Caret *>  m_vecCarets;
00896     AllCarets               m_AllCarets;
00897     bool                    m_bAntiAliasAlways;
00898 };
00899 
00900 #endif /* GR_GRAPHICS_H */

Generated on Wed May 22 2013 for AbiWord by  doxygen 1.7.1