src/gui/text/qabstractfontengine_qws.cpp
changeset 0 1918ee327afb
child 4 3b1da2848fc7
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 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 QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qabstractfontengine_qws.h"
       
    43 #include "qabstractfontengine_p.h"
       
    44 
       
    45 #include <private/qtextengine_p.h>
       
    46 #include <private/qpaintengine_raster_p.h>
       
    47 
       
    48 #include <qmath.h>
       
    49 
       
    50 QT_BEGIN_NAMESPACE
       
    51 
       
    52 class QFontEngineInfoPrivate
       
    53 {
       
    54 public:
       
    55     inline QFontEngineInfoPrivate()
       
    56         : pixelSize(0), weight(QFont::Normal), style(QFont::StyleNormal)
       
    57     {}
       
    58 
       
    59     QString family;
       
    60     qreal pixelSize;
       
    61     int weight;
       
    62     QFont::Style style;
       
    63     QList<QFontDatabase::WritingSystem> writingSystems;
       
    64 };
       
    65 
       
    66 /*!
       
    67     \class QFontEngineInfo
       
    68     \preliminary
       
    69     \brief The QFontEngineInfo class describes a specific font provided by a font engine plugin.
       
    70     \since 4.3
       
    71     \ingroup qws
       
    72 
       
    73     \tableofcontents
       
    74 
       
    75     QFontEngineInfo is used to describe a request of a font to a font engine plugin as well as to
       
    76     describe the actual fonts a plugin provides.
       
    77 
       
    78     \sa QAbstractFontEngine, QFontEnginePlugin
       
    79 */
       
    80 
       
    81 /*!
       
    82    Constructs a new empty QFontEngineInfo.
       
    83 */
       
    84 QFontEngineInfo::QFontEngineInfo()
       
    85 {
       
    86     d = new QFontEngineInfoPrivate;
       
    87 }
       
    88 
       
    89 /*!
       
    90    Constructs a new QFontEngineInfo with the specified \a family.
       
    91    The resulting object represents a freely scalable font with normal
       
    92    weight and style.
       
    93 */
       
    94 QFontEngineInfo::QFontEngineInfo(const QString &family)
       
    95 {
       
    96     d = new QFontEngineInfoPrivate;
       
    97     d->family = family;
       
    98 }
       
    99 
       
   100 /*!
       
   101    Creates a new font engine info object with the same attributes as \a other.
       
   102 */
       
   103 QFontEngineInfo::QFontEngineInfo(const QFontEngineInfo &other)
       
   104     : d(new QFontEngineInfoPrivate(*other.d))
       
   105 {
       
   106 }
       
   107 
       
   108 /*!
       
   109    Assigns \a other to this font engine info object, and returns a reference
       
   110    to this.
       
   111 */
       
   112 QFontEngineInfo &QFontEngineInfo::operator=(const QFontEngineInfo &other)
       
   113 {
       
   114     *d = *other.d;
       
   115     return *this;
       
   116 }
       
   117 
       
   118 /*!
       
   119    Destroys this QFontEngineInfo object.
       
   120 */
       
   121 QFontEngineInfo::~QFontEngineInfo()
       
   122 {
       
   123     delete d;
       
   124 }
       
   125 
       
   126 /*!
       
   127    \property QFontEngineInfo::family
       
   128    the family name of the font
       
   129 */
       
   130 
       
   131 void QFontEngineInfo::setFamily(const QString &family)
       
   132 {
       
   133     d->family = family;
       
   134 }
       
   135 
       
   136 QString QFontEngineInfo::family() const
       
   137 {
       
   138     return d->family;
       
   139 }
       
   140 
       
   141 /*!
       
   142    \property QFontEngineInfo::pixelSize
       
   143    the pixel size of the font
       
   144 
       
   145    A pixel size of 0 represents a freely scalable font.
       
   146 */
       
   147 
       
   148 void QFontEngineInfo::setPixelSize(qreal size)
       
   149 {
       
   150     d->pixelSize = size;
       
   151 }
       
   152 
       
   153 qreal QFontEngineInfo::pixelSize() const
       
   154 {
       
   155     return d->pixelSize;
       
   156 }
       
   157 
       
   158 /*!
       
   159    \property QFontEngineInfo::weight
       
   160    the weight of the font
       
   161 
       
   162    The value should be from the \l{QFont::Weight} enumeration.
       
   163 */
       
   164 
       
   165 void QFontEngineInfo::setWeight(int weight)
       
   166 {
       
   167     d->weight = weight;
       
   168 }
       
   169 
       
   170 int QFontEngineInfo::weight() const
       
   171 {
       
   172     return d->weight;
       
   173 }
       
   174 
       
   175 /*!
       
   176    \property QFontEngineInfo::style
       
   177    the style of the font
       
   178 */
       
   179 
       
   180 void QFontEngineInfo::setStyle(QFont::Style style)
       
   181 {
       
   182     d->style = style;
       
   183 }
       
   184 
       
   185 QFont::Style QFontEngineInfo::style() const
       
   186 {
       
   187     return d->style;
       
   188 }
       
   189 
       
   190 /*!
       
   191    \property QFontEngineInfo::writingSystems
       
   192    the writing systems supported by the font
       
   193 
       
   194    An empty list means that any writing system is supported.
       
   195 */
       
   196 
       
   197 QList<QFontDatabase::WritingSystem> QFontEngineInfo::writingSystems() const
       
   198 {
       
   199     return d->writingSystems;
       
   200 }
       
   201 
       
   202 void QFontEngineInfo::setWritingSystems(const QList<QFontDatabase::WritingSystem> &writingSystems)
       
   203 {
       
   204     d->writingSystems = writingSystems;
       
   205 }
       
   206 
       
   207 class QFontEnginePluginPrivate : public QObjectPrivate
       
   208 {
       
   209     Q_DECLARE_PUBLIC(QFontEnginePlugin)
       
   210 
       
   211     QString foundry;
       
   212 };
       
   213 
       
   214 /*!
       
   215     \class QFontEnginePlugin
       
   216     \preliminary
       
   217     \brief The QFontEnginePlugin class is the base class for font engine factory plugins in Qt for Embedded Linux.
       
   218     \since 4.3
       
   219     \ingroup qws
       
   220     \ingroup plugins
       
   221 
       
   222     \tableofcontents
       
   223 
       
   224     QFontEnginePlugin is provided by font engine plugins to create
       
   225     instances of subclasses of QAbstractFontEngine.
       
   226 
       
   227     The member functions create() and availableFontEngines() must be
       
   228     implemented.
       
   229 
       
   230     \sa QAbstractFontEngine, QFontEngineInfo
       
   231 */
       
   232 
       
   233 /*!
       
   234   Creates a font engine plugin that creates font engines with the
       
   235   specified \a foundry and \a parent.
       
   236 */
       
   237 QFontEnginePlugin::QFontEnginePlugin(const QString &foundry, QObject *parent)
       
   238     : QObject(*new QFontEnginePluginPrivate, parent)
       
   239 {
       
   240     Q_D(QFontEnginePlugin);
       
   241     d->foundry = foundry;
       
   242 }
       
   243 
       
   244 /*!
       
   245    Destroys this font engine plugin.
       
   246 */
       
   247 QFontEnginePlugin::~QFontEnginePlugin()
       
   248 {
       
   249 }
       
   250 
       
   251 /*!
       
   252    Returns a list of foundries the font engine plugin provides.
       
   253    The default implementation returns the foundry specified with the constructor.
       
   254 */
       
   255 QStringList QFontEnginePlugin::keys() const
       
   256 {
       
   257     Q_D(const QFontEnginePlugin);
       
   258     return QStringList(d->foundry);
       
   259 }
       
   260 
       
   261 /*!
       
   262     \fn QAbstractFontEngine *QFontEnginePlugin::create(const QFontEngineInfo &info)
       
   263 
       
   264     Implemented in subclasses to create a new font engine that provides a font that
       
   265     matches \a info.
       
   266 */
       
   267 
       
   268 /*!
       
   269     \fn QList<QFontEngineInfo> QFontEnginePlugin::availableFontEngines() const
       
   270 
       
   271     Implemented in subclasses to return a list of QFontEngineInfo objects that represents all font
       
   272     engines the plugin can create.
       
   273 */
       
   274 
       
   275 class QAbstractFontEnginePrivate : public QObjectPrivate
       
   276 {
       
   277     Q_DECLARE_PUBLIC(QAbstractFontEngine)
       
   278 public:
       
   279 };
       
   280 
       
   281 //The <classname> class is|provides|contains|specifies...
       
   282 /*!
       
   283     \class QAbstractFontEngine
       
   284     \preliminary
       
   285     \brief The QAbstractFontEngine class is the base class for font engine plugins in Qt for Embedded Linux.
       
   286     \since 4.3
       
   287     \ingroup qws
       
   288 
       
   289     \tableofcontents
       
   290 
       
   291     QAbstractFontEngine is implemented by font engine plugins through QFontEnginePlugin.
       
   292 
       
   293     \sa QFontEnginePlugin, QFontEngineInfo
       
   294 */
       
   295 
       
   296 /*!
       
   297    \enum QAbstractFontEngine::Capability
       
   298 
       
   299    This enum describes the capabilities of a font engine.
       
   300 
       
   301    \value CanRenderGlyphs_Gray The font engine can render individual glyphs into 8 bpp images.
       
   302    \value CanRenderGlyphs_Mono The font engine can render individual glyphs into 1 bpp images.
       
   303    \value CanRenderGlyphs The font engine can render individual glyphs into images.
       
   304    \value CanOutlineGlyphs The font engine can convert glyphs to painter paths.
       
   305 */
       
   306 
       
   307 /*!
       
   308    \enum QAbstractFontEngine::FontProperty
       
   309 
       
   310    This enum describes the properties of a font provided by a font engine.
       
   311 
       
   312    \value Ascent The ascent of the font, specified as a 26.6 fixed point value.
       
   313    \value Descent The descent of the font, specified as a 26.6 fixed point value.
       
   314    \value Leading The leading of the font, specified as a 26.6 fixed point value.
       
   315    \value XHeight The 'x' height of the font, specified as a 26.6 fixed point value.
       
   316    \value AverageCharWidth The average character width of the font, specified as a 26.6 fixed point value.
       
   317    \value LineThickness The thickness of the underline and strikeout lines for the font, specified as a 26.6 fixed point value.
       
   318    \value UnderlinePosition The distance from the base line to the underline position for the font, specified as a 26.6 fixed point value.
       
   319    \value MaxCharWidth The width of the widest character in the font, specified as a 26.6 fixed point value.
       
   320    \value MinLeftBearing The minimum left bearing of the font, specified as a 26.6 fixed point value.
       
   321    \value MinRightBearing The maximum right bearing of the font, specified as a 26.6 fixed point value.
       
   322    \value GlyphCount The number of glyphs in the font, specified as an integer value.
       
   323    \value CacheGlyphsHint A boolean value specifying whether rendered glyphs should be cached by Qt.
       
   324    \value OutlineGlyphsHint A boolean value specifying whether the font engine prefers outline drawing over image rendering for uncached glyphs.
       
   325 */
       
   326 
       
   327 /*!
       
   328    \enum QAbstractFontEngine::TextShapingFlag
       
   329 
       
   330    This enum describes flags controlling conversion of characters to glyphs and their metrics.
       
   331 
       
   332    \value RightToLeft The text is used in a right-to-left context.
       
   333    \value ReturnDesignMetrics Return font design metrics instead of pixel metrics.
       
   334 */
       
   335 
       
   336 /*!
       
   337    \typedef QAbstractFontEngine::Fixed
       
   338 
       
   339    This type is \c int, interpreted as a 26.6 fixed point value.
       
   340 */
       
   341 
       
   342 /*!
       
   343    \class QAbstractFontEngine::GlyphMetrics
       
   344    \brief QAbstractFontEngine::GlyphMetrics defines the metrics of a single glyph.
       
   345    \preliminary
       
   346    \since 4.3
       
   347 */
       
   348 
       
   349 /*!
       
   350    \variable QAbstractFontEngine::GlyphMetrics::x
       
   351 
       
   352    The horizontal offset from the origin.
       
   353 */
       
   354 
       
   355 /*!
       
   356    \fn QAbstractFontEngine::GlyphMetrics::GlyphMetrics()
       
   357 
       
   358    Constructs an empty glyph metrics object with all values
       
   359    set to zero.
       
   360 */
       
   361 
       
   362 /*!
       
   363    \variable QAbstractFontEngine::GlyphMetrics::y
       
   364 
       
   365    The vertical offset from the origin (baseline).
       
   366 */
       
   367 
       
   368 /*!
       
   369    \variable QAbstractFontEngine::GlyphMetrics::width
       
   370 
       
   371    The width of the glyph.
       
   372 */
       
   373 
       
   374 /*!
       
   375    \variable QAbstractFontEngine::GlyphMetrics::height
       
   376 
       
   377    The height of the glyph.
       
   378 */
       
   379 
       
   380 /*!
       
   381    \variable QAbstractFontEngine::GlyphMetrics::advance
       
   382 
       
   383    The advance of the glyph.
       
   384 */
       
   385 
       
   386 /*!
       
   387    \class QAbstractFontEngine::FixedPoint
       
   388    \brief QAbstractFontEngine::FixedPoint defines a point in the place using 26.6 fixed point precision.
       
   389    \preliminary
       
   390    \since 4.3
       
   391 */
       
   392 
       
   393 /*!
       
   394    \variable QAbstractFontEngine::FixedPoint::x
       
   395 
       
   396    The x coordinate of this point.
       
   397 */
       
   398 
       
   399 /*!
       
   400    \variable QAbstractFontEngine::FixedPoint::y
       
   401 
       
   402    The y coordinate of this point.
       
   403 */
       
   404 
       
   405 /*!
       
   406    Constructs a new QAbstractFontEngine with the given \a parent.
       
   407 */
       
   408 QAbstractFontEngine::QAbstractFontEngine(QObject *parent)
       
   409     : QObject(*new QAbstractFontEnginePrivate, parent)
       
   410 {
       
   411 }
       
   412 
       
   413 /*!
       
   414    Destroys this QAbstractFontEngine object.
       
   415 */
       
   416 QAbstractFontEngine::~QAbstractFontEngine()
       
   417 {
       
   418 }
       
   419 
       
   420 /*!
       
   421     \fn QAbstractFontEngine::Capabilities QAbstractFontEngine::capabilities() const
       
   422 
       
   423     Implemented in subclasses to specify the font engine's capabilities. The return value
       
   424     may be cached by the caller and is expected not to change during the lifetime of the
       
   425     font engine.
       
   426 */
       
   427 
       
   428 /*!
       
   429     \fn QVariant QAbstractFontEngine::fontProperty(FontProperty property) const
       
   430 
       
   431     Implemented in subclasses to return the value of the font attribute \a property. The return
       
   432     value may be cached by the caller and is expected not to change during the lifetime of the font
       
   433     engine.
       
   434 */
       
   435 
       
   436 /*!
       
   437     \fn bool QAbstractFontEngine::convertStringToGlyphIndices(const QChar *string, int length, uint *glyphs, int *numGlyphs, TextShapingFlags flags) const
       
   438 
       
   439     Implemented in subclasses to convert the characters specified by \a string and \a length to
       
   440     glyph indicies, using \a flags. The glyph indicies should be returned in the \a glyphs array
       
   441     provided by the caller. The maximum size of \a glyphs is specified by the value pointed to by \a
       
   442     numGlyphs. If successful, the subclass implementation sets the value pointed to by \a numGlyphs
       
   443     to the actual number of glyph indices generated, and returns true. Otherwise, e.g. if there is
       
   444     not enough space in the provided \a glyphs array, it should set \a numGlyphs to the number of
       
   445     glyphs needed for the conversion and return false.
       
   446 */
       
   447 
       
   448 /*!
       
   449     \fn void QAbstractFontEngine::getGlyphAdvances(const uint *glyphs, int numGlyphs, Fixed *advances, TextShapingFlags flags) const
       
   450 
       
   451     Implemented in subclasses to retrieve the advances of the array specified by \a glyphs and \a
       
   452     numGlyphs, using \a flags. The result is returned in \a advances, which is allocated by the
       
   453     caller and contains \a numGlyphs elements.
       
   454 */
       
   455 
       
   456 /*!
       
   457     \fn QAbstractFontEngine::GlyphMetrics QAbstractFontEngine::glyphMetrics(uint glyph) const
       
   458 
       
   459     Implemented in subclass to return the metrics for \a glyph.
       
   460 */
       
   461 
       
   462 /*!
       
   463    Implemented in subclasses to render the specified \a glyph into a \a buffer with the given \a depth ,
       
   464    \a bytesPerLine and \a height.
       
   465 
       
   466    Returns true if rendering succeeded, false otherwise.
       
   467 */
       
   468 bool QAbstractFontEngine::renderGlyph(uint glyph, int depth, int bytesPerLine, int height, uchar *buffer)
       
   469 {
       
   470     Q_UNUSED(glyph)
       
   471     Q_UNUSED(depth)
       
   472     Q_UNUSED(bytesPerLine)
       
   473     Q_UNUSED(height)
       
   474     Q_UNUSED(buffer)
       
   475     qWarning("QAbstractFontEngine: renderGlyph is not implemented in font plugin!");
       
   476     return false;
       
   477 }
       
   478 
       
   479 /*!
       
   480    Implemented in subclasses to add the outline of the glyphs specified by \a glyphs and \a
       
   481    numGlyphs at the specified \a positions to the painter path \a path.
       
   482 */
       
   483 void QAbstractFontEngine::addGlyphOutlinesToPath(uint *glyphs, int numGlyphs, FixedPoint *positions, QPainterPath *path)
       
   484 {
       
   485     Q_UNUSED(glyphs)
       
   486     Q_UNUSED(numGlyphs)
       
   487     Q_UNUSED(positions)
       
   488     Q_UNUSED(path)
       
   489     qWarning("QAbstractFontEngine: addGlyphOutlinesToPath is not implemented in font plugin!");
       
   490 }
       
   491 
       
   492 /*
       
   493 bool QAbstractFontEngine::supportsExtension(Extension extension) const
       
   494 {
       
   495     Q_UNUSED(extension)
       
   496     return false;
       
   497 }
       
   498 
       
   499 QVariant QAbstractFontEngine::extension(Extension extension, const QVariant &argument)
       
   500 {
       
   501     Q_UNUSED(argument)
       
   502     Q_UNUSED(extension)
       
   503     return QVariant();
       
   504 }
       
   505 */
       
   506 
       
   507 QProxyFontEngine::QProxyFontEngine(QAbstractFontEngine *customEngine, const QFontDef &def)
       
   508     : engine(customEngine)
       
   509 {
       
   510     fontDef = def;
       
   511     engineCapabilities = engine->capabilities();
       
   512 }
       
   513 
       
   514 QProxyFontEngine::~QProxyFontEngine()
       
   515 {
       
   516     delete engine;
       
   517 }
       
   518 
       
   519 bool QProxyFontEngine::stringToCMap(const QChar *str, int len, QGlyphLayout *glyphs, int *nglyphs, QTextEngine::ShaperFlags flags) const
       
   520 {
       
   521     if (*nglyphs < len) {
       
   522         *nglyphs = len;
       
   523         return false;
       
   524     }
       
   525 
       
   526     QVarLengthArray<uint> glyphIndicies(*nglyphs);
       
   527     if (!engine->convertStringToGlyphIndices(str, len, glyphIndicies.data(), nglyphs, QAbstractFontEngine::TextShapingFlags(int(flags))))
       
   528         return false;
       
   529 
       
   530     // ### use memcopy instead
       
   531     for (int i = 0; i < *nglyphs; ++i) {
       
   532         glyphs->glyphs[i] = glyphIndicies[i];
       
   533     }
       
   534     glyphs->numGlyphs = *nglyphs;
       
   535 
       
   536     recalcAdvances(glyphs, flags);
       
   537     return true;
       
   538 }
       
   539 
       
   540 void QProxyFontEngine::recalcAdvances(QGlyphLayout *glyphs, QTextEngine::ShaperFlags flags) const
       
   541 {
       
   542     const int nglyphs = glyphs->numGlyphs;
       
   543 
       
   544     QVarLengthArray<QAbstractFontEngine::Fixed> advances(nglyphs);
       
   545     engine->getGlyphAdvances(glyphs->glyphs, nglyphs, advances.data(), QAbstractFontEngine::TextShapingFlags(int(flags)));
       
   546 
       
   547 
       
   548     // ### use memcopy instead
       
   549     for (int i = 0; i < nglyphs; ++i) {
       
   550         glyphs->advances_x[i] = QFixed::fromFixed(advances[i]);
       
   551         glyphs->advances_y[i] = 0;
       
   552     }
       
   553 }
       
   554 
       
   555 
       
   556 static QImage alphaMapFromPath(QFontEngine *fe, glyph_t glyph)
       
   557 {
       
   558     glyph_metrics_t gm = fe->boundingBox(glyph);
       
   559     int glyph_x = qFloor(gm.x.toReal());
       
   560     int glyph_y = qFloor(gm.y.toReal());
       
   561     int glyph_width = qCeil((gm.x + gm.width).toReal()) -  glyph_x;
       
   562     int glyph_height = qCeil((gm.y + gm.height).toReal()) - glyph_y;
       
   563 
       
   564     if (glyph_width <= 0 || glyph_height <= 0)
       
   565         return QImage();
       
   566     QFixedPoint pt;
       
   567     pt.x = 0;
       
   568     pt.y = -glyph_y; // the baseline
       
   569     QPainterPath path;
       
   570     QImage im(glyph_width + qAbs(glyph_x) + 4, glyph_height, QImage::Format_ARGB32_Premultiplied);
       
   571     im.fill(Qt::transparent);
       
   572     QPainter p(&im);
       
   573     p.setRenderHint(QPainter::Antialiasing);
       
   574     fe->addGlyphsToPath(&glyph, &pt, 1, &path, 0);
       
   575     p.setPen(Qt::NoPen);
       
   576     p.setBrush(Qt::black);
       
   577     p.drawPath(path);
       
   578     p.end();
       
   579 
       
   580     QImage indexed(im.width(), im.height(), QImage::Format_Indexed8);
       
   581     QVector<QRgb> colors(256);
       
   582     for (int i=0; i<256; ++i)
       
   583         colors[i] = qRgba(0, 0, 0, i);
       
   584     indexed.setColorTable(colors);
       
   585 
       
   586     for (int y=0; y<im.height(); ++y) {
       
   587         uchar *dst = (uchar *) indexed.scanLine(y);
       
   588         uint *src = (uint *) im.scanLine(y);
       
   589         for (int x=0; x<im.width(); ++x)
       
   590             dst[x] = qAlpha(src[x]);
       
   591     }
       
   592 
       
   593     return indexed;
       
   594 }
       
   595 
       
   596 
       
   597 QImage QProxyFontEngine::alphaMapForGlyph(glyph_t glyph)
       
   598 {
       
   599     if (!(engineCapabilities & QAbstractFontEngine::CanRenderGlyphs_Gray))
       
   600         return alphaMapFromPath(this, glyph);
       
   601 
       
   602     QAbstractFontEngine::GlyphMetrics metrics = engine->glyphMetrics(glyph);
       
   603     if (metrics.width <= 0 || metrics.height <= 0)
       
   604         return QImage();
       
   605 
       
   606     QImage img(metrics.width >> 6, metrics.height >> 6, QImage::Format_Indexed8);
       
   607 
       
   608     // ### we should have QImage::Format_GrayScale8
       
   609     static QVector<QRgb> colorMap;
       
   610     if (colorMap.isEmpty()) {
       
   611         colorMap.resize(256);
       
   612         for (int i=0; i<256; ++i)
       
   613             colorMap[i] = qRgba(0, 0, 0, i);
       
   614     }
       
   615 
       
   616     img.setColorTable(colorMap);
       
   617 
       
   618     engine->renderGlyph(glyph, /*depth*/8, img.bytesPerLine(), img.height(), img.bits());
       
   619 
       
   620     return img;
       
   621 }
       
   622 
       
   623 void QProxyFontEngine::addGlyphsToPath(glyph_t *glyphs, QFixedPoint *positions, int nglyphs, QPainterPath *path, QTextItem::RenderFlags flags)
       
   624 {
       
   625     if (engineCapabilities & QAbstractFontEngine::CanOutlineGlyphs)
       
   626         engine->addGlyphOutlinesToPath(glyphs, nglyphs, reinterpret_cast<QAbstractFontEngine::FixedPoint *>(positions), path);
       
   627     else
       
   628         QFontEngine::addGlyphsToPath(glyphs, positions, nglyphs, path, flags);
       
   629 }
       
   630 
       
   631 glyph_metrics_t QProxyFontEngine::boundingBox(const QGlyphLayout &glyphs)
       
   632 {
       
   633     if (glyphs.numGlyphs == 0)
       
   634         return glyph_metrics_t();
       
   635 
       
   636     QFixed w = 0;
       
   637     for (int i = 0; i < glyphs.numGlyphs; ++i)
       
   638         w += glyphs.effectiveAdvance(i);
       
   639 
       
   640     return glyph_metrics_t(0, -ascent(), w, ascent() + descent(), w, 0);
       
   641 }
       
   642 
       
   643 glyph_metrics_t QProxyFontEngine::boundingBox(glyph_t glyph)
       
   644 {
       
   645     glyph_metrics_t m;
       
   646 
       
   647     QAbstractFontEngine::GlyphMetrics metrics = engine->glyphMetrics(glyph);
       
   648     m.x = QFixed::fromFixed(metrics.x);
       
   649     m.y = QFixed::fromFixed(metrics.y);
       
   650     m.width = QFixed::fromFixed(metrics.width);
       
   651     m.height = QFixed::fromFixed(metrics.height);
       
   652     m.xoff = QFixed::fromFixed(metrics.advance);
       
   653 
       
   654     return m;
       
   655 }
       
   656 
       
   657 QFixed QProxyFontEngine::ascent() const
       
   658 {
       
   659     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::Ascent).toInt());
       
   660 }
       
   661 
       
   662 QFixed QProxyFontEngine::descent() const
       
   663 {
       
   664     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::Descent).toInt());
       
   665 }
       
   666 
       
   667 QFixed QProxyFontEngine::leading() const
       
   668 {
       
   669     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::Leading).toInt());
       
   670 }
       
   671 
       
   672 QFixed QProxyFontEngine::xHeight() const
       
   673 {
       
   674     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::XHeight).toInt());
       
   675 }
       
   676 
       
   677 QFixed QProxyFontEngine::averageCharWidth() const
       
   678 {
       
   679     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::AverageCharWidth).toInt());
       
   680 }
       
   681 
       
   682 QFixed QProxyFontEngine::lineThickness() const
       
   683 {
       
   684     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::LineThickness).toInt());
       
   685 }
       
   686 
       
   687 QFixed QProxyFontEngine::underlinePosition() const
       
   688 {
       
   689     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::UnderlinePosition).toInt());
       
   690 }
       
   691 
       
   692 qreal QProxyFontEngine::maxCharWidth() const
       
   693 {
       
   694     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::MaxCharWidth).toInt()).toReal();
       
   695 }
       
   696 
       
   697 qreal QProxyFontEngine::minLeftBearing() const
       
   698 {
       
   699     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::MinLeftBearing).toInt()).toReal();
       
   700 }
       
   701 
       
   702 qreal QProxyFontEngine::minRightBearing() const
       
   703 {
       
   704     return QFixed::fromFixed(engine->fontProperty(QAbstractFontEngine::MinRightBearing).toInt()).toReal();
       
   705 }
       
   706 
       
   707 int QProxyFontEngine::glyphCount() const
       
   708 {
       
   709     return engine->fontProperty(QAbstractFontEngine::GlyphCount).toInt();
       
   710 }
       
   711 
       
   712 bool QProxyFontEngine::canRender(const QChar *string, int len)
       
   713 {
       
   714     QVarLengthArray<uint> glyphs(len);
       
   715     int numGlyphs = len;
       
   716 
       
   717     if (!engine->convertStringToGlyphIndices(string, len, glyphs.data(), &numGlyphs, /*flags*/0))
       
   718         return false;
       
   719 
       
   720     for (int i = 0; i < numGlyphs; ++i)
       
   721         if (!glyphs[i])
       
   722             return false;
       
   723 
       
   724     return true;
       
   725 }
       
   726 
       
   727 void QProxyFontEngine::draw(QPaintEngine *p, qreal _x, qreal _y, const QTextItemInt &si)
       
   728 {
       
   729     QPaintEngineState *pState = p->state;
       
   730     QRasterPaintEngine *paintEngine = static_cast<QRasterPaintEngine*>(p);
       
   731 
       
   732     QTransform matrix = pState->transform();
       
   733     matrix.translate(_x, _y);
       
   734     QFixed x = QFixed::fromReal(matrix.dx());
       
   735     QFixed y = QFixed::fromReal(matrix.dy());
       
   736 
       
   737     QVarLengthArray<QFixedPoint> positions;
       
   738     QVarLengthArray<glyph_t> glyphs;
       
   739     getGlyphPositions(si.glyphs, matrix, si.flags, glyphs, positions);
       
   740     if (glyphs.size() == 0)
       
   741         return;
       
   742 
       
   743     for(int i = 0; i < glyphs.size(); i++) {
       
   744         QImage glyph = alphaMapForGlyph(glyphs[i]);
       
   745         if (glyph.isNull())
       
   746             continue;
       
   747 
       
   748         if (glyph.format() != QImage::Format_Indexed8
       
   749             && glyph.format() != QImage::Format_Mono)
       
   750             continue;
       
   751 
       
   752         QAbstractFontEngine::GlyphMetrics metrics = engine->glyphMetrics(glyphs[i]);
       
   753 
       
   754         int depth = glyph.format() == QImage::Format_Mono ? 1 : 8;
       
   755         paintEngine->alphaPenBlt(glyph.bits(), glyph.bytesPerLine(), depth,
       
   756                                  qRound(positions[i].x + QFixed::fromFixed(metrics.x)),
       
   757                                  qRound(positions[i].y + QFixed::fromFixed(metrics.y)),
       
   758                                  glyph.width(), glyph.height());
       
   759     }
       
   760 }
       
   761 
       
   762 /*
       
   763  * This is only called when we use the proxy fontengine directly (without sharing the rendered
       
   764  * glyphs). So we prefer outline rendering over rendering of unshared glyphs. That decision is
       
   765  * done in qfontdatabase_qws.cpp by looking at the ShareGlyphsHint and the pixel size of the font.
       
   766  */
       
   767 bool QProxyFontEngine::drawAsOutline() const
       
   768 {
       
   769     if (!(engineCapabilities & QAbstractFontEngine::CanOutlineGlyphs))
       
   770         return false;
       
   771 
       
   772     QVariant outlineHint = engine->fontProperty(QAbstractFontEngine::OutlineGlyphsHint);
       
   773     return !outlineHint.isValid() || outlineHint.toBool();
       
   774 }
       
   775 
       
   776 QT_END_NAMESPACE