void BoxStyle::unoptimizedPaint(QPainter* painter, int xOffset, int yOffset, int contentBoxWidth, int contentBoxHeight) const { qreal x = xOffset; qreal y = yOffset; int outlineWidth = outline_.style()!=Qt::NoPen ? outline_.width() : 0; // Move the figure when using antialiasing. The outline will start at a pixel boundary. This makes it sharper. if ( painter->testRenderHint(QPainter::Antialiasing) || painter->testRenderHint(QPainter::HighQualityAntialiasing) ) if ( outline().style() != Qt::NoPen) { x = xOffset + outlineWidth/2.0; y = yOffset + outlineWidth/2.0; } // Draw shadow if ( shadow() != Qt::NoBrush ) { painter->setPen(Qt::NoPen); painter->setBrush(shadow()); painter->drawPath(getRectanglePath(xOffset + xShadowOffset(), yOffset + yShadowOffset(), contentBoxWidth, contentBoxHeight)); } // Draw box. painter->setPen(outline()); // Set the brush and fix the gradient if needed. if ( background().style() == Qt::LinearGradientPattern && background().gradient()->coordinateMode() == QGradient::LogicalMode ) { QLinearGradient g = *(static_cast<const QLinearGradient*> (background().gradient())); g.setStart(x + g.start().x(), y + g.start().y()); g.setFinalStop(x + g.finalStop().x(), y + g.finalStop().y()); painter->setBrush(g); } else if ( background().style() == Qt::RadialGradientPattern && background().gradient()->coordinateMode() == QGradient::LogicalMode ) { QRadialGradient g = *(static_cast<const QRadialGradient*> (background().gradient())); g.setCenter(x + g.center().x(), y + g.center().y()); g.setFocalPoint(x + g.focalPoint().x(), y + g.focalPoint().y()); painter->setBrush(g); } else { painter->setBrush(background()); } painter->drawPath(getRectanglePath(x, y, contentBoxWidth - outlineWidth, contentBoxHeight - outlineWidth)); }
void tst_QBrush::testQRadialGradientSetters() { QRadialGradient rg; QCOMPARE(rg.radius(), qreal(1.0)); QCOMPARE(rg.center(), QPointF(0, 0)); QCOMPARE(rg.focalPoint(), QPointF(0, 0)); rg.setRadius(100); QCOMPARE(rg.radius(), qreal(100.0)); rg.setCenter(101, 102); QCOMPARE(rg.center(), QPointF(101, 102)); rg.setCenter(QPointF(201, 202)); QCOMPARE(rg.center(), QPointF(201, 202)); rg.setFocalPoint(103, 104); QCOMPARE(rg.focalPoint(), QPointF(103, 104)); rg.setFocalPoint(QPointF(203, 204)); QCOMPARE(rg.focalPoint(), QPointF(203, 204)); }
KoStopGradient * KoStopGradient::fromQGradient(QGradient * gradient) { if (! gradient) return 0; KoStopGradient * newGradient = new KoStopGradient(""); newGradient->setType(gradient->type()); newGradient->setSpread(gradient->spread()); switch (gradient->type()) { case QGradient::LinearGradient: { QLinearGradient * g = static_cast<QLinearGradient*>(gradient); newGradient->m_start = g->start(); newGradient->m_stop = g->finalStop(); newGradient->m_focalPoint = g->start(); break; } case QGradient::RadialGradient: { QRadialGradient * g = static_cast<QRadialGradient*>(gradient); newGradient->m_start = g->center(); newGradient->m_stop = g->center() + QPointF(g->radius(), 0); newGradient->m_focalPoint = g->focalPoint(); break; } case QGradient::ConicalGradient: { QConicalGradient * g = static_cast<QConicalGradient*>(gradient); qreal radian = g->angle() * M_PI / 180.0; newGradient->m_start = g->center(); newGradient->m_stop = QPointF(100.0 * cos(radian), 100.0 * sin(radian)); newGradient->m_focalPoint = g->center(); break; } default: delete newGradient; return 0; } Q_FOREACH (const QGradientStop & stop, gradient->stops()) { KoColor color(newGradient->colorSpace()); color.fromQColor(stop.second); newGradient->m_stops.append(KoGradientStop(stop.first, color)); } return newGradient; }
void BitmapImage::drawEllipse( QRectF rectangle, QPen pen, QBrush brush, QPainter::CompositionMode cm, bool antialiasing) { int width = pen.width(); extend( rectangle.adjusted(-width,-width,width,width).toRect() ); if (brush.style() == Qt::RadialGradientPattern) { QRadialGradient* gradient = (QRadialGradient*)brush.gradient(); gradient->setCenter( gradient->center() - topLeft() ); gradient->setFocalPoint( gradient->focalPoint() - topLeft() ); } if (mImage != NULL && !mImage->isNull() ) { QPainter painter(mImage); painter.setCompositionMode(cm); painter.setRenderHint(QPainter::Antialiasing, antialiasing); painter.setPen(pen); painter.setBrush(brush); //if (brush == Qt::NoBrush) painter.drawEllipse( rectangle.translated(-topLeft()) ); painter.end(); } }
void BitmapImage::drawRect(QRectF rectangle, QPen pen, QBrush brush, QPainter::CompositionMode cm, bool antialiasing) { int width = pen.width(); setCompositionModeBounds(rectangle.adjusted(-width, -width, width, width).toRect(), true, cm); if (brush.style() == Qt::RadialGradientPattern) { QRadialGradient* gradient = (QRadialGradient*)brush.gradient(); gradient->setCenter(gradient->center() - mBounds.topLeft()); gradient->setFocalPoint(gradient->focalPoint() - mBounds.topLeft()); } if (!image()->isNull()) { QPainter painter(image()); painter.setCompositionMode(cm); painter.setRenderHint(QPainter::Antialiasing, antialiasing); painter.setPen(pen); painter.setBrush(brush); painter.drawRect(rectangle.translated(-mBounds.topLeft())); painter.end(); } modification(); }
void Mask::mask_slot(){ int countSel = gsri->countSelected(); GObjectInterface *iObj, *endObj=gsri->selected(gsri->countSelected()-1);//создаём контейнер с выделенными рамкой объектами qreal k_h, k_w, width_iObj, width_endObj = endObj->boundingRect().width(), height_iObj, height_endObj = endObj->boundingRect().height(); QBrush endObjBrush = endObj->brush(); if(endObjBrush.style() == Qt::RadialGradientPattern || endObjBrush.style() == Qt::ConicalGradientPattern || endObjBrush.style() == Qt::LinearGradientPattern){ for (int i=0; i<countSel-1; i++){ iObj = gsri->selected(i); QBrush inters = iObj->brush(); qreal iObjAlpha = inters.color().alphaF(); QGradient qg = *endObjBrush.gradient(); height_iObj = iObj->boundingRect().height(); width_iObj = iObj->boundingRect().width(); k_h = height_endObj/height_iObj;//считаем коэффициенты пропорциональности фигур для умножения--> k_w = width_endObj/width_iObj;//-->на точки градиента(чтобы градиенты не зависели от размеров фигур). int d_x = iObj->boundingRect().x() - endObj->boundingRect().x();//вычисляем расстояния между левыми краями фигур int d_y = iObj->boundingRect().y() - endObj->boundingRect().y(); qreal k_shift_x = ( d_x / width_endObj) * k_w,//вычисляем коэффициенты сдвига градиента по ширине--> k_shift_y = (d_y / height_endObj) * k_h;//--> и по высотке QGradientStops grStops(qg.stops());//копируем точки/цвета задаваемого градиента. QColor BrushColor = inters.gradient()->stops()[0].second; for(int j=0; j<grStops.count(); j++){ grStops[j].second.setRgbF( BrushColor.redF(), BrushColor.greenF(), BrushColor.blueF(), grStops[j].second.alphaF()*iObjAlpha); } if(qg.type() == QGradient::LinearGradient){ QLinearGradient qlg = *static_cast<const QLinearGradient *>(endObjBrush.gradient()); QLinearGradient qlgLinear(qlg.start().x() * k_w - k_shift_x, qlg.start().y() * k_h - k_shift_y, qlg.finalStop().x() * k_w - k_shift_x, qlg.finalStop().y() * k_h - k_shift_y); qlgLinear.setStops(grStops); iObj->setBrush(qlgLinear); } if(qg.type() == QGradient::RadialGradient){ for(int j=0; j<grStops.count(); j++) grStops[j].first *= k_w; QRadialGradient qlg = *static_cast<const QRadialGradient *>(endObjBrush.gradient()); QRadialGradient qlgRadial(QPointF(qlg.center().x()*k_w - k_shift_x, qlg.center().y()*k_h - k_shift_y), qlg.radius(), QPointF(qlg.focalPoint().x()*k_w - k_shift_x, qlg.focalPoint().y()*k_h - k_shift_y), qlg.focalRadius()); qlgRadial.setStops(grStops); iObj->setBrush(qlgRadial); } if(qg.type() == QGradient::ConicalGradient){ QConicalGradient qlg = *static_cast<const QConicalGradient *>(endObjBrush.gradient()); QConicalGradient qlgConical(QPointF(qlg.center().x()*k_w - k_shift_x, qlg.center().y()*k_h - k_shift_y), qlg.angle()); qlgConical.setStops(grStops); iObj->setBrush(qlgConical); } } endObj->setVisible(false); } else{ QMessageBox m; m.setText(tr("upper figure does not contain a gradient")); m.exec(); } gsri->reset(); }