|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// character_manager.cpp: implementation of the TFont class
|
|
Campbell Barton |
747d5c |
// for FreeType 2.
|
|
Campbell Barton |
747d5c |
//
|
|
Campbell Barton |
747d5c |
//////////////////////////////////////////////////////////////////////
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
#include <qstringlist></qstringlist>
|
|
Campbell Barton |
747d5c |
#include <qfont></qfont>
|
|
Campbell Barton |
747d5c |
#include <qfontdatabase></qfontdatabase>
|
|
Campbell Barton |
747d5c |
#include <qfontmetrics></qfontmetrics>
|
|
Campbell Barton |
747d5c |
#include <qimage></qimage>
|
|
Campbell Barton |
747d5c |
#include <qpainterpath></qpainterpath>
|
|
shun_iwasawa |
df21fa |
#include <qpainter></qpainter>
|
|
Campbell Barton |
747d5c |
#include <qrawfont></qrawfont>
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
#include <vector></vector>
|
|
Campbell Barton |
747d5c |
#include <iostream></iostream>
|
|
Campbell Barton |
747d5c |
#include <string></string>
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
#include "tpixelgr.h"
|
|
Campbell Barton |
747d5c |
#include "tfont.h"
|
|
Campbell Barton |
747d5c |
#include "tstroke.h"
|
|
Campbell Barton |
747d5c |
#include "tcurves.h"
|
|
Campbell Barton |
747d5c |
#include "traster.h"
|
|
Campbell Barton |
747d5c |
#include "tmathutil.h"
|
|
Campbell Barton |
747d5c |
#include "tvectorimage.h"
|
|
Campbell Barton |
747d5c |
using namespace std;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//=============================================================================
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
struct TFont::Impl {
|
|
Campbell Barton |
747d5c |
bool m_hasKerning;
|
|
Campbell Barton |
747d5c |
int m_hasVertical;
|
|
Campbell Barton |
747d5c |
QFont m_font;
|
|
Campbell Barton |
747d5c |
// XXX:cache a QFontMetrics m_metrics; ?
|
|
Campbell Barton |
747d5c |
// XXX:cache a QRawFont m_raw; ?
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// KerningPairs m_kerningPairs;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
Impl(const QString &family, const QString &style, int size);
|
|
Campbell Barton |
747d5c |
~Impl();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// void getChar();
|
|
Campbell Barton |
747d5c |
};
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont::TFont(const wstring family, const wstring face, int size) {
|
|
Campbell Barton |
747d5c |
m_pimpl = new Impl(QString::fromStdWString(family),
|
|
Campbell Barton |
747d5c |
QString::fromStdWString(face), size);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont::~TFont() { delete m_pimpl; }
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont::Impl::Impl(const QString &family, const QString &style, int size) {
|
|
Campbell Barton |
747d5c |
m_font = QFont(family, size);
|
|
shun_iwasawa |
df21fa |
m_font.setBold(TFontManager::instance()->isBold(family, style));
|
|
shun_iwasawa |
df21fa |
m_font.setItalic(TFontManager::instance()->isItalic(family, style));
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont::Impl::~Impl() {}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
shun_iwasawa |
6c2748 |
// returns the offset (advance of the cursor) for the current character
|
|
Campbell Barton |
747d5c |
TPoint TFont::drawChar(TVectorImageP &image, wchar_t charcode,
|
|
Campbell Barton |
747d5c |
wchar_t nextCharCode) const {
|
|
Campbell Barton |
747d5c |
QRawFont raw(QRawFont::fromFont(m_pimpl->m_font));
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QChar chars[2] = {charcode, nextCharCode};
|
|
Campbell Barton |
747d5c |
quint32 indices[2];
|
|
Campbell Barton |
747d5c |
int count = 2;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (!raw.glyphIndexesForChars(chars, 2, indices, &count) || count < 1)
|
|
Campbell Barton |
747d5c |
return TPoint(0, 0);
|
|
Campbell Barton |
747d5c |
QPainterPath path = raw.pathForGlyph(indices[0]);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// empty glyph, nothing to do
|
|
Campbell Barton |
747d5c |
if (path.elementCount() < 1) return getDistance(charcode, nextCharCode);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// force closing the last path
|
|
Shinya Kitaoka |
d1f6c4 |
if (path.elementAt(path.elementCount() - 1).type !=
|
|
Shinya Kitaoka |
d1f6c4 |
QPainterPath::MoveToElement) {
|
|
Campbell Barton |
747d5c |
path.moveTo(0.0, 0.0);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
int i, n = path.elementCount();
|
|
Campbell Barton |
747d5c |
int strokes = 0;
|
|
Campbell Barton |
747d5c |
std::vector<tthickpoint> points;</tthickpoint>
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TThickPoint pts[4];
|
|
Campbell Barton |
747d5c |
int nCubicPts = 0;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
for (i = 0; i < n; i++) {
|
|
Campbell Barton |
747d5c |
QPainterPath::Element e = path.elementAt(i);
|
|
Campbell Barton |
747d5c |
e.y = -e.y;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
switch (e.type) {
|
|
Campbell Barton |
747d5c |
case QPainterPath::MoveToElement:
|
|
Campbell Barton |
747d5c |
if (!points.empty()) {
|
|
Campbell Barton |
747d5c |
if (points.back() != points.front()) {
|
|
Campbell Barton |
747d5c |
points.push_back(0.5 * (points.back() + points.front()));
|
|
Campbell Barton |
747d5c |
points.push_back(points.front());
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TStroke *stroke = new TStroke(points);
|
|
Campbell Barton |
747d5c |
stroke->setSelfLoop(true);
|
|
Campbell Barton |
747d5c |
image->addStroke(stroke);
|
|
Campbell Barton |
747d5c |
strokes++;
|
|
Campbell Barton |
747d5c |
points.clear();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
points.push_back(TThickPoint(e.x, e.y, 0));
|
|
Campbell Barton |
747d5c |
break;
|
|
Campbell Barton |
747d5c |
case QPainterPath::LineToElement: {
|
|
Campbell Barton |
747d5c |
TThickPoint p0 = points.back();
|
|
Campbell Barton |
747d5c |
TThickPoint p1 = TThickPoint(e.x, e.y, 0);
|
|
Campbell Barton |
747d5c |
points.push_back((p0 + p1) * 0.5);
|
|
Campbell Barton |
747d5c |
points.push_back(p1);
|
|
Campbell Barton |
747d5c |
break;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
case QPainterPath::CurveToElement:
|
|
Campbell Barton |
747d5c |
pts[0] = points.back();
|
|
Campbell Barton |
747d5c |
pts[1] = TThickPoint(e.x, e.y, 0);
|
|
Campbell Barton |
747d5c |
nCubicPts = 2;
|
|
Campbell Barton |
747d5c |
break;
|
|
Campbell Barton |
747d5c |
case QPainterPath::CurveToDataElement:
|
|
Campbell Barton |
747d5c |
pts[nCubicPts++] = TThickPoint(e.x, e.y, 0);
|
|
Campbell Barton |
747d5c |
if (nCubicPts == 4) {
|
|
Campbell Barton |
747d5c |
vector<tthickquadratic *=""> chunkArray;</tthickquadratic>
|
|
Campbell Barton |
747d5c |
computeQuadraticsFromCubic(pts[0], pts[1], pts[2], pts[3], 0.09,
|
|
Campbell Barton |
747d5c |
chunkArray);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
for (int j = 0; j < chunkArray.size(); j++) {
|
|
Campbell Barton |
747d5c |
points.push_back(chunkArray[j]->getP1());
|
|
Campbell Barton |
747d5c |
points.push_back(chunkArray[j]->getP2());
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
nCubicPts = 0;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
break;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (strokes > 1) image->group(0, strokes);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
return getDistance(charcode, nextCharCode);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
df21fa |
TPoint TFont::drawChar(QImage &outImage, TPoint &unused, wchar_t charcode,
|
|
Campbell Barton |
747d5c |
wchar_t nextCharCode) const {
|
|
Campbell Barton |
747d5c |
QRawFont raw(QRawFont::fromFont(m_pimpl->m_font));
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QChar chars[2] = {charcode, nextCharCode};
|
|
Campbell Barton |
747d5c |
quint32 indices[2];
|
|
Campbell Barton |
747d5c |
int count = 2;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (!raw.glyphIndexesForChars(chars, 2, indices, &count) || count < 1) {
|
|
Campbell Barton |
747d5c |
return TPoint(0, 0);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Le-dragon-dev |
412c23 |
// Workaround for unix when the user using the space character:
|
|
Le-dragon-dev |
412c23 |
// alphaMapForGlyph with a space character returns an invalid
|
|
Le-dragon-dev |
412c23 |
// QImage for some reason.
|
|
Le-dragon-dev |
412c23 |
// Bug 3604: https://github.com/opentoonz/opentoonz/issues/3604
|
|
luz paz |
266edb |
// (21/1/2022) Use this workaround for all platforms as the crash also
|
|
luz paz |
266edb |
// occurred in windows when the display is scaled up.
|
|
shun-iwasawa |
8a5ab1 |
if (chars[0].isSpace()) {
|
|
shun-iwasawa |
8a5ab1 |
int w = QFontMetrics(m_pimpl->m_font).horizontalAdvance(chars[0]);
|
|
shun-iwasawa |
8a5ab1 |
outImage =
|
|
shun-iwasawa |
8a5ab1 |
QImage(w, raw.ascent() + raw.descent(), QImage::Format_Grayscale8);
|
|
shun-iwasawa |
8a5ab1 |
outImage.fill(255);
|
|
shun-iwasawa |
8a5ab1 |
return getDistance(charcode, nextCharCode);
|
|
Le-dragon-dev |
412c23 |
}
|
|
shun_iwasawa |
df21fa |
QImage image = raw.alphaMapForGlyph(indices[0], QRawFont::PixelAntialiasing);
|
|
shun_iwasawa |
df21fa |
if (image.format() != QImage::Format_Indexed8 &&
|
|
shun_iwasawa |
df21fa |
image.format() != QImage::Format_Alpha8)
|
|
Campbell Barton |
747d5c |
throw TException(L"bad QImage format " + image.format());
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
df21fa |
QRectF boundingRect = raw.boundingRect(indices[0]);
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
df21fa |
outImage = QImage(image.width(), raw.ascent() + raw.descent(),
|
|
shun_iwasawa |
df21fa |
QImage::Format_Grayscale8);
|
|
shun_iwasawa |
df21fa |
outImage.fill(255);
|
|
shun_iwasawa |
df21fa |
QPainter painter(&outImage);
|
|
shun_iwasawa |
df21fa |
painter.drawImage(0, boundingRect.top() + raw.ascent(), image);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
return getDistance(charcode, nextCharCode);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TPoint TFont::drawChar(TRasterCM32P &outImage, TPoint &unused, int inkId,
|
|
Campbell Barton |
747d5c |
wchar_t charcode, wchar_t nextCharCode) const {
|
|
shun_iwasawa |
df21fa |
QImage grayAppImage;
|
|
Campbell Barton |
747d5c |
this->drawChar(grayAppImage, unused, charcode, nextCharCode);
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
df21fa |
int lx = grayAppImage.width();
|
|
shun_iwasawa |
df21fa |
int ly = grayAppImage.height();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
outImage = TRasterCM32P(lx, ly);
|
|
shun_iwasawa |
df21fa |
outImage->lock();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
assert(TPixelCM32::getMaxTone() == 255);
|
|
Campbell Barton |
747d5c |
TPixelCM32 bgColor(0, 0, TPixelCM32::getMaxTone());
|
|
Campbell Barton |
747d5c |
int ty = 0;
|
|
shun_iwasawa |
df21fa |
|
|
Campbell Barton |
747d5c |
for (int gy = ly - 1; gy >= 0; --gy, ++ty) {
|
|
shun_iwasawa |
df21fa |
uchar *srcPix = grayAppImage.scanLine(gy);
|
|
Campbell Barton |
747d5c |
TPixelCM32 *tarPix = outImage->pixels(ty);
|
|
Campbell Barton |
747d5c |
for (int x = 0; x < lx; ++x) {
|
|
shun_iwasawa |
df21fa |
int tone = (int)(*srcPix);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (tone == 255)
|
|
Campbell Barton |
747d5c |
*tarPix = bgColor;
|
|
Campbell Barton |
747d5c |
else
|
|
Campbell Barton |
747d5c |
*tarPix = TPixelCM32(inkId, 0, tone);
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
++srcPix;
|
|
Campbell Barton |
747d5c |
++tarPix;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
outImage->unlock();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
return getDistance(charcode, nextCharCode);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TPoint TFont::getDistance(wchar_t firstChar, wchar_t secondChar) const {
|
|
shun_iwasawa |
6c2748 |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return TPoint(metrics.width(QChar(firstChar)), 0);
|
|
shun_iwasawa |
6c2748 |
}
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getMaxWidth() const {
|
|
shun_iwasawa |
6c2748 |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.maxWidth();
|
|
shun_iwasawa |
6c2748 |
}
|
|
shun_iwasawa |
6c2748 |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getLineAscender() const {
|
|
shun_iwasawa |
6c2748 |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.ascent();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getLineDescender() const {
|
|
Campbell Barton |
747d5c |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.descent();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getLineSpacing() const {
|
|
Campbell Barton |
747d5c |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.lineSpacing();
|
|
Campbell Barton |
747d5c |
}
|
|
shun_iwasawa |
6c2748 |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getHeight() const {
|
|
Campbell Barton |
747d5c |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.height();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
shun_iwasawa |
6c2748 |
int TFont::getAverageCharWidth() const {
|
|
Campbell Barton |
747d5c |
QFontMetrics metrics(m_pimpl->m_font);
|
|
shun_iwasawa |
6c2748 |
return metrics.averageCharWidth();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
bool TFont::hasKerning() const { return m_pimpl->m_font.kerning(); }
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
bool TFont::hasVertical() const {
|
|
Campbell Barton |
747d5c |
// FIXME
|
|
Campbell Barton |
747d5c |
return false;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//-----------------------------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//=============================================================================
|
|
Campbell Barton |
747d5c |
//==================== TFontManager =====================================
|
|
Campbell Barton |
747d5c |
//=============================================================================
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
struct TFontManager::Impl {
|
|
Campbell Barton |
747d5c |
QFontDatabase *m_qfontdb;
|
|
Campbell Barton |
747d5c |
bool m_loaded;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont *m_currentFont;
|
|
Campbell Barton |
747d5c |
wstring m_currentFamily;
|
|
Campbell Barton |
747d5c |
wstring m_currentTypeface;
|
|
Campbell Barton |
747d5c |
int m_size;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
// this option is set by library user when he wants to write vertically.
|
|
Campbell Barton |
747d5c |
// In this implementation, if m_vertical is true and the font
|
|
Campbell Barton |
747d5c |
// has the @-version, the library use it.
|
|
Campbell Barton |
747d5c |
bool m_vertical;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
Impl()
|
|
Campbell Barton |
747d5c |
: m_qfontdb(NULL)
|
|
Campbell Barton |
747d5c |
, m_loaded(false)
|
|
Campbell Barton |
747d5c |
, m_currentFont(0)
|
|
Campbell Barton |
747d5c |
, m_size(0)
|
|
Campbell Barton |
747d5c |
, m_vertical(false) {}
|
|
Campbell Barton |
747d5c |
~Impl() { delete m_qfontdb; }
|
|
Campbell Barton |
747d5c |
};
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFontManager::TFontManager() { m_pimpl = new TFontManager::Impl(); }
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFontManager::~TFontManager() { delete m_pimpl; }
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFontManager *TFontManager::instance() {
|
|
Campbell Barton |
747d5c |
static TFontManager theManager;
|
|
Campbell Barton |
747d5c |
return &theManager;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::loadFontNames() {
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_loaded) return;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
m_pimpl->m_qfontdb = new QFontDatabase;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_qfontdb->families().empty()) throw TFontLibraryLoadingError();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
m_pimpl->m_loaded = true;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::setFamily(const wstring family) {
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_currentFamily == family) return;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QString qFamily = QString::fromStdWString(family);
|
|
Campbell Barton |
747d5c |
QStringList families = m_pimpl->m_qfontdb->families();
|
|
Campbell Barton |
747d5c |
if (!families.contains(qFamily)) throw TFontCreationError();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFamily = family;
|
|
Campbell Barton |
747d5c |
|
|
Shinya Kitaoka |
d1f6c4 |
// XXX: if current style is not valid for family, reset it?
|
|
luz paz |
6454c4 |
// doing so asserts when choosing a font in the GUI
|
|
Campbell Barton |
747d5c |
#if 0
|
|
Campbell Barton |
747d5c |
QStringList styles = m_pimpl->m_qfontdb->styles(qFamily);
|
|
Campbell Barton |
747d5c |
if (styles.contains(QString::fromStdWString(m_pimpl->m_currentTypeface))) {
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentTypeface = L"";
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
#endif
|
|
Campbell Barton |
747d5c |
delete m_pimpl->m_currentFont;
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFont = new TFont(
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFamily, m_pimpl->m_currentTypeface, m_pimpl->m_size);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::setTypeface(const wstring typeface) {
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_currentTypeface == typeface) return;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QString qTypeface = QString::fromStdWString(typeface);
|
|
Campbell Barton |
747d5c |
QStringList styles = m_pimpl->m_qfontdb->styles(
|
|
Campbell Barton |
747d5c |
QString::fromStdWString(m_pimpl->m_currentFamily));
|
|
Campbell Barton |
747d5c |
if (!styles.contains(qTypeface)) {
|
|
Campbell Barton |
747d5c |
throw TFontCreationError();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentTypeface = typeface;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
delete m_pimpl->m_currentFont;
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFont = new TFont(
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFamily, m_pimpl->m_currentTypeface, m_pimpl->m_size);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::setSize(int size) {
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_size == size) return;
|
|
Campbell Barton |
747d5c |
m_pimpl->m_size = size;
|
|
Campbell Barton |
747d5c |
delete m_pimpl->m_currentFont;
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFont = new TFont(
|
|
Campbell Barton |
747d5c |
m_pimpl->m_currentFamily, m_pimpl->m_currentTypeface, m_pimpl->m_size);
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
wstring TFontManager::getCurrentFamily() const {
|
|
Campbell Barton |
747d5c |
return m_pimpl->m_currentFamily;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
wstring TFontManager::getCurrentTypeface() const {
|
|
Campbell Barton |
747d5c |
return m_pimpl->m_currentTypeface;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
TFont *TFontManager::getCurrentFont() {
|
|
Campbell Barton |
747d5c |
if (m_pimpl->m_currentFont) {
|
|
Campbell Barton |
747d5c |
return m_pimpl->m_currentFont;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (!m_pimpl->m_currentFont) {
|
|
Campbell Barton |
747d5c |
loadFontNames();
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
assert(!m_pimpl->m_qfontdb->families().empty());
|
|
Campbell Barton |
747d5c |
setFamily(m_pimpl->m_qfontdb->families().first().toStdWString());
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
return m_pimpl->m_currentFont;
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::getAllFamilies(vector<wstring> &families) const {</wstring>
|
|
Campbell Barton |
747d5c |
QStringList qFamilies = m_pimpl->m_qfontdb->families();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
families.clear();
|
|
Campbell Barton |
747d5c |
families.reserve(qFamilies.count());
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QStringList::const_iterator it = qFamilies.begin();
|
|
Campbell Barton |
747d5c |
for (; it != qFamilies.end(); ++it) {
|
|
manongjohn |
b66bc4 |
if (!m_pimpl->m_qfontdb->isPrivateFamily(*it))
|
|
manongjohn |
b66bc4 |
families.push_back(it->toStdWString());
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::getAllTypefaces(vector<wstring> &typefaces) const {</wstring>
|
|
Campbell Barton |
747d5c |
typefaces.clear();
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
QStringList qStyles = m_pimpl->m_qfontdb->styles(
|
|
Campbell Barton |
747d5c |
QString::fromStdWString(m_pimpl->m_currentFamily));
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
if (qStyles.empty()) return;
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
typefaces.reserve(qStyles.count());
|
|
Campbell Barton |
747d5c |
QStringList::const_iterator it_typeface = qStyles.begin();
|
|
Campbell Barton |
747d5c |
for (; it_typeface != qStyles.end(); ++it_typeface) {
|
|
Campbell Barton |
747d5c |
typefaces.push_back(it_typeface->toStdWString());
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
void TFontManager::setVertical(bool vertical) {}
|
|
Campbell Barton |
747d5c |
|
|
Campbell Barton |
747d5c |
//---------------------------------------------------------
|
|
shun_iwasawa |
df21fa |
|
|
shun_iwasawa |
df21fa |
bool TFontManager::isBold(const QString &family, const QString &style) {
|
|
shun_iwasawa |
df21fa |
return m_pimpl->m_qfontdb->bold(family, style);
|
|
shun_iwasawa |
df21fa |
}
|
|
shun_iwasawa |
df21fa |
|
|
shun_iwasawa |
df21fa |
//---------------------------------------------------------
|
|
shun_iwasawa |
df21fa |
|
|
shun_iwasawa |
df21fa |
bool TFontManager::isItalic(const QString &family, const QString &style) {
|
|
shun_iwasawa |
df21fa |
return m_pimpl->m_qfontdb->italic(family, style);
|
|
shun_iwasawa |
df21fa |
}
|