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(); |
|
201 const bool isRtl = (flags & QTextEngine::RightToLeft); |
224 for (int i = 0; i < len; ++i) { |
202 for (int i = 0; i < len; ++i) { |
225 const unsigned int uc = getChar(characters, i, len); |
203 const unsigned int uc = getChar(characters, i, len); |
226 *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, uc); |
204 *g++ = QFontEngine::getTrueTypeGlyphIndex(cmap, |
|
205 isRtl ? QChar::mirroredChar(uc) : uc); |
227 } |
206 } |
228 |
207 |
229 glyphs->numGlyphs = g - glyphs->glyphs; |
208 glyphs->numGlyphs = g - glyphs->glyphs; |
230 *nglyphs = glyphs->numGlyphs; |
209 *nglyphs = glyphs->numGlyphs; |
231 |
210 |
239 void QFontEngineS60::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const |
218 void QFontEngineS60::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const |
240 { |
219 { |
241 Q_UNUSED(flags); |
220 Q_UNUSED(flags); |
242 for (int i = 0; i < glyphs->numGlyphs; i++) { |
221 for (int i = 0; i < glyphs->numGlyphs; i++) { |
243 const glyph_metrics_t bbox = boundingBox_const(glyphs->glyphs[i]); |
222 const glyph_metrics_t bbox = boundingBox_const(glyphs->glyphs[i]); |
244 glyphs->advances_x[i] = glyphs->offsets[i].x = bbox.xoff; |
223 glyphs->advances_x[i] = bbox.xoff; |
245 glyphs->advances_y[i] = glyphs->offsets[i].y = bbox.yoff; |
224 glyphs->advances_y[i] = bbox.yoff; |
246 } |
225 } |
247 } |
226 } |
248 |
227 |
249 QImage QFontEngineS60::alphaMapForGlyph(glyph_t glyph) |
228 QImage QFontEngineS60::alphaMapForGlyph(glyph_t glyph) |
250 { |
229 { |
335 return "QFontEngineS60"; |
314 return "QFontEngineS60"; |
336 } |
315 } |
337 |
316 |
338 bool QFontEngineS60::canRender(const QChar *string, int len) |
317 bool QFontEngineS60::canRender(const QChar *string, int len) |
339 { |
318 { |
340 const unsigned char *cmap = m_extensions->cmap(); |
319 const unsigned char *cmap = m_extras->cmap(); |
341 for (int i = 0; i < len; ++i) { |
320 for (int i = 0; i < len; ++i) { |
342 const unsigned int uc = getChar(string, i, len); |
321 const unsigned int uc = getChar(string, i, len); |
343 if (QFontEngine::getTrueTypeGlyphIndex(cmap, uc) == 0) |
322 if (QFontEngine::getTrueTypeGlyphIndex(cmap, uc) == 0) |
344 return false; |
323 return false; |
345 } |
324 } |
346 return true; |
325 return true; |
347 } |
326 } |
348 |
327 |
349 QByteArray QFontEngineS60::getSfntTable(uint tag) const |
328 QByteArray QFontEngineS60::getSfntTable(uint tag) const |
350 { |
329 { |
351 return m_extensions->getSfntTable(tag); |
330 return m_extras->getSfntTable(tag); |
352 } |
331 } |
353 |
332 |
354 bool QFontEngineS60::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
333 bool QFontEngineS60::getSfntTableData(uint tag, uchar *buffer, uint *length) const |
355 { |
334 { |
356 return m_extensions->getSfntTableData(tag, buffer, length); |
335 return m_extras->getSfntTableData(tag, buffer, length); |
357 } |
336 } |
358 |
337 |
359 QFontEngine::Type QFontEngineS60::type() const |
338 QFontEngine::Type QFontEngineS60::type() const |
360 { |
339 { |
361 return QFontEngine::S60FontEngine; |
340 return QFontEngine::S60FontEngine; |