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.
tdelibs/khtml/rendering/font.h

189 lines
6.4 KiB

/*
* This file is part of the html renderer for KDE.
*
* Copyright (C) 2000-2003 Lars Knoll (knoll@kde.org)
* (C) 2000 Antti Koivisto (koivisto@kde.org)
* (C) 2000 Dirk Mueller (mueller@kde.org)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef KHTMLFONT_H
#define KHTMLFONT_H
#include <qfont.h>
#include <qfontmetrics.h>
#include <qmap.h>
#include <qpainter.h>
class QFontDatabase;
class QPaintDeviceMetrics;
namespace khtml
{
class RenderStyle;
class CSSStyleSelector;
class FontDef
{
public:
FontDef()
: size( 0 ), italic( false ), smallCaps( false ), weight( 50 ) {}
bool operator == ( const FontDef &other ) const {
return ( family == other.family &&
size == other.size &&
italic == other.italic &&
smallCaps == other.smallCaps &&
weight == other.weight );
}
QString family;
short int size;
bool italic : 1;
bool smallCaps : 1;
unsigned int weight : 8;
};
class Font
{
friend class RenderStyle;
friend class CSSStyleSelector;
public:
Font() : fontDef(), f(), fm( f ), scFont( 0 ), letterSpacing( 0 ), wordSpacing( 0 ) {}
Font( const FontDef &fd )
: fontDef( fd ), f(), fm( f ), scFont( 0 ), letterSpacing( 0 ), wordSpacing( 0 )
{}
Font(const Font& o)
: fontDef(o.fontDef), f(o.f), fm(o.fm), scFont(o.scFont), letterSpacing(o.letterSpacing), wordSpacing(o.wordSpacing) { if (o.scFont) scFont = new QFont(*o.scFont); }
~Font() { delete scFont; }
bool operator == ( const Font &other ) const {
return (fontDef == other.fontDef &&
letterSpacing == other.letterSpacing &&
wordSpacing == other.wordSpacing );
}
const FontDef& getFontDef() const { return fontDef; }
void update( QPaintDeviceMetrics *devMetrics ) const;
/**
* Draws a piece from the given piece of text.
* @param p painter
* @param x x-coordinate to begin drawing, always denotes leftmost position
* @param y y-coordinate of baseline of text
* @param str string to draw a piece from
* @param slen total length of string
* @param pos zero-based offset of beginning of piece
* @param len length of piece
* @param width additional pixels to be distributed equally among all
* spaces
* @param d text direction
* @param from begin with this position relative to @p pos, -1 to start
* at @p pos
* @param to stop before this position relative to @p pos, -1 to use full
* length of piece
* @param bg if valid, fill the background of the drawn piece with this
* color
* @param uy y-coordinate of top position, used for background and text
* decoration painting
* @param h total height of line, only used for background and text
* decoration painting
* @param deco combined text decoration (see Decoration)
*/
void drawText( QPainter *p, int x, int y, QChar *str, int slen, int pos, int len, int width,
QPainter::TextDirection d, int from=-1, int to=-1, QColor bg=QColor(),
int uy=-1, int h=-1, int deco=0 ) const;
/** returns the width of the given string chunk in pixels.
*
* The method also considers various styles like text-align and font-variant
* @param str pointer to string
* @param slen total length of string
* @param pos zero-based position in string where to start measuring
* @param len count of characters up to which the width should be determined
* @param start starting position of inline text box within str, only
* used when toAdd is specified.
* @param end ending position of inline text box within str, only
* used when toAdd is specified.
* @param toAdd amount of pixels to distribute evenly among all spaces of
* str. Note that toAdd applies to all spaces within str, but only those
* within [pos, pos+len) are counted towards the width.
*/
int width( QChar *str, int slen, int pos, int len, int start = 0, int end = 0, int toAdd = 0 ) const;
/** return the width of the given char in pixels.
*
* The method also considers various styles like text-align and font-variant
* @param str pointer to string
* @param slen total length of string
* @param pos zero-based position of char in string
*/
int width( QChar *str, int slen, int pos) const;
/** Text decoration constants.
*
* The enumeration constant values match those of ETextDecoration, but only
* a subset is supported.
*/
enum Decoration { UNDERLINE = 0x1, OVERLINE = 0x2, LINE_THROUGH= 0x4 };
// Keep in sync with ETextDecoration
/** draws text decoration
* @param p painter
* @param x x-coordinate
* @param y top y-coordinate of line box
* @param baseline baseline
* @param width length of decoration in pixels
* @param height height of line box
* @param deco decoration to be drawn (see Decoration). The enumeration
* constants may be combined.
*/
void drawDecoration(QPainter *p, int x, int y, int baseline, int width, int height, int deco) const;
/** returns letter spacing
*/
int getLetterSpacing() const { return letterSpacing; }
/** returns word spacing
*/
int getWordSpacing() const { return wordSpacing; }
private:
mutable FontDef fontDef;
mutable QFont f;
mutable QFontMetrics fm;
mutable QFont *scFont;
short letterSpacing;
short wordSpacing;
struct ScalKey;
enum ScalInfo {
Unknown,
No,
Yes
};
static QMap<ScalKey, ScalInfo>* scalCache;
static QMap<ScalKey, QValueList<int> >* scalSizesCache;
static bool isFontScalable(QFontDatabase& db, const QFont& font);
};
} // namespace
#endif