1
/****************************************************************************
2
**
3
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4
** All rights reserved.
5
** Contact: Nokia Corporation (qt-info@nokia.com)
6
**
7
** This file is part of the test suite of the Qt Toolkit.
8
**
9
** $QT_BEGIN_LICENSE:LGPL$
10
** GNU Lesser General Public License Usage
11
** This file may be used under the terms of the GNU Lesser General Public
12
** License version 2.1 as published by the Free Software Foundation and
13
** appearing in the file LICENSE.LGPL included in the packaging of this
14
** file. Please review the following information to ensure the GNU Lesser
15
** General Public License version 2.1 requirements will be met:
16
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17
**
18
** In addition, as a special exception, Nokia gives you certain additional
19
** rights. These rights are described in the Nokia Qt LGPL Exception
20
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21
**
22
** GNU General Public License Usage
23
** Alternatively, this file may be used under the terms of the GNU General
24
** Public License version 3.0 as published by the Free Software Foundation
25
** and appearing in the file LICENSE.GPL included in the packaging of this
26
** file. Please review the following information to ensure the GNU General
27
** Public License version 3.0 requirements will be met:
28
** http://www.gnu.org/copyleft/gpl.html.
29
**
30
** Other Usage
31
** Alternatively, this file may be used in accordance with the terms and
32
** conditions contained in a signed written agreement between you and Nokia.
33
**
34
**
35
**
36
**
37
**
38
** $QT_END_LICENSE$
39
**
40
****************************************************************************/
41
42
#ifndef QSTATICTEXT_P_H
43
#define QSTATICTEXT_P_H
44
45
//
46
//  W A R N I N G
47
//  -------------
48
//
49
// This file is not part of the Qt API.  It exists for the convenience
50
// of internal files.  This header file may change from version to version
51
// without notice, or even be removed.
52
//
53
// We mean it.
54
//
55
56
#include "qstatictext.h"
57
58
#include <private/qtextureglyphcache_p.h>
59
#include <QtGui/qcolor.h>
60
61
QT_BEGIN_NAMESPACE
62
63
class QStaticTextUserData
64
{
65
public:
66
    enum Type {
67
        NoUserData,
68
        OpenGLUserData
69
    };
70
71
    QStaticTextUserData(Type t) : type(t) { ref = 0; }
72
    virtual ~QStaticTextUserData() {}
73
74
    QAtomicInt ref;
75
    Type type;
76
};
77
78
class Q_GUI_EXPORT QStaticTextItem
79
{
80
public:    
81
    QStaticTextItem() : chars(0), numChars(0), useBackendOptimizations(false),
82
                        userDataNeedsUpdate(0), m_fontEngine(0), m_userData(0) {}
83
84
    QStaticTextItem(const QStaticTextItem &other)
85
    {
86
        operator=(other);
87
    }
88
89
    void operator=(const QStaticTextItem &other)
90
    {
91
        glyphPositions = other.glyphPositions;
92
        glyphs = other.glyphs;
93
        chars = other.chars;
94
        numGlyphs = other.numGlyphs;
95
        numChars = other.numChars;
96
        font = other.font;
97
        color = other.color;
98
        useBackendOptimizations = other.useBackendOptimizations;
99
        userDataNeedsUpdate = other.userDataNeedsUpdate;
100
101
        m_fontEngine = 0;
102
        m_userData = 0;
103
        setUserData(other.userData());
104
        setFontEngine(other.fontEngine());
105
    }
106
107
    ~QStaticTextItem();
108
109
    void setUserData(QStaticTextUserData *newUserData)
110
    {
111
        if (m_userData == newUserData)
112
            return;
113
114
        if (m_userData != 0 && !m_userData->ref.deref())
115
            delete m_userData;
116
117
        m_userData = newUserData;
118
        if (m_userData != 0)
119
            m_userData->ref.ref();
120
    }
121
    QStaticTextUserData *userData() const { return m_userData; }
122
123
    void setFontEngine(QFontEngine *fe);
124
    QFontEngine *fontEngine() const { return m_fontEngine; }
125
126
    union {
127
        QFixedPoint *glyphPositions;             // 8 bytes per glyph
128
        int positionOffset;
129
    };
130
    union {
131
        glyph_t *glyphs;                         // 4 bytes per glyph
132
        int glyphOffset;
133
    };
134
    union {
135
        QChar *chars;                            // 2 bytes per glyph
136
        int charOffset;
137
    };
138
                                                 // =================
139
                                                 // 14 bytes per glyph
140
141
                                                 // 12 bytes for pointers
142
    int numGlyphs;                               // 4 bytes per item
143
    int numChars;                                // 4 bytes per item
144
    QFont font;                                  // 8 bytes per item
145
    QColor color;                                // 10 bytes per item
146
    char useBackendOptimizations : 1;            // 1 byte per item
147
    char userDataNeedsUpdate : 1;                //
148
                                                 // ================
149
                                                 // 51 bytes per item
150
151
private: // Needs special handling in setters, so private to avoid abuse
152
    QFontEngine *m_fontEngine;                     // 4 bytes per item
153
    QStaticTextUserData *m_userData;               // 8 bytes per item
154
155
};
156
157
class QStaticText;
158
class Q_AUTOTEST_EXPORT QStaticTextPrivate
159
{
160
public:
161
    QStaticTextPrivate();
162
    QStaticTextPrivate(const QStaticTextPrivate &other);
163
    ~QStaticTextPrivate();
164
165
    void init();
166
    void paintText(const QPointF &pos, QPainter *p);
167
168
    void invalidate()
169
    {
170
        needsRelayout = true;
171
    }
172
173
    QAtomicInt ref;                      // 4 bytes per text
174
175
    QString text;                        // 4 bytes per text
176
    QFont font;                          // 8 bytes per text
177
    qreal textWidth;                     // 8 bytes per text
178
    QSizeF actualSize;                   // 16 bytes per text
179
    QPointF position;                    // 16 bytes per text
180
181
    QTransform matrix;                   // 80 bytes per text
182
    QStaticTextItem *items;              // 4 bytes per text
183
    int itemCount;                       // 4 bytes per text
184
185
    glyph_t *glyphPool;                  // 4 bytes per text
186
    QFixedPoint *positionPool;           // 4 bytes per text
187
    QChar *charPool;                     // 4 bytes per text
188
189
    QTextOption textOption;              // 28 bytes per text
190
191
    unsigned char needsRelayout            : 1; // 1 byte per text
192
    unsigned char useBackendOptimizations  : 1;
193
    unsigned char textFormat               : 2;
194
    unsigned char untransformedCoordinates : 1;
195
                                         // ================
196
                                         // 195 bytes per text
197
198
    static QStaticTextPrivate *get(const QStaticText *q);
199
};
200
201
QT_END_NAMESPACE
202
203
#endif // QSTATICTEXT_P_H