#include "paintershadowtext.h" #include "imageeffect.h" PainterShadowText::PainterShadowText() { _text = QColor(Qt::white); _shadow = QColor(Qt::black); _antialias = true; } void PainterShadowText::setFont(const QFont font) { _font = QFont(font); } void PainterShadowText::setRadius(qreal radius) { _radius = radius; } void PainterShadowText::setAntialias(bool antialias) { _antialias = antialias; } void PainterShadowText::setTextColor(QColor color) { _text = color; } void PainterShadowText::setShadowColor(QColor color) { _shadow = color; } void PainterShadowText::drawTextPen(int x, int y, QImage &image, const QString string) { drawTextPen(QPoint(x, y), image, string); } void PainterShadowText::drawTextPen(QPoint pos, QImage &image, const QString string) { QPen pen(_shadow); QPainter p(&image); QPainterPath path; QFontMetricsF fm(_font); QStringList lines = string.split('\n'); qreal fontHeight = fm.height(); qreal textOffsetY = fm.ascent(); pen.setWidthF(_radius / 2.f); path.setFillRule(Qt::WindingFill); foreach(QString line, lines) { qreal textOffsetX = image.width() / 2 - fm.width(line) / 2; path.addText(pos.x() + textOffsetX + _radius, pos.y() + textOffsetY + _radius, _font, line); textOffsetY += fontHeight; } image.fill(qRgba(0, 0, 0, 0)); p.strokePath(path, pen); p.fillPath(path, QBrush(_shadow)); blurImage(image, _radius / 2); if(_antialias) { p.setRenderHint(QPainter::Antialiasing, true); } p.fillPath(path, QBrush(_text)); } void PainterShadowText::drawTextBitmap(int x, int y, QImage &image, const QString string) { drawTextBitmap(QPoint(x, y), image, string); } void PainterShadowText::drawTextBitmap(QPoint pos, QImage &image, const QString string) { QImage text(image.size(), QImage::Format_ARGB32_Premultiplied); QPainter p; QFontMetrics fm(_font); int fontHeight = fm.ascent(); text.fill(qRgba(0, 0, 0, 0)); image.fill(qRgba(0, 0, 0, 0)); p.begin(&text); p.setPen(_text); p.setFont(_font); p.drawText(pos.x(), pos.y() + fontHeight, string); p.end(); const int width = image.width(); const int height = image.height(); const int r = _shadow.red(); const int g = _shadow.green(); const int b = _shadow.blue(); for(int x = 1; x < width - 1; x++) { for(int y = 1; y < height - 1; y++) { const int alpha = qAlpha(text.pixel(x, y)); int alpha1 = qAlpha(image.pixel(x + 1, y + 1)); int alpha2 = qAlpha(image.pixel(x + 1, y - 1)); int alpha3 = qAlpha(image.pixel(x - 1, y + 1)); int alpha4 = qAlpha(image.pixel(x - 1, y - 1)); alpha1 = qMax(alpha, alpha1); alpha2 = qMax(alpha, alpha2); alpha3 = qMax(alpha, alpha3); alpha4 = qMax(alpha, alpha4); image.setPixel(x + 1, y + 1, qRgba(r, g, b, alpha1)); image.setPixel(x + 1, y - 1, qRgba(r, g, b, alpha2)); image.setPixel(x - 1, y + 1, qRgba(r, g, b, alpha3)); image.setPixel(x - 1, y - 1, qRgba(r, g, b, alpha4)); alpha1 = qAlpha(image.pixel(x + 1, y)); alpha2 = qAlpha(image.pixel(x, y + 1)); alpha3 = qAlpha(image.pixel(x - 1, y)); alpha4 = qAlpha(image.pixel(x, y - 1)); alpha1 = qMax(alpha, alpha1); alpha2 = qMax(alpha, alpha2); alpha3 = qMax(alpha, alpha3); alpha4 = qMax(alpha, alpha4); image.setPixel(x + 1, y, qRgba(r, g, b, alpha1)); image.setPixel(x, y + 1, qRgba(r, g, b, alpha2)); image.setPixel(x - 1, y, qRgba(r, g, b, alpha3)); image.setPixel(x, y - 1, qRgba(r, g, b, alpha4)); } } p.begin(&image); p.drawImage(0, 0, text); p.end(); }