00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GR_UNIX_PANGOGRAPHICS_H
00023 #define GR_UNIX_PANGOGRAPHICS_H
00024
00025 #ifdef HAVE_CONFIG_H
00026 #include "config.h"
00027 #endif
00028
00029 #include <vector>
00030
00031 #include "ut_types.h"
00032 #include "ut_color.h"
00033 #include "ut_string_class.h"
00034 #include "gr_RenderInfo.h"
00035
00036 #include <cairo.h>
00037 #include <pango/pango.h>
00038
00039
00040 #define GR_UNIXPANGO_BUILTIN
00041
00042 #ifndef GR_UNIXPANGO_BUILTIN
00043 #define PLUGIN_NAME "Cairo Pango graphics"
00044 #endif
00045
00046
00047
00048
00049 class GR_PangoRenderInfo;
00050 class GR_CairoGraphics;
00051 class XAP_Frame;
00052
00053 class GR_CairoPatternImpl
00054 : public UT_ColorPatImpl
00055 {
00056 public:
00057 GR_CairoPatternImpl(const char * fileName);
00058
00059 GR_CairoPatternImpl(cairo_surface_t * surf);
00060 GR_CairoPatternImpl(const GR_CairoPatternImpl &);
00061 virtual ~GR_CairoPatternImpl();
00062 virtual UT_ColorPatImpl * clone() const;
00063 cairo_pattern_t *getPattern() const
00064 {
00065 return m_pattern;
00066 }
00067 private:
00068 GR_CairoPatternImpl & operator=(const GR_CairoPatternImpl &);
00069 cairo_pattern_t *m_pattern;
00070 };
00071
00072
00073 class GR_CairoVectorImage
00074 : public GR_VectorImage
00075 {
00076 public:
00077 virtual void cairoSetSource(cairo_t *, double x, double y) = 0;
00078 };
00079
00081 class GR_CairoRasterImage
00082 : public GR_RasterImage
00083 {
00084 public:
00085 virtual GR_Image * createImageSegment(GR_Graphics * pG,const UT_Rect & rec);
00086 virtual void cairoSetSource(cairo_t *, double x, double y) = 0;
00087 protected:
00088
00089 virtual GR_CairoRasterImage *makeSubimage(const std::string & n,
00090 UT_sint32 x, UT_sint32 y,
00091 UT_sint32 w, UT_sint32 h) const = 0;
00092 };
00093
00094 class ABI_EXPORT GR_PangoFont : public GR_Font
00095 {
00096
00097 public:
00098 GR_PangoFont(const char * pDesc, double dSize,
00099 GR_CairoGraphics * pG,
00100 const char * pLang,
00101 bool bGuiFont = false);
00102
00103 virtual ~GR_PangoFont();
00104
00109 virtual UT_sint32 measureUnremappedCharForCache(UT_UCS4Char cChar) const;
00110 virtual bool doesGlyphExist(UT_UCS4Char g);
00111 virtual bool glyphBox(UT_UCS4Char g, UT_Rect & rec, GR_Graphics * pG);
00112 PangoFont * getPangoFont() const {return m_pf;}
00113 PangoFont * getPangoLayoutFont() const {return m_pLayoutF;}
00114
00115 void reloadFont(GR_CairoGraphics * pG);
00116 double getPointSize() const {return m_dPointSize;}
00117 UT_uint32 getZoom() const {return m_iZoom;}
00118 bool isGuiFont () const {return m_bGuiFont;}
00119 const UT_String & getDescription() const {return m_sDesc;}
00120
00121 virtual const char* getFamily() const;
00122 const PangoFontDescription * getPangoDescription() const {return m_pfdLay;}
00123
00124
00125 UT_uint32 getAscent() const {return m_iAscent;}
00126 UT_uint32 getDescent() const {return m_iDescent;}
00127
00128 PangoCoverage * getPangoCoverage() const;
00129 PangoLanguage * getPangoLanguage() const {return m_pPLang;}
00130 void setLanguage(const char * pLang);
00131 private:
00132 UT_String m_sDesc;
00133 UT_String m_sLayoutDesc;
00134 double m_dPointSize;
00135 UT_uint32 m_iZoom;
00136 PangoFont * m_pf;
00137 bool m_bGuiFont;
00138 mutable PangoCoverage *m_pCover;
00139 PangoFontDescription * m_pfdDev;
00140 PangoFontDescription * m_pfdLay;
00141 PangoLanguage * m_pPLang;
00142
00143 UT_uint32 m_iAscent;
00144 UT_uint32 m_iDescent;
00145 PangoFont * m_pLayoutF;
00146 };
00147
00148 class GR_PangoRenderInfo;
00149
00150
00151 class ABI_EXPORT GR_CairoAllocInfo
00152 : public GR_AllocInfo
00153 {
00154 public:
00155 GR_CairoAllocInfo(bool bPreview , bool bPrinter)
00156 : m_bPreview(bPreview),
00157 m_bPrinter(bPrinter)
00158 {
00159 }
00160 virtual GR_GraphicsId getType() const {return GRID_UNIX;}
00161 virtual bool isPrinterGraphics() const {return m_bPrinter;}
00162 virtual cairo_t *createCairo() = 0;
00163
00164 bool m_bPreview;
00165 bool m_bPrinter;
00166 };
00167
00168
00169 class ABI_EXPORT GR_CairoGraphics : public GR_Graphics
00170 {
00171 friend class GR_UnixImage;
00172
00173
00174
00175 public:
00176 virtual ~GR_CairoGraphics();
00177
00178 virtual GR_Capability getCapability() {return GRCAP_SCREEN_ONLY;}
00179
00180 virtual UT_sint32 measureUnRemappedChar(const UT_UCSChar c, UT_uint32 * height = 0);
00181
00182 virtual void drawChars(const UT_UCSChar* pChars,
00183 int iCharOffset, int iLength,
00184 UT_sint32 xoff, UT_sint32 yoff,
00185 int * pCharWidth);
00186
00187 virtual void drawGlyph(UT_uint32 glyph_idx,
00188 UT_sint32 xoff, UT_sint32 yoff);
00189
00190 virtual UT_uint32 measureString(const UT_UCSChar* s, int iOffset,
00191 int num, UT_GrowBufElement* pWidths, UT_uint32 * height = 0);
00192
00193 virtual GR_Font* getDefaultFont(UT_String& fontFamily,
00194 const char * pszLang);
00195
00196 virtual void setFont(const GR_Font *);
00197 virtual void clearFont(void) {m_pPFont = NULL;}
00198
00199 virtual void setZoomPercentage(UT_uint32 iZoom);
00200
00202
00203
00204 virtual bool itemize(UT_TextIterator & text, GR_Itemization & I);
00205 virtual bool shape(GR_ShapingInfo & si, GR_RenderInfo *& ri);
00206 virtual void prepareToRenderChars(GR_RenderInfo & ri);
00207 virtual void renderChars(GR_RenderInfo & ri);
00208 virtual void measureRenderedCharWidths(GR_RenderInfo & ri);
00209 virtual void appendRenderedCharsToBuff(GR_RenderInfo & ri, UT_GrowBuf & buf) const;
00210 virtual bool canBreak(GR_RenderInfo & ri, UT_sint32 &iNext, bool bAfter);
00211
00212 virtual bool needsSpecialCaretPositioning(GR_RenderInfo & ri);
00213 virtual UT_uint32 adjustCaretPosition(GR_RenderInfo & ri, bool bForward);
00214 virtual void adjustDeletePosition(GR_RenderInfo & ri);
00215 virtual bool nativeBreakInfoForRightEdge() {return false;}
00216
00217 virtual UT_sint32 resetJustification(GR_RenderInfo & ri, bool bPermanent);
00218 virtual UT_sint32 countJustificationPoints(const GR_RenderInfo & ri) const;
00219 virtual void justify(GR_RenderInfo & ri);
00220
00221 virtual UT_uint32 XYToPosition(const GR_RenderInfo & ri, UT_sint32 x, UT_sint32 y) const;
00222 virtual void positionToXY(const GR_RenderInfo & ri,
00223 UT_sint32& x, UT_sint32& y,
00224 UT_sint32& x2, UT_sint32& y2,
00225 UT_sint32& height, bool& bDirection) const;
00226 virtual UT_sint32 getTextWidth(GR_RenderInfo & ri);
00227
00228 virtual const UT_VersionInfo & getVersion() const {return s_Version;}
00229
00230 virtual void setColor(const UT_RGBColor& clr);
00231 virtual void getColor(UT_RGBColor &clr);
00232
00233 PangoFontMap * getFontMap() const {return m_pFontMap;}
00234 PangoContext * getContext() const {return m_pContext;}
00235 PangoFontMap * getLayoutFontMap() const {return m_pLayoutFontMap;}
00236 PangoContext * getLayoutContext() const {return m_pLayoutContext;}
00237
00238 virtual UT_uint32 getFontAscent();
00239 virtual UT_uint32 getFontDescent();
00240 virtual UT_uint32 getFontHeight();
00241
00242 virtual UT_uint32 getFontAscent(const GR_Font *);
00243 virtual UT_uint32 getFontDescent(const GR_Font *);
00244 virtual UT_uint32 getFontHeight(const GR_Font *);
00245
00246 virtual void fillRect(GR_Color3D c,
00247 UT_sint32 x, UT_sint32 y,
00248 UT_sint32 w, UT_sint32 h);
00249 virtual void fillRect(GR_Color3D c, UT_Rect &r);
00250 virtual void polygon(UT_RGBColor& c,UT_Point *pts,UT_uint32 nPoints);
00251 virtual void clearArea(UT_sint32, UT_sint32, UT_sint32, UT_sint32);
00252 virtual void drawImage(GR_Image* pImg, UT_sint32 xDest, UT_sint32 yDest);
00253 virtual void xorLine(UT_sint32, UT_sint32, UT_sint32, UT_sint32);
00254 virtual void polyLine(UT_Point * pts, UT_uint32 nPoints);
00255 virtual void fillRect(const UT_RGBColor& c,
00256 UT_sint32 x, UT_sint32 y,
00257 UT_sint32 w, UT_sint32 h);
00258 virtual void invertRect(const UT_Rect* pRect);
00259 virtual void drawLine(UT_sint32, UT_sint32, UT_sint32, UT_sint32);
00260
00261 bool isDingbat(void) const {return m_bIsDingbat;}
00262 bool isSymbol(void) const {return m_bIsSymbol;};
00263
00264 void resetFontMapResolution(void);
00265
00266 virtual GR_Font* _findFont(const char* pszFontFamily,
00267 const char* pszFontStyle,
00268 const char* pszFontVariant,
00269 const char* pszFontWeight,
00270 const char* pszFontStretch,
00271 const char* pszFontSize,
00272 const char* pszLang);
00273
00274 virtual void getCoverage(UT_NumberVector& coverage);
00275 virtual void setLineWidth(UT_sint32);
00276 virtual void setClipRect(const UT_Rect* pRect);
00277 virtual UT_uint32 getDeviceResolution(void) const;
00278 double getResolutionRatio(void) const { return 1.0;}
00279
00280 static const std::vector<std::string> & getAllFontNames(void);
00281 static UT_uint32 getAllFontCount();
00282 virtual GR_Font * getDefaultFont(GR_Font::FontFamilyEnum f = GR_Font::FF_Roman,
00283 const char * pszLang = NULL);
00284
00285 int dtpu(int d) const;
00286 int ptdu(int p) const;
00287 int ptlu(int p) const;
00288 int ptlunz(int p) const;
00289 int ltpu(int l) const;
00290 int ltpunz(int l) const;
00291 int pftlu(int pf) const;
00292
00293 virtual bool queryProperties(GR_Graphics::Properties gp) const;
00294
00295
00296
00297
00298
00299
00300 virtual bool startPrint(void);
00301 virtual bool endPrint(void);
00302 virtual bool startPage(const char * szPageLabel,
00303 UT_uint32 pageNumber,
00304 bool bPortrait,
00305 UT_uint32 iWidth, UT_uint32 iHeight);
00306
00307 virtual void setColorSpace(GR_Graphics::ColorSpace c);
00308 virtual GR_Graphics::ColorSpace getColorSpace(void) const;
00309
00310
00311 virtual GR_Graphics::Cursor getCursor(void) const;
00312
00313 virtual void setColor3D(GR_Color3D c);
00314 virtual bool getColor3D(GR_Color3D name, UT_RGBColor &color);
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 virtual void setLineProperties(double inWidth,
00326 GR_Graphics::JoinStyle inJoinStyle = JOIN_MITER,
00327 GR_Graphics::CapStyle inCapStyle = CAP_BUTT,
00328 GR_Graphics::LineStyle inLineStyle = LINE_SOLID);
00329 cairo_t* getCairo () {return m_cr;}
00330
00331 static UT_uint32 getDefaultDeviceResolution();
00332
00333 protected:
00334
00335 void _setProps();
00336 virtual void _resetClip(void);
00337
00338
00339 static cairo_surface_t * _getCairoSurfaceFromContext(cairo_t *cr,
00340 const cairo_rectangle_t & rect);
00341 static void _setSource(cairo_t *, const UT_RGBColor &);
00342
00343
00344 GR_CairoGraphics(cairo_t *cr, UT_uint32 iDeviceResolution);
00345 GR_CairoGraphics();
00346 inline bool _scriptBreak(GR_PangoRenderInfo &ri);
00347
00348 void _scaleCharacterMetrics(GR_PangoRenderInfo & RI);
00349 void _scaleJustification(GR_PangoRenderInfo & RI);
00350
00351 inline UT_uint32 _measureExtent (PangoGlyphString * pg,
00352 PangoFont * pf,
00353 UT_BidiCharType iDir,
00354 const char * pUtf8,
00355 int * & pLogOffsets,
00356 UT_sint32 & iStart,
00357 UT_sint32 & iEnd);
00358
00359 inline int * _calculateLogicalOffsets (PangoGlyphString * pGlyphs,
00360 UT_BidiCharType iVisDir,
00361 const char * pUtf8);
00362
00363 void _setIsSymbol(bool b) {m_bIsSymbol = b;}
00364 void _setIsDingbat(bool b) {m_bIsDingbat = b;}
00365
00366 PangoFont * _adjustedPangoFont (GR_PangoFont * pFont, PangoFont * pf);
00367 PangoFont * _adjustedLayoutPangoFont (GR_PangoFont * pFont, PangoFont * pf);
00368
00369 double _tdudX(UT_sint32 layoutUnits) const;
00370 double _tdudY(UT_sint32 layoutUnits) const;
00371
00372 PangoFontMap * m_pFontMap;
00373 PangoContext * m_pContext;
00374 PangoFontMap * m_pLayoutFontMap;
00375 PangoContext * m_pLayoutContext;
00376 GR_PangoFont* m_pPFont;
00377 GR_PangoFont* m_pPFontGUI;
00378
00379 PangoFont * m_pAdjustedPangoFont;
00380 PangoFont * m_pAdjustedLayoutPangoFont;
00381 GR_PangoFont* m_pAdjustedPangoFontSource;
00382 UT_uint32 m_iAdjustedPangoFontZoom;
00383
00384 UT_uint32 m_iDeviceResolution;
00385
00386 cairo_t * m_cr;
00387
00388 GR_Graphics::Cursor m_cursor;
00389 GR_Graphics::ColorSpace m_cs;
00390
00391 UT_RGBColor m_3dColors[COUNT_3D_COLORS];
00392
00393 UT_RGBColor m_curColor;
00394 bool m_curColorDirty;
00395 bool m_clipRectDirty;
00396 double m_lineWidth;
00397 GR_Graphics::JoinStyle m_joinStyle;
00398 GR_Graphics::CapStyle m_capStyle;
00399 GR_Graphics::LineStyle m_lineStyle;
00400 bool m_linePropsDirty;
00401 bool m_bIsSymbol;
00402 bool m_bIsDingbat;
00403 UT_sint32 m_iPrevX1;
00404 UT_sint32 m_iPrevX2;
00405 UT_sint32 m_iPrevY1;
00406 UT_sint32 m_iPrevY2;
00407 UT_uint32 m_iPrevRect;
00408 UT_sint32 m_iXORCount;
00410 void _initCairo();
00411 private:
00412 static UT_uint32 s_iInstanceCount;
00413 static UT_VersionInfo s_Version;
00414 static int s_iMaxScript;
00416 void _initPango();
00417 };
00418
00419
00420 #endif