📄 context2d.cpp
字号:
pen.setJoinStyle(Qt::MiterJoin); m_painter.setPen(pen);}void Context2D::setMiterLimit(qreal m){ QPen pen = m_painter.pen(); pen.setMiterLimit(m); m_painter.setPen(pen);}qreal Context2D::lineWidth() const{ return m_painter.pen().widthF();}QString Context2D::lineCap() const{ return QString();}QString Context2D::lineJoin() const{ return QString();}qreal Context2D::miterLimit() const{ return 0;}void Context2D::setShadowOffsetX(qreal x){ Q_UNUSED(x);}void Context2D::setShadowOffsetY(qreal y){ Q_UNUSED(y);}void Context2D::setShadowBlur(qreal b){ Q_UNUSED(b);}void Context2D::setShadowColor(const QColor &c){ Q_UNUSED(c);}qreal Context2D::shadowOffsetX() const{ return 0;}qreal Context2D::shadowOffsetY() const{ return 0;}qreal Context2D::shadowBlur() const{ return 0;}QColor Context2D::shadowColor() const{ return QColor();}void Context2D::clearRect(qreal x, qreal y, qreal w, qreal h){ m_painter.save(); m_painter.setCompositionMode(QPainter::CompositionMode_Source); m_painter.fillRect(QRectF(x, y, w, h), QColor(0, 0, 0, 0)); m_painter.restore();}void Context2D::fillRect(qreal x, qreal y, qreal w, qreal h){ m_painter.fillRect(QRectF(x, y, w, h), m_painter.brush());}void Context2D::strokeRect(qreal x, qreal y, qreal w, qreal h){ QPainterPath path; path.addRect(x, y, w, h); m_painter.strokePath(path, m_painter.pen());}void Context2D::beginPath(){ m_path = QPainterPath(); m_state.creatingShape = true;}void Context2D::closePath(){ m_path.closeSubpath(); m_state.creatingShape = false;}void Context2D::moveTo(qreal x, qreal y){ QPointF pt = m_state.matrix.map(QPointF(x, y)); m_path.moveTo(pt);}void Context2D::lineTo(qreal x, qreal y){ QPointF pt = m_state.matrix.map(QPointF(x, y)); m_path.lineTo(pt);}void Context2D::quadraticCurveTo(qreal cpx, qreal cpy, qreal x, qreal y){ QPointF cp = m_state.matrix.map(QPointF(cpx, cpy)); QPointF xy = m_state.matrix.map(QPointF(x, y)); m_path.quadTo(cp, xy);}void Context2D::bezierCurveTo(qreal cp1x, qreal cp1y, qreal cp2x, qreal cp2y, qreal x, qreal y){ QPointF cp1 = m_state.matrix.map(QPointF(cp1x, cp1y)); QPointF cp2 = m_state.matrix.map(QPointF(cp2x, cp2y)); QPointF end = m_state.matrix.map(QPointF(x, y)); m_path.cubicTo(cp1, cp2, end);}void Context2D::arcTo(qreal x1, qreal y1, qreal x2, qreal y2, qreal radius){ //FIXME: this is surely busted QPointF st = m_state.matrix.map(QPointF(x1, y1)); QPointF end = m_state.matrix.map(QPointF(x2, y2)); m_path.arcTo(st.x(), st.y(), end.x()-st.x(), end.y()-st.y(), radius, 90);}void Context2D::rect(qreal x, qreal y, qreal w, qreal h){ QPainterPath path; path.addRect(x, y, w, h); path = m_state.matrix.map(path); m_path.addPath(path);}void Context2D::arc(qreal xc, qreal yc, qreal radius, qreal sar, qreal ear, bool anticlockwise){ //### HACK // In Qt we don't switch the coordinate system for degrees // and still use the 0,0 as bottom left for degrees so we need // to switch sar = -sar; ear = -ear; anticlockwise = !anticlockwise; //end hack float sa = DEGREES(sar); float ea = DEGREES(ear); double span = 0; double xs = xc - radius; double ys = yc - radius; double width = radius*2; double height = radius*2; if (!anticlockwise && (ea < sa)) { span += 360; } else if (anticlockwise && (sa < ea)) { span -= 360; } //### this is also due to switched coordinate system // we would end up with a 0 span instead of 360 if (!(qFuzzyCompare(span + (ea - sa), 0.0) && qFuzzyCompare(qAbs(span), 360.0))) { span += ea - sa; } QPainterPath path; path.moveTo(QPointF(xc + radius * cos(sar), yc - radius * sin(sar))); path.arcTo(xs, ys, width, height, sa, span); path = m_state.matrix.map(path); m_path.addPath(path);}void Context2D::fill(){ m_painter.fillPath(m_path, m_painter.brush()); m_state.creatingShape = false;}void Context2D::stroke(){ m_painter.strokePath(m_path, m_painter.pen()); m_state.creatingShape = false;}void Context2D::clip(){ m_painter.setClipPath(m_path);}bool Context2D::isPointInPath(qreal x, qreal y) const{ return m_path.contains(QPointF(x, y));}ImageData Context2D::getImageData(qreal sx, qreal sy, qreal sw, qreal sh){ Q_UNUSED(sx); Q_UNUSED(sy); Q_UNUSED(sw); Q_UNUSED(sh); return ImageData();}void Context2D::putImageData(ImageData image, qreal dx, qreal dy){ Q_UNUSED(image); Q_UNUSED(dx); Q_UNUSED(dy);}Context2D::Context2D(QContext2DCanvas *parent) : QObject(parent), m_cache(parent->size(), QImage::Format_ARGB32_Premultiplied){ m_cache.fill(qRgba(0,0,0,0)); CanvasGradientData::setup(parent->engine()); begin();}const QImage &Context2D::end(){ if (m_painter.isActive()) m_painter.end(); m_state.creatingShape = false; return m_cache;}void Context2D::begin(){ if (!m_painter.isActive()) { m_painter.begin(&m_cache); m_painter.setRenderHint(QPainter::Antialiasing); m_painter.setBrush(Qt::black); }}void Context2D::clear(){ m_cache.fill(qRgba(0,0,0,0));}void Context2D::setSize(int w, int h){ if (m_painter.isActive()) end(); QImage newi(w, h, QImage::Format_ARGB32_Premultiplied); newi.fill(qRgba(0,0,0,0)); QPainter p(&newi); p.drawImage(0, 0, m_cache); p.end(); m_cache = newi; begin();}void Context2D::drawImage(DomImage *image, qreal dx, qreal dy){ if (!image) return; if (dx < 0) { qreal sx = qAbs(dx); qreal sy = qAbs(dy); qreal sw = image->width() - sx; qreal sh = image->height() - sy; drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh); } else { m_painter.drawImage(QPointF(dx, dy), image->image()); }}void Context2D::drawImage(DomImage *image, qreal dx, qreal dy, qreal dw, qreal dh){ if (!image) return; m_painter.drawImage(QRectF(dx, dy, dw, dh).toRect(), image->image());}void Context2D::drawImage(DomImage *image, qreal sx, qreal sy, qreal sw, qreal sh, qreal dx, qreal dy, qreal dw, qreal dh){ if (!image) return; m_painter.drawImage(QRectF(dx, dy, dw, dh), image->image(), QRectF(sx, sy, sw, sh));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -