src/gui/text/qfontengine_s60.cpp
changeset 25 e24348a560a6
parent 23 89e065397ea6
child 29 b72c6db6890b
equal deleted inserted replaced
23:89e065397ea6 25:e24348a560a6
    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;