void CMonitorWidget::DrawInformations(Gdiplus::Graphics & graphics) { CRect rcDuration, rcPages, rcDiskSpace; pStaticDuration.GetWindowRect(rcDuration); pStaticPages.GetWindowRect(rcPages); pStaticDiskSpace.GetWindowRect(rcDiskSpace); ScreenToClient(rcDuration); ScreenToClient(rcPages); ScreenToClient(rcDiskSpace); Gdiplus::SolidBrush textBrush(Gdiplus::Color(150, 0,0,0)); Gdiplus::SolidBrush shadowBrush(Gdiplus::Color(150, 255, 255, 255)); Gdiplus::Font font(_T("Arial"), m_nFontSize, Gdiplus::FontStyleBold, Gdiplus::UnitPixel); if(m_bShowDuration) { Gdiplus::PointF textOrigin(rcDuration.left, rcDuration.top); Gdiplus::PointF textOriginShadow(rcDuration.left, rcDuration.top+1); graphics.DrawString(m_csDuration, m_csDuration.GetLength(), &font, textOriginShadow, &shadowBrush); graphics.DrawString(m_csDuration, m_csDuration.GetLength(), &font, textOrigin, &textBrush); } if(m_bShowPages) { Gdiplus::PointF textOrigin(rcPages.left, rcPages.top); Gdiplus::PointF textOriginShadow(rcPages.left, rcPages.top+1); graphics.DrawString(m_csPages, m_csPages.GetLength(), &font, textOriginShadow, &shadowBrush); graphics.DrawString(m_csPages, m_csPages.GetLength(), &font, textOrigin, &textBrush); } if(m_bShowDiskSpace) { Gdiplus::PointF textOrigin(rcDiskSpace.left, rcDiskSpace.top); Gdiplus::PointF textOriginShadow(rcDiskSpace.left, rcDiskSpace.top+1); graphics.DrawString(m_csDiskSpace, m_csDiskSpace.GetLength(), &font, textOriginShadow, &shadowBrush); graphics.DrawString(m_csDiskSpace, m_csDiskSpace.GetLength(), &font, textOrigin, &textBrush); } }
QImage RichTextRenderer::renderText() { // qDebug()<<itemName()<<"TextBoxWarmingThread::run(): htmlCode:"<<htmlCode; //qDebug() << "RichTextRenderer::renderText(): HTML:"<<html(); //qDebug() << "RichTextRenderer::update(): Update Start..."; //qDebug() << "RichTextRenderer::renderText(): \t in thread:"<<QThread::currentThreadId(); if(m_updateTimer.isActive()) m_updateTimer.stop(); QTime renderTime; renderTime.start(); QTextDocument doc; QTextDocument shadowDoc; if (Qt::mightBeRichText(html())) { doc.setHtml(html()); shadowDoc.setHtml(html()); } else { doc.setPlainText(html()); shadowDoc.setPlainText(html()); } int textWidth = m_textWidth; doc.setTextWidth(textWidth); shadowDoc.setTextWidth(textWidth); // Apply outline pen to the html QTextCursor cursor(&doc); cursor.select(QTextCursor::Document); QTextCharFormat format; QPen p(Qt::NoPen); if(outlineEnabled()) { p = outlinePen(); p.setJoinStyle(Qt::MiterJoin); } format.setTextOutline(p); //format.setForeground(fillEnabled() ? fillBrush() : Qt::NoBrush); //Qt::white); cursor.mergeCharFormat(format); // Setup the shadow text formatting if enabled if(shadowEnabled()) { if(shadowBlurRadius() <= 0.05) { QTextCursor cursor(&shadowDoc); cursor.select(QTextCursor::Document); QTextCharFormat format; format.setTextOutline(Qt::NoPen); format.setForeground(shadowBrush()); cursor.mergeCharFormat(format); } } QSizeF shadowSize = shadowEnabled() ? QSizeF(shadowOffsetX(),shadowOffsetY()) : QSizeF(0,0); QSizeF docSize = doc.size(); QSizeF padSize(12.,12.); QSizeF sumSize = (docSize + shadowSize + padSize);//.toSize(); QSizeF scaledSize = QSizeF(sumSize.width() * m_scaling.x(), sumSize.height() * m_scaling.y()); if(m_scaling.x() != 1. || m_scaling.y() != 1.) { //qDebug() << "RichTextRenderer::renderText(): Orig size:"<<sumSize<<", scaled size:"<<scaledSize<<", scaling:"<<m_scaling; m_rawSize = sumSize; } //qDebug() << "RichTextRenderer::update(): textWidth: "<<textWidth<<", shadowSize:"<<shadowSize<<", docSize:"<<docSize<<", sumSize:"<<sumSize; QImage cache(scaledSize.toSize(),QImage::Format_ARGB32); //_Premultiplied); memset(cache.scanLine(0),0,cache.byteCount()); double padSizeHalfX = padSize.width() / 2; double padSizeHalfY = padSize.height() / 2; QPainter textPainter(&cache); textPainter.scale(m_scaling.x(), m_scaling.y()); //textPainter.fillRect(cache.rect(),Qt::transparent); QAbstractTextDocumentLayout::PaintContext pCtx; //qDebug() << "RichTextRenderer::renderText(): shadowEnabled():"<<shadowEnabled()<<", shadowBlurRadius():"<<shadowBlurRadius(); if(shadowEnabled()) { if(shadowBlurRadius() <= 0.05) { // render a "cheap" version of the shadow using the shadow text document textPainter.save(); textPainter.translate(shadowOffsetX(),shadowOffsetY()); shadowDoc.documentLayout()->draw(&textPainter, pCtx); textPainter.restore(); } else { double radius = shadowBlurRadius(); // create temporary pixmap to hold a copy of the text QSizeF blurSize = ImageFilters::blurredSizeFor(doc.size(), (int)radius); QSizeF scaledBlurSize = QSize(blurSize.width() * m_scaling.x(), blurSize.height() * m_scaling.y()); //QSize docSize = doc.size(); //qDebug() << "RichTextRenderer::renderText(): [shadow] radius:"<<radius<<" blurSize:"<<blurSize<<", scaling:"<<m_scaling<<", scaledBlurSize:"<<scaledBlurSize; //qDebug() << "Blur size:"<<blurSize<<", doc:"<<doc.size()<<", radius:"<<radius; QImage tmpImage(scaledBlurSize.toSize(),QImage::Format_ARGB32_Premultiplied); memset(tmpImage.scanLine(0),0,tmpImage.byteCount()); // render the text QPainter tmpPainter(&tmpImage); tmpPainter.scale(m_scaling.x(), m_scaling.y()); tmpPainter.save(); tmpPainter.translate(radius + padSizeHalfX, radius + padSizeHalfY); doc.documentLayout()->draw(&tmpPainter, pCtx); tmpPainter.restore(); // blacken the text by applying a color to the copy using a QPainter::CompositionMode_DestinationIn operation. // This produces a homogeneously-colored pixmap. QRect rect = tmpImage.rect(); tmpPainter.setCompositionMode(QPainter::CompositionMode_SourceIn); tmpPainter.fillRect(rect, shadowBrush().color()); tmpPainter.end(); // blur the colored text ImageFilters::blurImage(tmpImage, (int)radius); // render the blurred text at an offset into the cache textPainter.save(); textPainter.translate(shadowOffsetX() - radius, shadowOffsetY() - radius); textPainter.drawImage(0, 0, tmpImage); textPainter.restore(); } } textPainter.translate(padSizeHalfX, padSizeHalfY); doc.documentLayout()->draw(&textPainter, pCtx); textPainter.end(); m_image = cache.convertToFormat(QImage::Format_ARGB32); emit textRendered(m_image); //qDebug() << "RichTextRenderer::renderText(): Render finished, elapsed:"<<renderTime.elapsed()<<"ms"; //m_image.save("debug-text.png"); return m_image; }
/** * Reimplemented from QGraphicsItem::paint. * Draws the AssociationLine and also takes care of highlighting active point or line. */ void AssociationLine::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget) QPen _pen = pen(); const QColor orig = _pen.color().lighter(); QColor invertedColor(orig.green(), orig.blue(), orig.red()); if (invertedColor == _pen.color()) { // Ensure different color. invertedColor.setRed((invertedColor.red() + 50) % 256); } invertedColor.setAlpha(150); int sz = m_points.size(); if (sz < 1) { // not enough points - do nothing return; } QPointF savedStart = m_points.first(); QPointF savedEnd = m_points.last(); // modify the m_points array not to include the Symbol, the value depends on Symbol if (m_startSymbol) { QPointF newStart = m_startSymbol->mapToParent(m_startSymbol->symbolEndPoints().first); m_points[0] = newStart; } if (m_endSymbol) { QPointF newEnd = m_endSymbol->mapToParent(m_endSymbol->symbolEndPoints().first); m_points[sz - 1] = newEnd; } painter->setPen(_pen); painter->setBrush(Qt::NoBrush); painter->drawPath(path()); if (option->state & QStyle::State_Selected) { // make the association broader in the selected state QPainterPathStroker stroker; stroker.setWidth(3.0); QPainterPath outline = stroker.createStroke(path()); QColor shadowColor(Qt::lightGray); shadowColor.setAlpha(80); QBrush shadowBrush(shadowColor); painter->setBrush(shadowBrush); painter->setPen(Qt::NoPen); painter->drawPath(outline); // set color for selected painting _pen.setColor(Qt::blue); QRectF circle(0, 0, SelectedPointDiameter, SelectedPointDiameter); painter->setBrush(_pen.color()); painter->setPen(Qt::NoPen); // draw points circle.moveCenter(savedStart); painter->drawRect(circle); for (int i = 1; i < sz-1; ++i) { if (i != m_activePointIndex) { circle.moveCenter(m_points.at(i)); painter->drawRect(circle); } } circle.moveCenter(savedEnd); painter->drawRect(circle); if (m_activePointIndex != -1) { painter->setBrush(invertedColor); painter->setPen(Qt::NoPen); circle.setWidth(1.5*SelectedPointDiameter); circle.setHeight(1.5*SelectedPointDiameter); circle.moveCenter(m_points.at(m_activePointIndex)); painter->drawEllipse(circle); } else if (m_activeSegmentIndex != -1) { if (m_layout == Polyline) { painter->setPen(QPen(invertedColor, _pen.widthF() + 1)); painter->setBrush(Qt::NoBrush); QLineF segmentLine(m_points[m_activeSegmentIndex], m_points[m_activeSegmentIndex + 1]); painter->drawLine(segmentLine); } } // debug info if (Tracer::instance()->isEnabled(QString::fromLatin1(metaObject()->className()))) { painter->setPen(Qt::green); painter->setBrush(Qt::NoBrush); painter->drawPath(shape()); painter->setPen(Qt::red); painter->drawRect(boundingRect()); // origin painter->drawLine(-10, 0, 10, 0); painter->drawLine(0, -10, 0, 10); } } // now restore the points array m_points[0] = savedStart; m_points[sz - 1] = savedEnd; }