51 #include <eikenv.h> |
51 #include <eikenv.h> |
52 #include <gdi.h> |
52 #include <gdi.h> |
53 |
53 |
54 QT_BEGIN_NAMESPACE |
54 QT_BEGIN_NAMESPACE |
55 |
55 |
56 QFontEngineS60Extensions::QFontEngineS60Extensions(CFont* fontOwner, COpenFont *font) |
56 QSymbianTypeFaceExtras::QSymbianTypeFaceExtras(CFont* fontOwner, COpenFont *font) |
57 : m_font(font) |
57 : m_font(font) |
58 , m_cmap(0) |
58 , m_cmap(0) |
59 , m_symbolCMap(false) |
59 , m_symbolCMap(false) |
60 , m_fontOwner(fontOwner) |
60 , m_fontOwner(fontOwner) |
61 { |
61 { |
62 TAny *shapingExtension = NULL; |
|
63 m_font->ExtendedInterface(KUidOpenFontShapingExtension, shapingExtension); |
|
64 m_shapingExtension = static_cast<MOpenFontShapingExtension*>(shapingExtension); |
|
65 TAny *trueTypeExtension = NULL; |
62 TAny *trueTypeExtension = NULL; |
66 m_font->ExtendedInterface(KUidOpenFontTrueTypeExtension, trueTypeExtension); |
63 m_font->ExtendedInterface(KUidOpenFontTrueTypeExtension, trueTypeExtension); |
67 m_trueTypeExtension = static_cast<MOpenFontTrueTypeExtension*>(trueTypeExtension); |
64 m_trueTypeExtension = static_cast<MOpenFontTrueTypeExtension*>(trueTypeExtension); |
68 Q_ASSERT(m_shapingExtension && m_trueTypeExtension); |
65 Q_ASSERT(m_trueTypeExtension); |
69 } |
66 } |
70 |
67 |
71 QByteArray QFontEngineS60Extensions::getSfntTable(uint tag) const |
68 QByteArray QSymbianTypeFaceExtras::getSfntTable(uint tag) const |
72 { |
69 { |
73 Q_ASSERT(m_trueTypeExtension->HasTrueTypeTable(tag)); |
70 Q_ASSERT(m_trueTypeExtension->HasTrueTypeTable(tag)); |
74 TInt error = KErrNone; |
71 TInt error = KErrNone; |
75 TInt tableByteLength = 0; |
72 TInt tableByteLength = 0; |
76 TAny *table = q_check_ptr(m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength)); |
73 TAny *table = q_check_ptr(m_trueTypeExtension->GetTrueTypeTable(error, tag, &tableByteLength)); |
77 QByteArray result(static_cast<const char*>(table), tableByteLength); |
74 QByteArray result(static_cast<const char*>(table), tableByteLength); |
78 m_trueTypeExtension->ReleaseTrueTypeTable(table); |
75 m_trueTypeExtension->ReleaseTrueTypeTable(table); |
79 return result; |
76 return result; |
80 } |
77 } |
81 |
78 |
82 bool QFontEngineS60Extensions::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
79 bool QSymbianTypeFaceExtras::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
83 { |
80 { |
84 if (!m_trueTypeExtension->HasTrueTypeTable(tag)) |
81 if (!m_trueTypeExtension->HasTrueTypeTable(tag)) |
85 return false; |
82 return false; |
86 |
83 |
87 bool result = true; |
84 bool result = true; |
102 |
99 |
103 m_trueTypeExtension->ReleaseTrueTypeTable(table); |
100 m_trueTypeExtension->ReleaseTrueTypeTable(table); |
104 return result; |
101 return result; |
105 } |
102 } |
106 |
103 |
107 const unsigned char *QFontEngineS60Extensions::cmap() const |
104 const unsigned char *QSymbianTypeFaceExtras::cmap() const |
108 { |
105 { |
109 if (!m_cmap) { |
106 if (!m_cmap) { |
110 m_cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p')); |
107 m_cmapTable = getSfntTable(MAKE_TAG('c', 'm', 'a', 'p')); |
111 int size = 0; |
108 int size = 0; |
112 m_cmap = QFontEngineS60::getCMap(reinterpret_cast<const uchar *>(m_cmapTable.constData()), m_cmapTable.size(), &m_symbolCMap, &size); |
109 m_cmap = QFontEngineS60::getCMap(reinterpret_cast<const uchar *>(m_cmapTable.constData()), m_cmapTable.size(), &m_symbolCMap, &size); |
113 } |
110 } |
114 return m_cmap; |
111 return m_cmap; |
115 } |
112 } |
116 |
113 |
117 QPainterPath QFontEngineS60Extensions::glyphOutline(glyph_t glyph) const |
114 CFont *QSymbianTypeFaceExtras::fontOwner() const |
118 { |
|
119 QPainterPath result; |
|
120 QPolygonF polygon; |
|
121 TInt glyphIndex = glyph; |
|
122 TInt pointNumber = 0; |
|
123 TInt x, y; |
|
124 while (m_shapingExtension->GlyphPointInFontUnits(glyphIndex, pointNumber++, x, y)) { |
|
125 const QPointF point(qreal(x) / 0xffff, qreal(y) / 0xffff); |
|
126 if (polygon.contains(point)) { |
|
127 result.addPolygon(polygon); |
|
128 result.closeSubpath(); |
|
129 polygon.clear(); |
|
130 } else { |
|
131 polygon.append(point); |
|
132 } |
|
133 } |
|
134 return result; |
|
135 } |
|
136 |
|
137 CFont *QFontEngineS60Extensions::fontOwner() const |
|
138 { |
115 { |
139 return m_fontOwner; |
116 return m_fontOwner; |
140 } |
117 } |
141 |
118 |
142 |
119 |
190 S60->screenDevice()->ReleaseFont(font); |
167 S60->screenDevice()->ReleaseFont(font); |
191 font = 0; |
168 font = 0; |
192 } |
169 } |
193 } |
170 } |
194 |
171 |
195 QFontEngineS60::QFontEngineS60(const QFontDef &request, const QFontEngineS60Extensions *extensions) |
172 QFontEngineS60::QFontEngineS60(const QFontDef &request, const QSymbianTypeFaceExtras *extras) |
196 : m_extensions(extensions) |
173 : m_extras(extras) |
197 , m_originalFont(0) |
174 , m_originalFont(0) |
198 , m_originalFontSizeInPixels((request.pixelSize >= 0)? |
175 , m_originalFontSizeInPixels((request.pixelSize >= 0)? |
199 request.pixelSize:pointsToPixels(request.pointSize)) |
176 request.pixelSize:pointsToPixels(request.pointSize)) |
200 , m_scaledFont(0) |
177 , m_scaledFont(0) |
201 , m_scaledFontSizeInPixels(0) |
178 , m_scaledFontSizeInPixels(0) |
218 *nglyphs = len; |
195 *nglyphs = len; |
219 return false; |
196 return false; |
220 } |
197 } |
221 |
198 |
222 HB_Glyph *g = glyphs->glyphs; |
199 HB_Glyph *g = glyphs->glyphs; |
223 const unsigned char* cmap = m_extensions->cmap(); |
200 const unsigned char* cmap = m_extras->cmap(); |
224 const bool isRtl = (flags & QTextEngine::RightToLeft); |
201 const bool isRtl = (flags & QTextEngine::RightToLeft); |
225 for (int i = 0; i < len; ++i) { |
202 for (int i = 0; i < len; ++i) { |
226 const unsigned int uc = getChar(characters, i, len); |
203 const unsigned int uc = getChar(characters, i, len); |
227 *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, |
204 *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, |
228 isRtl ? QChar::mirroredChar(uc) : uc); |
205 isRtl ? QChar::mirroredChar(uc) : uc); |
337 return "QFontEngineS60"; |
314 return "QFontEngineS60"; |
338 } |
315 } |
339 |
316 |
340 bool QFontEngineS60::canRender(const QChar *string, int len) |
317 bool QFontEngineS60::canRender(const QChar *string, int len) |
341 { |
318 { |
342 const unsigned char *cmap = m_extensions->cmap(); |
319 const unsigned char *cmap = m_extras->cmap(); |
343 for (int i = 0; i < len; ++i) { |
320 for (int i = 0; i < len; ++i) { |
344 const unsigned int uc = getChar(string, i, len); |
321 const unsigned int uc = getChar(string, i, len); |
345 if (QFontEngine::getTrueTypeGlyphIndex(cmap, uc) == 0) |
322 if (QFontEngine::getTrueTypeGlyphIndex(cmap, uc) == 0) |
346 return false; |
323 return false; |
347 } |
324 } |
348 return true; |
325 return true; |
349 } |
326 } |
350 |
327 |
351 QByteArray QFontEngineS60::getSfntTable(uint tag) const |
328 QByteArray QFontEngineS60::getSfntTable(uint tag) const |
352 { |
329 { |
353 return m_extensions->getSfntTable(tag); |
330 return m_extras->getSfntTable(tag); |
354 } |
331 } |
355 |
332 |
356 bool QFontEngineS60::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
333 bool QFontEngineS60::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
357 { |
334 { |
358 return m_extensions->getSfntTableData(tag, buffer, length); |
335 return m_extras->getSfntTableData(tag, buffer, length); |
359 } |
336 } |
360 |
337 |
361 QFontEngine::Type QFontEngineS60::type() const |
338 QFontEngine::Type QFontEngineS60::type() const |
362 { |
339 { |
363 return QFontEngine::S60FontEngine; |
340 return QFontEngine::S60FontEngine; |