You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.9 KiB
205 lines
4.9 KiB
// Very small test app to look at ksvg performance without konqueror overhead (Rob)
|
|
|
|
#include "SVGTestWidget.moc"
|
|
#include "DocumentFactory.h"
|
|
#include "CanvasFactory.h"
|
|
#include "SVGCircleElement.h"
|
|
#include "SVGAnimatedLength.h"
|
|
#include "SVGLength.h"
|
|
#include "SVGSVGElement.h"
|
|
#include "SVGEventImpl.h"
|
|
#include "KSVGCanvas.h"
|
|
#include "CanvasItem.h"
|
|
#include <kcursor.h>
|
|
|
|
using namespace KSVG;
|
|
|
|
SVGTestWidget::SVGTestWidget(const KURL &url)
|
|
{
|
|
setBackgroundColor(TQt::white);
|
|
setMouseTracking(true);
|
|
setFocusPolicy(TQWidget::WheelFocus);
|
|
|
|
m_doc = DocumentFactory::self()->requestDocument(TQT_TQOBJECT(this), TQT_SLOT(slotRenderingFinished()));
|
|
if(!m_doc)
|
|
return;
|
|
|
|
resize(450, 450);
|
|
m_canvas = CanvasFactory::self()->loadCanvas(450, 450);
|
|
if(!m_canvas)
|
|
return;
|
|
|
|
m_canvas->setup(TQT_TQPAINTDEVICE(this), TQT_TQPAINTDEVICE(this));
|
|
|
|
if(!DocumentFactory::self()->attachCanvas(m_canvas, m_doc))
|
|
return;
|
|
|
|
if(!DocumentFactory::self()->startParsing(m_doc, url))
|
|
return;
|
|
}
|
|
|
|
SVGTestWidget::~SVGTestWidget()
|
|
{
|
|
delete m_canvas;
|
|
delete m_doc;
|
|
}
|
|
|
|
void SVGTestWidget::slotRenderingFinished()
|
|
{
|
|
TQRect rect(0, 0, width(), height());
|
|
m_canvas->blit(rect, true);
|
|
|
|
SVGElement test = m_doc->rootElement().getElementById("test");
|
|
if(test.nodeName() == "circle")
|
|
{
|
|
SVGCircleElement c = dom_cast(SVGCircleElement, test);
|
|
c.r().baseVal().setValue(150);
|
|
c.setAttribute("fill", "blue");
|
|
}
|
|
}
|
|
|
|
void SVGTestWidget::paintEvent(TQPaintEvent *event)
|
|
{
|
|
m_canvas->update();
|
|
m_canvas->blit(event->rect(), true);
|
|
}
|
|
|
|
void SVGTestWidget::resizeEvent(TQResizeEvent *event)
|
|
{
|
|
int w = event->size().width();
|
|
int h = event->size().height();
|
|
|
|
m_canvas->resize(w, h);
|
|
resize(w, h);
|
|
m_canvas->blit();
|
|
}
|
|
/*
|
|
KSVG::SVGMouseEventImpl *newMouseEvent(SVGDocument *doc, KSVG::SVGEventImpl::EventId id, TQMouseEvent *event)
|
|
{
|
|
DOM::AbstractView temp;
|
|
|
|
int clientX = event->x();
|
|
int clientY = event->y();
|
|
|
|
if(doc && doc->rootElement())
|
|
{
|
|
clientX = int(clientX / doc->rootElement()->currentScale());
|
|
clientY = int(clientY / doc->rootElement()->currentScale());
|
|
}
|
|
|
|
int button = 0;
|
|
if(event->stateAfter() & Qt::LeftButton)
|
|
button = 1;
|
|
else if(event->stateAfter() & Qt::MidButton)
|
|
button = 2;
|
|
else if(event->stateAfter() & Qt::RightButton)
|
|
button = 3;
|
|
|
|
KSVG::SVGMouseEventImpl *mev = new KSVG::SVGMouseEventImpl(id, // type
|
|
true, // canBubbleArg
|
|
true, // cancelableArg
|
|
temp, // view
|
|
0, // detail
|
|
event->globalX(), //screenXArg
|
|
event->globalY(), // screenYArg,
|
|
clientX, // clientXArg
|
|
clientY, // clientYArg
|
|
(event->state() & TQt::ControlButton), // ctrlKeyArg
|
|
(event->state() & TQt::AltButton), // altKeyArg
|
|
(event->state() & TQt::ShiftButton), // shiftKeyArg
|
|
(event->state() & TQt::MetaButton), // metaKeyArg
|
|
button, // buttonArg
|
|
0);
|
|
|
|
mev->ref();
|
|
|
|
return mev;
|
|
}
|
|
|
|
void SVGTestWidget::mouseMoveEvent(TQMouseEvent *event)
|
|
{
|
|
if(event->state() & TQMouseEvent::ControlButton && event->state() & TQMouseEvent::LeftButton)
|
|
{
|
|
if(m_panningPos.isNull())
|
|
m_panningPos = event->pos();
|
|
else
|
|
{
|
|
TQPoint panPoint = m_oldPanningPos - (m_panningPos - event->pos());
|
|
m_doc->rootElement()->setCurrentTranslate(panPoint);
|
|
// m_doc->syncCachedMatrices(); FIXME
|
|
m_canvas->update(panPoint);
|
|
}
|
|
return;
|
|
}
|
|
else if(event->state() & TQMouseEvent::ControlButton)
|
|
return;
|
|
}
|
|
|
|
void SVGTestWidget::mousePressEvent(TQMouseEvent *event)
|
|
{
|
|
if(event->state() & TQMouseEvent::ControlButton)
|
|
return;
|
|
|
|
KSVG::SVGMouseEventImpl *mev = newMouseEvent(m_doc, KSVG::SVGEventImpl::MOUSEDOWN_EVENT, event);
|
|
|
|
if(m_doc && m_doc->rootElement())
|
|
m_doc->rootElement()->prepareMouseEvent(event->pos(), event->pos(), mev);
|
|
mev->deref();
|
|
}
|
|
|
|
void SVGTestWidget::mouseReleaseEvent(TQMouseEvent *event)
|
|
{
|
|
if(!m_panningPos.isNull())
|
|
{
|
|
m_oldPanningPos = m_oldPanningPos - (m_panningPos - event->pos());
|
|
m_panningPos.setX(0);
|
|
m_panningPos.setY(0);
|
|
}
|
|
|
|
if(event->state() & TQMouseEvent::ControlButton)
|
|
return;
|
|
|
|
// only simulate mouse clicks for now
|
|
KSVG::SVGMouseEventImpl *mev = newMouseEvent(m_doc, KSVG::SVGEventImpl::MOUSEUP_EVENT, event);
|
|
|
|
if(m_doc && m_doc->rootElement())
|
|
m_doc->rootElement()->prepareMouseEvent(event->pos(), event->pos(), mev);
|
|
mev->deref();
|
|
}
|
|
|
|
void SVGTestWidget::keyPressEvent(TQKeyEvent *event)
|
|
{
|
|
if(event->stateAfter() & TQMouseEvent::ControlButton)
|
|
{
|
|
setCursor(KCursor::sizeAllCursor());
|
|
return;
|
|
}
|
|
}
|
|
|
|
void SVGTestWidget::keyReleaseEvent(TQKeyEvent *event)
|
|
{
|
|
if(event->state() & TQMouseEvent::ControlButton)
|
|
{
|
|
setCursor(KCursor::arrowCursor());
|
|
return;
|
|
}
|
|
SVGSVGElementImpl *root = m_doc->rootElement();
|
|
if(!root) return;
|
|
if(event->key() == TQt::Key_Minus)
|
|
{
|
|
erase(0, 0, m_canvas->width(), m_canvas->height());
|
|
float zoomFactor = root->currentScale() / 1.2;
|
|
root->setCurrentScale(zoomFactor);
|
|
m_doc->syncCachedMatrices();
|
|
m_canvas->update(zoomFactor);
|
|
}
|
|
else if(event->key() == TQt::Key_Plus)
|
|
{
|
|
float zoomFactor = root->currentScale() * 1.2;
|
|
root->setCurrentScale(zoomFactor);
|
|
m_doc->syncCachedMatrices();
|
|
m_canvas->update(zoomFactor);
|
|
}
|
|
}
|
|
*/
|