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.
285 lines
6.2 KiB
285 lines
6.2 KiB
/* This file is part of the KDE project
|
|
Copyright (C) 2001, The Karbon Developers
|
|
Copyright (C) 2002, The Karbon Developers
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Library General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Library General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Library General Public License
|
|
along with this library; see the file COPYING.LIB. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
// qpainter wrapper
|
|
|
|
#include "vqpainter.h"
|
|
#include "vstroke.h"
|
|
#include "vcolor.h"
|
|
#include "vfill.h"
|
|
|
|
#include <qpainter.h>
|
|
#include <qpaintdevice.h>
|
|
#include <qpen.h>
|
|
|
|
#include <KoPoint.h>
|
|
#include <kdebug.h>
|
|
|
|
VQPainter::VQPainter( QPaintDevice *target, unsigned int w, unsigned int h ) : VPainter( target, w, h ), m_painter( 0L ), m_target( target ), m_width( w ), m_height( h )
|
|
{
|
|
m_zoomFactor = 1;
|
|
m_index = 0;
|
|
m_painter = new QPainter( target );
|
|
}
|
|
|
|
VQPainter::~VQPainter()
|
|
{
|
|
delete m_painter;
|
|
}
|
|
|
|
void
|
|
VQPainter::resize( unsigned int w, unsigned int h )
|
|
{
|
|
m_width = w;
|
|
m_height = h;
|
|
}
|
|
|
|
void
|
|
VQPainter::blit( const KoRect & )
|
|
{
|
|
end();
|
|
}
|
|
|
|
void
|
|
VQPainter::clear( const QColor &c )
|
|
{
|
|
m_painter->setBackgroundColor( c );
|
|
m_painter->eraseRect( 0, 0, m_width, m_height );
|
|
}
|
|
|
|
void
|
|
VQPainter::begin()
|
|
{
|
|
if( !m_painter->isActive() )
|
|
{
|
|
m_painter->begin( m_target );
|
|
m_painter->eraseRect( 0, 0, m_width, m_height );
|
|
}
|
|
}
|
|
|
|
void
|
|
VQPainter::end()
|
|
{
|
|
m_painter->end();
|
|
}
|
|
|
|
const QWMatrix
|
|
VQPainter::worldMatrix()
|
|
{
|
|
return m_painter->worldMatrix();
|
|
}
|
|
|
|
void
|
|
VQPainter::setWorldMatrix( const QWMatrix& mat )
|
|
{
|
|
m_painter->setWorldMatrix( mat );
|
|
}
|
|
|
|
void
|
|
VQPainter::setZoomFactor( double zoomFactor )
|
|
{
|
|
m_zoomFactor = zoomFactor;
|
|
/*QWMatrix mat;
|
|
mat.scale( zoomFactor, zoomFactor );
|
|
m_painter->setWorldMatrix( mat );*/
|
|
}
|
|
|
|
void
|
|
VQPainter::moveTo( const KoPoint &p )
|
|
{
|
|
//m_index = 0;
|
|
if( m_pa.size() <= m_index )
|
|
m_pa.resize( m_index + 10 );
|
|
|
|
m_pa.setPoint( m_index, static_cast<int>(p.x() * m_zoomFactor), static_cast<int>(p.y() * m_zoomFactor) );
|
|
|
|
m_index++;
|
|
}
|
|
|
|
void
|
|
VQPainter::lineTo( const KoPoint &p )
|
|
{
|
|
if( m_pa.size() <= m_index )
|
|
m_pa.resize( m_index + 10 );
|
|
|
|
m_pa.setPoint( m_index, static_cast<int>(p.x() * m_zoomFactor), static_cast<int>(p.y() * m_zoomFactor) );
|
|
|
|
m_index++;
|
|
}
|
|
|
|
void
|
|
VQPainter::curveTo( const KoPoint &p1, const KoPoint &p2, const KoPoint &p3 )
|
|
{
|
|
// calculate cubic bezier using a temp QPointArray
|
|
QPointArray pa( 4 );
|
|
pa.setPoint( 0, m_pa.point( m_index - 1 ).x(), m_pa.point( m_index - 1 ).y() );
|
|
pa.setPoint( 1, static_cast<int>(p1.x() * m_zoomFactor), static_cast<int>(p1.y() * m_zoomFactor) );
|
|
pa.setPoint( 2, static_cast<int>(p2.x() * m_zoomFactor), static_cast<int>(p2.y() * m_zoomFactor) );
|
|
pa.setPoint( 3, static_cast<int>(p3.x() * m_zoomFactor), static_cast<int>(p3.y() * m_zoomFactor) );
|
|
|
|
QPointArray pa2( pa.cubicBezier() );
|
|
|
|
m_pa.resize( m_index + pa2.size() );
|
|
m_pa.putPoints( m_index, pa2.size(), pa2 );
|
|
|
|
m_index += pa2.size();
|
|
}
|
|
|
|
void
|
|
VQPainter::newPath()
|
|
{
|
|
m_index = 0;
|
|
}
|
|
|
|
void
|
|
VQPainter::fillPath()
|
|
{
|
|
// we probably dont need filling for qpainter
|
|
//m_index = 0;
|
|
m_painter->drawPolygon( m_pa, FALSE, 0, m_index );
|
|
}
|
|
|
|
void
|
|
VQPainter::strokePath()
|
|
{
|
|
m_painter->drawPolyline( m_pa, 0, m_index );
|
|
m_index = 0;
|
|
}
|
|
|
|
void
|
|
VQPainter::setPen( const VStroke &stroke )
|
|
{
|
|
QPen pen;
|
|
|
|
// color + linewidth
|
|
pen.setColor( stroke.color() );
|
|
pen.setWidth( static_cast<int>(stroke.lineWidth()) );
|
|
|
|
// caps
|
|
if( stroke.lineCap() == VStroke::capButt )
|
|
pen.setCapStyle( Qt::FlatCap );
|
|
else if( stroke.lineCap() == VStroke::capRound )
|
|
pen.setCapStyle( Qt::RoundCap );
|
|
else if( stroke.lineCap() == VStroke::capSquare )
|
|
pen.setCapStyle( Qt::SquareCap );
|
|
|
|
m_painter->setPen( pen );
|
|
}
|
|
|
|
void
|
|
VQPainter::setBrush( const VFill &fill )
|
|
{
|
|
switch( fill.type() )
|
|
{
|
|
case VFill::none:
|
|
m_painter->setBrush( Qt::NoBrush );
|
|
break;
|
|
case VFill::solid:
|
|
m_painter->setBrush( QBrush( fill.color(), Qt::SolidPattern ) );
|
|
break;
|
|
case VFill::grad:
|
|
// gradients are nor supported by qpainter
|
|
m_painter->setBrush( Qt::NoBrush );
|
|
break;
|
|
case VFill::patt:
|
|
// pixmap brushes not supported for printing
|
|
m_painter->setBrush( QBrush( fill.color(), fill.pattern().pixmap() ) );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void
|
|
VQPainter::setPen( const QColor &c )
|
|
{
|
|
m_painter->setPen( c );
|
|
}
|
|
|
|
void
|
|
VQPainter::setPen( Qt::PenStyle style )
|
|
{
|
|
m_painter->setPen( style );
|
|
}
|
|
|
|
void
|
|
VQPainter::setBrush( const QColor &c )
|
|
{
|
|
m_painter->setBrush( c );
|
|
}
|
|
|
|
void
|
|
VQPainter::setBrush( Qt::BrushStyle style )
|
|
{
|
|
m_painter->setBrush( style );
|
|
}
|
|
|
|
void
|
|
VQPainter::save()
|
|
{
|
|
m_painter->save();
|
|
}
|
|
|
|
void
|
|
VQPainter::restore()
|
|
{
|
|
m_painter->restore();
|
|
}
|
|
|
|
void
|
|
VQPainter::setRasterOp( Qt::RasterOp r )
|
|
{
|
|
m_painter->setRasterOp( r );
|
|
}
|
|
|
|
void
|
|
VQPainter::drawNode( const KoPoint &p, int width )
|
|
{
|
|
m_painter->drawRect( QRect( int( p.x() * m_zoomFactor ) - width, int( p.y() * m_zoomFactor ) - width,
|
|
2 * width + 1, 2 * width + 1 ) );
|
|
}
|
|
|
|
void
|
|
VQPainter::drawRect( const KoRect &rect )
|
|
{
|
|
m_painter->drawRect( QRect( int( rect.x() ), int( rect.y() ), int( rect.width() ), int( rect.height() ) ) );
|
|
}
|
|
|
|
void
|
|
VQPainter::drawImage( const QImage &image, const QWMatrix &affine )
|
|
{
|
|
QWMatrix matrix = m_painter->worldMatrix();
|
|
|
|
double m11 = affine.m11() * matrix.m11() * m_zoomFactor + affine.m12() * matrix.m21();
|
|
double m12 = (affine.m11() * matrix.m12() + affine.m12() * matrix.m22() ) * m_zoomFactor;
|
|
double m21 = (affine.m21() * matrix.m11() + affine.m22() * matrix.m21() ) * m_zoomFactor;
|
|
double m22 = affine.m22() * matrix.m22() * m_zoomFactor + affine.m21() * matrix.m12();
|
|
double dx = matrix.dx() + affine.dx() * m_zoomFactor;
|
|
double dy = matrix.dy() - affine.dy() * m_zoomFactor;
|
|
|
|
QWMatrix world( m11, m12, m21, m22, dx, dy );
|
|
|
|
m_painter->setWorldMatrix( world );
|
|
|
|
m_painter->drawImage( QPoint( 0, 0 ), image );
|
|
// restore old world matrix
|
|
m_painter->setWorldMatrix( matrix );
|
|
}
|