You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tqt3/src/kernel/qfontengine_p.h

633 lines
16 KiB

/****************************************************************************
**
** ???
**
** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
**
** This file is part of the kernel module of the TQt GUI Toolkit.
**
** This file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free
** Software Foundation and appearing in the files LICENSE.GPL2
** and LICENSE.GPL3 included in the packaging of this file.
** Alternatively you may (at your option) use any later version
** of the GNU General Public License if such license has been
** publicly approved by Trolltech ASA (or its successors, if any)
** and the KDE Free TQt Foundation.
**
** Please review the following information to ensure GNU General
** Public Licensing retquirements will be met:
** http://trolltech.com/products/qt/licenses/licensing/opensource/.
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
** or contact the sales department at sales@trolltech.com.
**
** Licensees holding valid TQt Commercial licenses may use this file in
** accordance with the TQt Commercial License Agreement provided with
** the Software.
**
** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
** herein.
**
**********************************************************************/
#ifndef TQFONTENGINE_P_H
#define TQFONTENGINE_P_H
#ifndef QT_H
#include "qglobal.h"
#endif // QT_H
#ifdef Q_WS_WIN
#include "qt_windows.h"
#include "qptrdict.h"
#endif
#include "qtextengine_p.h"
class TQPaintDevice;
struct glyph_metrics_t;
class TQChar;
typedef unsigned short glyph_t;
struct qoffset_t;
typedef int advance_t;
class TQOpenType;
struct TransformedFont;
#if defined( Q_WS_X11 ) || defined( Q_WS_WIN) || defined( Q_WS_MAC )
class TQFontEngine : public TQShared
{
public:
enum Error {
NoError,
OutOfMemory
};
enum Type {
// X11 types
Box,
XLFD,
LatinXLFD,
Xft,
// MS Windows types
Win,
Uniscribe,
// Apple MacOS types
Mac,
// Trolltech TQWS types
TQWS
};
TQFontEngine() {
count = 0; cache_count = 0;
#ifdef Q_WS_X11
transformed_fonts = 0;
#endif
}
virtual ~TQFontEngine();
/* returns 0 as glyph index for non existant glyphs */
virtual Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs,
advance_t *advances, int *nglyphs, bool mirrored ) const = 0;
#ifdef Q_WS_X11
virtual int cmap() const { return -1; }
virtual TQOpenType *openType() const { return 0; }
#endif
virtual void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags ) = 0;
virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances,
const qoffset_t *offsets, int numGlyphs ) = 0;
virtual glyph_metrics_t boundingBox( glyph_t glyph ) = 0;
virtual int ascent() const = 0;
virtual int descent() const = 0;
virtual int leading() const = 0;
virtual int lineThickness() const;
virtual int underlinePosition() const;
virtual int maxCharWidth() const = 0;
virtual int minLeftBearing() const { return 0; }
virtual int minRightBearing() const { return 0; }
virtual const char *name() const = 0;
virtual bool canRender( const TQChar *string, int len ) = 0;
virtual void setScale( double ) {}
virtual double scale() const { return 1.; }
virtual Type type() const = 0;
TQFontDef fontDef;
uint cache_cost; // amount of mem used in kb by the font
int cache_count;
#ifdef Q_WS_WIN
HDC dc() const;
void getGlyphIndexes( const TQChar *ch, int numChars, glyph_t *glyphs, bool mirrored ) const;
void getCMap();
TQCString _name;
HDC hdc;
HFONT hfont;
LOGFONT logfont;
uint stockFont : 1;
uint paintDevice : 1;
uint useTextOutA : 1;
uint ttf : 1;
uint symbol : 1;
union {
TEXTMETRICW w;
TEXTMETRICA a;
} tm;
int lw;
unsigned char *cmap;
void *script_cache;
static TQPtrDict<TQFontEngine> cacheDict;
short lbearing;
short rbearing;
#endif // Q_WS_WIN
#ifdef Q_WS_X11
TransformedFont *transformed_fonts;
#endif
};
#elif defined( Q_WS_QWS )
class TQGfx;
class TQFontEngine : public TQShared
{
public:
TQFontEngine( const TQFontDef&, const TQPaintDevice * = 0 );
~TQFontEngine();
/*TQMemoryManager::FontID*/ void *handle() const;
enum Type {
// X11 types
Box,
XLFD,
Xft,
// MS Windows types
Win,
Uniscribe,
// Apple MacOS types
Mac,
// Trolltech TQWS types
Qws
};
enum TextFlags {
Underline = 0x01,
Overline = 0x02,
StrikeOut = 0x04
};
enum Error {
NoError,
OutOfMemory
};
/* returns 0 as glyph index for non existant glyphs */
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int maxCharWidth() const;
int minLeftBearing() const;
int minRightBearing() const;
int underlinePosition() const;
int lineThickness() const;
Type type() { return Qws; }
bool canRender( const TQChar *string, int len );
inline const char *name() const { return 0; }
TQFontDef fontDef;
/*TQMemoryManager::FontID*/ void *id;
int cache_cost;
int cache_count;
int scale;
};
#endif // WIN || X11 || MAC
enum IndicFeatures {
CcmpFeature,
InitFeature,
NuktaFeature,
AkhantFeature,
RephFeature,
BelowFormFeature,
HalfFormFeature,
PostFormFeature,
VattuFeature,
PreSubstFeature,
AboveSubstFeature,
BelowSubstFeature,
PostSubstFeature,
HalantFeature
};
#if defined(Q_WS_X11) || defined(Q_WS_WIN)
class TQFontEngineBox : public TQFontEngine
{
public:
TQFontEngineBox( int size );
~TQFontEngineBox();
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int maxCharWidth() const;
int minLeftBearing() const { return 0; }
int minRightBearing() const { return 0; }
#ifdef Q_WS_X11
int cmap() const;
#endif
const char *name() const;
bool canRender( const TQChar *string, int len );
Type type() const;
inline int size() const { return _size; }
private:
friend class TQFontPrivate;
int _size;
};
#endif
#ifdef Q_WS_X11
#include "qt_x11_p.h"
struct TransformedFont
{
float xx;
float xy;
float yx;
float yy;
union {
Font xlfd_font;
#ifndef QT_NO_XFTFREETYPE
XftFont *xft_font;
#endif
};
TransformedFont *next;
};
#ifndef QT_NO_XFTFREETYPE
#include <ft2build.h>
#include FT_FREETYPE_H
#include "ftxopen.h"
class TQTextCodec;
class TQFontEngineXft : public TQFontEngine
{
public:
TQFontEngineXft( XftFont *font, XftPattern *pattern, int cmap );
~TQFontEngineXft();
TQOpenType *openType() const;
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int lineThickness() const;
int underlinePosition() const;
int maxCharWidth() const;
int minLeftBearing() const;
int minRightBearing() const;
int cmap() const;
const char *name() const;
void setScale( double scale );
double scale() const { return _scale; }
bool canRender( const TQChar *string, int len );
Type type() const;
XftPattern *pattern() const { return _pattern; }
FT_Face face() const { return _face; }
XftFont *font() const { return _font; }
void recalcAdvances( int len, glyph_t *glyphs, advance_t *advances );
private:
friend class TQFontPrivate;
friend class TQOpenType;
XftFont *_font;
XftPattern *_pattern;
FT_Face _face;
TQOpenType *_openType;
int _cmap;
short lbearing;
short rbearing;
float _scale;
enum { widthCacheSize = 0x800, cmapCacheSize = 0x500 };
unsigned char widthCache[widthCacheSize];
glyph_t cmapCache[cmapCacheSize];
};
#endif
class TQFontEngineLatinXLFD;
class TQFontEngineXLFD : public TQFontEngine
{
public:
TQFontEngineXLFD( XFontStruct *fs, const char *name, int cmap );
~TQFontEngineXLFD();
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int maxCharWidth() const;
int minLeftBearing() const;
int minRightBearing() const;
int cmap() const;
const char *name() const;
bool canRender( const TQChar *string, int len );
void setScale( double scale );
double scale() const { return _scale; }
Type type() const;
TQt::HANDLE handle() const { return (TQt::HANDLE) _fs->fid; }
private:
friend class TQFontPrivate;
XFontStruct *_fs;
TQCString _name;
TQTextCodec *_codec;
float _scale; // needed for printing, to correctly scale font metrics for bitmap fonts
int _cmap;
short lbearing;
short rbearing;
enum XlfdTransformations {
XlfdTrUnknown,
XlfdTrSupported,
XlfdTrUnsupported
};
XlfdTransformations xlfd_transformations;
friend class TQFontEngineLatinXLFD;
};
class TQFontEngineLatinXLFD : public TQFontEngine
{
public:
TQFontEngineLatinXLFD( XFontStruct *xfs, const char *name, int cmap );
~TQFontEngineLatinXLFD();
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs,
advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine,
const TQScriptItem *si, int textFlags );
virtual glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances,
const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int maxCharWidth() const;
int minLeftBearing() const;
int minRightBearing() const;
int cmap() const { return -1; } // ###
const char *name() const;
bool canRender( const TQChar *string, int len );
void setScale( double scale );
double scale() const { return _engines[0]->scale(); }
Type type() const { return LatinXLFD; }
TQt::HANDLE handle() const { return ((TQFontEngineXLFD *) _engines[0])->handle(); }
private:
void findEngine( const TQChar &ch );
TQFontEngine **_engines;
int _count;
glyph_t glyphIndices [0x200];
advance_t glyphAdvances[0x200];
glyph_t euroIndex;
advance_t euroAdvance;
};
class TQScriptItem;
class TQTextEngine;
#ifndef QT_NO_XFTFREETYPE
#include "qscriptengine_p.h"
#include "qtextengine_p.h"
#include <ft2build.h>
#include FT_FREETYPE_H
#include "ftxopen.h"
enum { PositioningProperties = 0x80000000 };
class TQOpenType
{
public:
TQOpenType(TQFontEngineXft *fe);
~TQOpenType();
struct Features {
uint tag;
uint property;
};
bool supportsScript(unsigned int script) {
Q_ASSERT(script < TQFont::NScripts);
return supported_scripts[script];
}
void selectScript(unsigned int script, const Features *features = 0);
bool shape(TQShaperItem *item, const unsigned int *properties = 0);
bool positionAndAdd(TQShaperItem *item, bool doLogClusters = TRUE);
OTL_GlyphItem glyphs() const { return otl_buffer->in_string; }
int len() const { return otl_buffer->in_length; }
void setProperty(int index, uint property) { otl_buffer->in_string[index].properties = property; }
private:
bool checkScript(unsigned int script);
TQFontEngine *fontEngine;
FT_Face face;
TTO_GDEF gdef;
TTO_GSUB gsub;
TTO_GPOS gpos;
bool supported_scripts[TQFont::NScripts];
FT_ULong current_script;
bool positioned : 1;
OTL_Buffer otl_buffer;
GlyphAttributes *tmpAttributes;
unsigned int *tmpLogClusters;
int length;
int orig_nglyphs;
int loadFlags;
};
#endif // QT_NO_XFTFREETYPE
#elif defined( Q_WS_MAC )
#include "qt_mac.h"
#include <qmap.h>
#include <qcache.h>
class TQFontEngineMac : public TQFontEngine
{
#if 0
ATSFontMetrics *info;
#else
FontInfo *info;
#endif
int psize;
FMFontFamily fmfam;
TQMacFontInfo *internal_fi;
mutable ATSUTextLayout mTextLayout;
enum { widthCacheSize = 0x500 };
mutable unsigned char widthCache[widthCacheSize];
friend class TQFont;
friend class TQGLContext;
friend class TQFontPrivate;
friend class TQMacSetFontInfo;
public:
TQFontEngineMac();
~TQFontEngineMac();
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const { return (int)info->ascent; }
int descent() const { return (int)info->descent; }
int leading() const { return (int)info->leading; }
#if 0
int maxCharWidth() const { return (int)info->maxAdvanceWidth; }
#else
int maxCharWidth() const { return info->widMax; }
#endif
const char *name() const { return "ATSUI"; }
bool canRender( const TQChar *string, int len );
Type type() const { return TQFontEngine::Mac; }
void calculateCost();
enum { WIDTH=0x01, DRAW=0x02, EXISTS=0x04 };
int doTextTask(const TQChar *s, int pos, int use_len, int len, uchar task, int =-1, int y=-1,
TQPaintDevice *dev=NULL, const TQRegion *rgn=NULL) const;
};
#elif defined( Q_WS_WIN )
class TQFontEngineWin : public TQFontEngine
{
public:
TQFontEngineWin( const char *name, HDC, HFONT, bool, LOGFONT );
Error stringToCMap( const TQChar *str, int len, glyph_t *glyphs, advance_t *advances, int *nglyphs, bool mirrored ) const;
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
glyph_metrics_t boundingBox( const glyph_t *glyphs,
const advance_t *advances, const qoffset_t *offsets, int numGlyphs );
glyph_metrics_t boundingBox( glyph_t glyph );
int ascent() const;
int descent() const;
int leading() const;
int maxCharWidth() const;
int minLeftBearing() const;
int minRightBearing() const;
const char *name() const;
bool canRender( const TQChar *string, int len );
Type type() const;
enum { widthCacheSize = 0x800, cmapCacheSize = 0x500 };
unsigned char widthCache[widthCacheSize];
};
#if 0
class TQFontEngineUniscribe : public TQFontEngineWin
{
public:
void draw( TQPainter *p, int x, int y, const TQTextEngine *engine, const TQScriptItem *si, int textFlags );
bool canRender( const TQChar *string, int len );
Type type() const;
};
#endif
#endif // Q_WS_WIN
#endif