qpaintengine.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:11k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtGui module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QPAINTENGINE_H
  38. #define QPAINTENGINE_H
  39. #include <QtCore/qnamespace.h>
  40. #include <QtCore/qobjectdefs.h>
  41. #include <QtGui/qpainter.h>
  42. QT_BEGIN_HEADER
  43. QT_BEGIN_NAMESPACE
  44. QT_MODULE(Gui)
  45. class QFontEngine;
  46. class QLineF;
  47. class QPaintDevice;
  48. class QPaintEnginePrivate;
  49. class QPainterPath;
  50. class QPointF;
  51. class QPolygonF;
  52. class QRectF;
  53. struct QGlyphLayout;
  54. class QTextItemInt;
  55. class QPaintEngineState;
  56. class Q_GUI_EXPORT QTextItem {
  57. public:
  58.     enum RenderFlag {
  59.         RightToLeft = 0x1,
  60.         Overline = 0x10,
  61.         Underline = 0x20,
  62.         StrikeOut = 0x40,
  63.         Dummy = 0xffffffff
  64.     };
  65.     Q_DECLARE_FLAGS(RenderFlags, RenderFlag)
  66.     qreal descent() const;
  67.     qreal ascent() const;
  68.     qreal width() const;
  69.     RenderFlags renderFlags() const;
  70.     QString text() const;
  71.     QFont font() const;
  72. };
  73. Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE);
  74. class Q_GUI_EXPORT QPaintEngine
  75. {
  76.     Q_DECLARE_PRIVATE(QPaintEngine)
  77. public:
  78.     enum PaintEngineFeature {
  79.         PrimitiveTransform          = 0x00000001, // Can transform primitives brushes
  80.         PatternTransform            = 0x00000002, // Can transform pattern brushes
  81.         PixmapTransform             = 0x00000004, // Can transform pixmaps
  82.         PatternBrush                = 0x00000008, // Can fill with pixmaps and standard patterns
  83.         LinearGradientFill          = 0x00000010, // Can fill gradient areas
  84.         RadialGradientFill          = 0x00000020, // Can render radial gradients
  85.         ConicalGradientFill         = 0x00000040, // Can render conical gradients
  86.         AlphaBlend                  = 0x00000080, // Can do source over alpha blend
  87.         PorterDuff                  = 0x00000100, // Can do general porter duff compositions
  88.         PainterPaths                = 0x00000200, // Can fill, outline and clip paths
  89.         Antialiasing                = 0x00000400, // Can antialias lines
  90.         BrushStroke                 = 0x00000800, // Can render brush based pens
  91.         ConstantOpacity             = 0x00001000, // Can render at constant opacity
  92.         MaskedBrush                 = 0x00002000, // Can fill with textures that has an alpha channel or mask
  93.         PerspectiveTransform        = 0x00004000, // Can do perspective transformations
  94.         BlendModes                  = 0x00008000, // Can do extended Porter&Duff composition
  95.         ObjectBoundingModeGradients = 0x00010000, // Can do object bounding mode gradients
  96.         PaintOutsidePaintEvent      = 0x20000000, // Engine is capable of painting outside paint events
  97.         /*                          0x10000000, // Used for emulating
  98.                                     QGradient::StretchToDevice,
  99.                                     defined in qpainter.cpp
  100.                                     0x40000000, // Used internally for emulating opaque backgrounds
  101.         */
  102.         AllFeatures               = 0xffffffff  // For convenience
  103.     };
  104.     Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature)
  105.     enum DirtyFlag {
  106.         DirtyPen                = 0x0001,
  107.         DirtyBrush              = 0x0002,
  108.         DirtyBrushOrigin        = 0x0004,
  109.         DirtyFont               = 0x0008,
  110.         DirtyBackground         = 0x0010,
  111.         DirtyBackgroundMode     = 0x0020,
  112.         DirtyTransform          = 0x0040,
  113.         DirtyClipRegion         = 0x0080,
  114.         DirtyClipPath           = 0x0100,
  115.         DirtyHints              = 0x0200,
  116.         DirtyCompositionMode    = 0x0400,
  117.         DirtyClipEnabled        = 0x0800,
  118.         DirtyOpacity            = 0x1000,
  119.         AllDirty                = 0xffff
  120.     };
  121.     Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
  122.     enum PolygonDrawMode {
  123.         OddEvenMode,
  124.         WindingMode,
  125.         ConvexMode,
  126.         PolylineMode
  127.     };
  128.     explicit QPaintEngine(PaintEngineFeatures features=0);
  129.     virtual ~QPaintEngine();
  130.     bool isActive() const { return active; }
  131.     void setActive(bool newState) { active = newState; }
  132.     virtual bool begin(QPaintDevice *pdev) = 0;
  133.     virtual bool end() = 0;
  134.     virtual void updateState(const QPaintEngineState &state) = 0;
  135.     virtual void drawRects(const QRect *rects, int rectCount);
  136.     virtual void drawRects(const QRectF *rects, int rectCount);
  137.     virtual void drawLines(const QLine *lines, int lineCount);
  138.     virtual void drawLines(const QLineF *lines, int lineCount);
  139.     virtual void drawEllipse(const QRectF &r);
  140.     virtual void drawEllipse(const QRect &r);
  141.     virtual void drawPath(const QPainterPath &path);
  142.     virtual void drawPoints(const QPointF *points, int pointCount);
  143.     virtual void drawPoints(const QPoint *points, int pointCount);
  144.     virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
  145.     virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
  146.     virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) = 0;
  147.     virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);
  148.     virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
  149.     virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
  150.                            Qt::ImageConversionFlags flags = Qt::AutoColor);
  151.     void setPaintDevice(QPaintDevice *device);
  152.     QPaintDevice *paintDevice() const;
  153.     void setSystemClip(const QRegion &baseClip);
  154.     QRegion systemClip() const;
  155.     void setSystemRect(const QRect &rect);
  156.     QRect systemRect() const;
  157. #ifdef Q_WS_WIN
  158.     virtual HDC getDC() const;
  159.     virtual void releaseDC(HDC hdc) const;
  160. #endif
  161.     virtual QPoint coordinateOffset() const;
  162.     enum Type {
  163.         X11,
  164.         Windows,
  165.         QuickDraw, CoreGraphics, MacPrinter,
  166.         QWindowSystem,
  167.         PostScript,
  168.         OpenGL,
  169.         Picture,
  170.         SVG,
  171.         Raster,
  172.         Direct3D,
  173.         Pdf,
  174.         User = 50,    // first user type id
  175.         MaxUser = 100 // last user type id
  176.     };
  177.     virtual Type type() const = 0;
  178.     inline void fix_neg_rect(int *x, int *y, int *w, int *h);
  179.     inline bool testDirty(DirtyFlags df);
  180.     inline void setDirty(DirtyFlags df);
  181.     inline void clearDirty(DirtyFlags df);
  182.     bool hasFeature(PaintEngineFeatures feature) const { return (gccaps & feature) != 0; }
  183.     QPainter *painter() const;
  184.     inline void syncState() { Q_ASSERT(state); updateState(*state); }
  185. protected:
  186.     QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=0);
  187.     QPaintEngineState *state;
  188.     PaintEngineFeatures gccaps;
  189.     uint active : 1;
  190.     uint selfDestruct : 1;
  191.     QPaintEnginePrivate *d_ptr;
  192. private:
  193.     void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }
  194.     bool autoDestruct() const { return selfDestruct; }
  195.     Q_DISABLE_COPY(QPaintEngine)
  196.     friend class QFontEngineBox;
  197.     friend class QFontEngineMac;
  198.     friend class QFontEngineWin;
  199. #ifndef QT_NO_FREETYPE
  200.     friend class QFontEngineFT;
  201. #endif
  202. #ifndef QT_NO_QWS_QPF
  203.     friend class QFontEngineQPF1;
  204.     friend class QFontEngineQPF;
  205. #endif
  206.     friend class QPSPrintEngine;
  207.     friend class QMacPrintEngine;
  208.     friend class QMacPrintEnginePrivate;
  209. #ifdef Q_WS_QWS
  210.     friend class QtopiaPrintEngine;
  211.     friend class QtopiaPrintEnginePrivate;
  212.     friend class QProxyFontEngine;
  213. #endif
  214.     friend class QPainter;
  215.     friend class QPainterPrivate;
  216.     friend class QWidget;
  217.     friend class QWidgetPrivate;
  218.     friend class QWin32PaintEngine;
  219.     friend class QWin32PaintEnginePrivate;
  220.     friend class QMacCGContext;
  221.     friend class QPreviewPaintEngine;
  222. };
  223. class Q_GUI_EXPORT QPaintEngineState
  224. {
  225. public:
  226.     QPaintEngine::DirtyFlags state() const { return dirtyFlags; }
  227.     QPen pen() const;
  228.     QBrush brush() const;
  229.     QPointF brushOrigin() const;
  230.     QBrush backgroundBrush() const;
  231.     Qt::BGMode backgroundMode() const;
  232.     QFont font() const;
  233.     QMatrix matrix() const;
  234.     QTransform transform() const;
  235.     Qt::ClipOperation clipOperation() const;
  236.     QRegion clipRegion() const;
  237.     QPainterPath clipPath() const;
  238.     bool isClipEnabled() const;
  239.     QPainter::RenderHints renderHints() const;
  240.     QPainter::CompositionMode compositionMode() const;
  241.     qreal opacity() const;
  242.     QPainter *painter() const;
  243.     bool brushNeedsResolving() const;
  244.     bool penNeedsResolving() const;
  245. protected:
  246.     friend class QPaintEngine;
  247.     friend class QWidget;
  248.     friend class QPainter;
  249.     friend class QPainterPrivate;
  250.     friend class QMacPrintEnginePrivate;
  251.     QPaintEngine::DirtyFlags dirtyFlags;
  252. };
  253. //
  254. // inline functions
  255. //
  256. inline void QPaintEngine::fix_neg_rect(int *x, int *y, int *w, int *h)
  257. {
  258.     if (*w < 0) {
  259.         *w = -*w;
  260.         *x -= *w - 1;
  261.     }
  262.     if (*h < 0) {
  263.         *h = -*h;
  264.         *y -= *h - 1;
  265.     }
  266. }
  267. inline bool QPaintEngine::testDirty(DirtyFlags df) {
  268.     Q_ASSERT(state);
  269.     return ((state->dirtyFlags & df) != 0);
  270. }
  271. inline void QPaintEngine::setDirty(DirtyFlags df) {
  272.     Q_ASSERT(state);
  273.     state->dirtyFlags |= df;
  274. }
  275. inline void QPaintEngine::clearDirty(DirtyFlags df)
  276. {
  277.     Q_ASSERT(state);
  278.     state->dirtyFlags &= ~static_cast<uint>(df);
  279. }
  280. Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags)
  281. Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures)
  282. Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags)
  283. QT_END_NAMESPACE
  284. QT_END_HEADER
  285. #endif // QPAINTENGINE_H