10#include <QDomDocument>
12#include <QFontMetrics>
20#ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND
21#include <QApplication>
43 QMapIterator<QChar, KisGbrBrushSP> iter(rhs.
m_brushesMap);
44 while (iter.hasNext()) {
52 void setText(
const QString &text,
const QFont &font) {
59 for (
int i = 0; i <
m_text.length(); i++) {
61 const QChar letter =
m_text.at(i);
68 brush->setSpacing(0.1);
69 brush->makeMaskImage(
false);
76 static QImage
renderChar(
const QString& text,
const QFont &font) {
77#ifdef HAVE_THREADED_TEXT_RENDERING_WORKAROUND
78 QWidget *focusWidget = qApp->focusWidget();
80 QThread *guiThread = focusWidget->thread();
81 if (guiThread != QThread::currentThread()) {
82 warnKrita <<
"WARNING: Rendering text in non-GUI thread!"
83 <<
"That may lead to hangups and crashes on some"
84 <<
"versions of X11/Qt!";
89 QFontMetrics metric(font);
90 QRect
rect = metric.boundingRect(text);
93 rect = QRect(0, 0, 1, 1);
96 QRect paintingRect =
rect.translated(-
rect.x(), -
rect.y());
98 QImage renderedChar(paintingRect.size(), QImage::Format_ARGB32);
100 p.begin(&renderedChar);
102 p.fillRect(paintingRect, Qt::white);
115 Q_ASSERT(
m_text.size() > 0);
137 Q_UNUSED(randomSource);
150 if (
m_text.isEmpty())
return;
202 Q_UNUSED(resourcesInterface);
254 const KisPaintInformation& info,
double subPixelX,
double subPixelY, qreal softnessFactor, qreal lightnessStrength)
const
267 double subPixelX,
double subPixelY)
const
281 e.setAttribute(
"type",
"kis_text_brush");
283 e.setAttribute(
"text",
m_text);
284 e.setAttribute(
"font",
m_font.toString());
virtual qint32 maskHeight(KisDabShape const &, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const
virtual enumBrushType brushType() const
virtual void setSpacing(double spacing)
virtual void setAngle(qreal _angle)
virtual void setBrushType(enumBrushType type)
virtual void setScale(qreal _scale)
virtual KisFixedPaintDeviceSP paintDevice(const KoColorSpace *colorSpace, KisDabShape const &, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0) const
virtual void toXML(QDomDocument &, QDomElement &) const
virtual void setBrushTipImage(const QImage &image)
virtual void generateMaskAndApplyMaskOrCreateDab(KisFixedPaintDeviceSP dst, ColoringInformation *coloringInfo, KisDabShape const &, const KisPaintInformation &info, double subPixelX, double subPixelY, qreal softnessFactor, qreal lightnessStrength) const
virtual qint32 maskWidth(KisDabShape const &, qreal subPixelX, qreal subPixelY, const KisPaintInformation &info) const
QVector< QSharedPointer< KisGbrBrush > > m_brushes
void setSpacing(double spacing)
KisFixedPaintDeviceSP paintDevice(const KoColorSpace *colorSpace, KisDabShape const &shape, const KisPaintInformation &info, double subPixelX, double subPixelY)
qint32 maskWidth(KisDabShape const &shape, double subPixelX, double subPixelY, const KisPaintInformation &info)
void addBrush(QSharedPointer< BrushType > brush)
void generateMaskAndApplyMaskOrCreateDab(KisFixedPaintDeviceSP dst, KisBrush::ColoringInformation *coloringInformation, KisDabShape const &shape, const KisPaintInformation &info, double subPixelX, double subPixelY, qreal softnessFactor, qreal lightnessStrength=DEFAULT_LIGHTNESS_STRENGTH)
void prepareForSeqNo(const KisPaintInformation &info, int seqNo)
qint32 maskHeight(KisDabShape const &shape, double subPixelX, double subPixelY, const KisPaintInformation &info)
void setAngle(qreal angle)
void setScale(qreal scale)
void setPipeMode(bool pipe)
void notifyStrokeStarted() override
KoResourceSP clone() const override
bool saveToDevice(QIODevice *dev) const override
KisTextBrushesPipe * m_brushesPipe
void setText(const QString &txt)
bool isEphemeral() const override
void setAngle(qreal _angle) override
void generateMaskAndApplyMaskOrCreateDab(KisFixedPaintDeviceSP dst, KisBrush::ColoringInformation *coloringInformation, KisDabShape const &, const KisPaintInformation &info, double subPixelX=0, double subPixelY=0, qreal softnessFactor=DEFAULT_SOFTNESS_FACTOR, qreal lightnessStrength=1.0) const override
KisFixedPaintDeviceSP paintDevice(const KoColorSpace *colorSpace, KisDabShape const &, const KisPaintInformation &info, double subPixelX, double subPixelY) const override
qint32 maskWidth(KisDabShape const &, double subPixelX, double subPixelY, const KisPaintInformation &info) const override
void setFont(const QFont &font)
qint32 maskHeight(KisDabShape const &, double subPixelX, double subPixelY, const KisPaintInformation &info) const override
void setSpacing(double _spacing) override
quint32 brushIndex() const override
bool loadFromDevice(QIODevice *dev, KisResourcesInterfaceSP resourcesInterface) override
void prepareForSeqNo(const KisPaintInformation &info, int seqNo) override
void setScale(qreal _scale) override
void toXML(QDomDocument &, QDomElement &) const override
KisGbrBrushSP firstBrush() const
KisTextBrushesPipe(const KisTextBrushesPipe &rhs)
void notifyStrokeStarted() override
void updateBrushIndexes(KisRandomSourceSP randomSource, int seqNo) override
void setText(const QString &text, const QFont &font)
int currentBrushIndex() override
void updateBrushIndexesImpl()
int chooseNextBrush(const KisPaintInformation &info) override
static QImage renderChar(const QString &text, const QFont &font)
QMap< QChar, KisGbrBrushSP > m_brushesMap
#define KIS_ASSERT_RECOVER(cond)
QSharedPointer< KisBrush > KisBrushSP
QString toString(const QString &value)
void setValid(bool valid)