22#include "vkopainter.h"
28#include <tqpaintdevice.h>
30#include <tqpointarray.h>
33#include "libart_lgpl/art_vpath.h"
34#include <libart_lgpl/art_bpath.h>
35#include <libart_lgpl/art_vpath_bpath.h>
36#include <libart_lgpl/art_svp_vpath.h>
37#include <libart_lgpl/art_svp_vpath_stroke.h>
38#include <libart_lgpl/art_svp.h>
39#include <libart_lgpl/art_svp_ops.h>
40#include <libart_lgpl/art_affine.h>
41#include <libart_lgpl/art_svp_intersect.h>
42#include <libart_lgpl/art_rect_svp.h>
43#include <libart_lgpl/art_pathcode.h>
44#include <libart_lgpl/art_vpath_dash.h>
45#include "art_rgba_affine.h"
46#include "art_render_misc.h"
47#include <libart_lgpl/art_render_svp.h>
49#include "art_rgb_svp.h"
50#include "art_render_pattern.h"
54#include <gdk-pixbuf-xlibrgb.h>
58#include <kiconloader.h>
63#include <karbon_factory.h>
64#include <karbon_resourceserver.h>
67#define INITIAL_ALLOC 300
68#define ALLOC_INCREMENT 100
70VKoPainter::VKoPainter( TQPaintDevice *target,
unsigned int w,
unsigned int h,
bool bDrawNodes )
71: VPainter( target, w, h ), m_target( target ), m_bDrawNodes( bDrawNodes )
80 resize( m_width, m_height );
82 m_clipPaths.setAutoDelete(
false );
88 xlib_rgb_init_with_depth( target->x11Display(), XScreenOfDisplay( target->x11Display(),
89 target->x11Screen() ), target->x11Depth() );
91 gc = XCreateGC( target->x11Display(), target->handle(), 0, 0 );
96VKoPainter::VKoPainter(
unsigned char *buffer,
unsigned int w,
unsigned int h,
bool bDrawNodes )
97: VPainter( 0L, w, h ), m_buffer( buffer ), m_bDrawNodes( bDrawNodes )
107 m_clipPaths.setAutoDelete(
false );
117VKoPainter::~VKoPainter()
122 art_free( m_buffer );
130 XFreeGC( m_target->x11Display(), gc );
134VKoPainter::resize(
unsigned int w,
unsigned int h )
136 if( !m_buffer || w != m_width || h != m_height )
139 art_free( m_buffer );
143 if ( m_width != 0 && m_height != 0 )
144 m_buffer = art_new( art_u8, m_width * m_height * 4 );
159 xlib_draw_rgb_32_image( m_target->handle(), gc, 0, 0, m_width, m_height,
160 XLIB_RGB_DITHER_NONE, m_buffer, m_width * 4 );
167VKoPainter::blit(
const KoRect &r )
171 int x = KMAX( 0,
int( r.x() ) );
172 int y = KMAX( 0,
int( r.y() ) );
173 int width = KMIN( m_width, (
unsigned int)KMAX( 0,
int( r.x() + r.width() ) ) );
174 int height = KMIN( m_height, (
unsigned int)KMAX( 0,
int( r.y() + r.height() ) ) );
175 xlib_draw_rgb_32_image( m_target->handle(), gc, x, y, width - x, height - y,
176 XLIB_RGB_DITHER_NONE, m_buffer + (x * 4) + (y * m_width * 4), m_width * 4 );
183 memset( m_buffer, tqRgba( 255, 255, 255, 255 ), m_width * m_height * 4 );
187VKoPainter::clear(
const TQColor &c )
190 memset( m_buffer, c.rgb(), m_width * m_height * 4 );
194VKoPainter::clear(
const KoRect &r,
const TQColor &c )
196 unsigned int color = c.rgb();
197 int x = KMAX( 0,
int( r.x() ) );
198 int y = KMAX( 0,
int( r.y() ) );
199 int width = KMIN( m_width, (
unsigned int)KMAX( 0,
int( r.x() + r.width() ) ) );
200 int height = KMIN( m_height, (
unsigned int)KMAX( 0,
int( r.y() + r.height() ) ) );
203 for(
int i = y;i < height;i++)
204 memset( m_buffer +
int( x * 4) +
int( i * ( m_width * 4 ) ),
205 tqRgba( tqRed( color ), tqGreen( color ), tqBlue( color ), 100 ),
int( width * 4 ) );
210VKoPainter::setWorldMatrix(
const TQWMatrix &mat )
216VKoPainter::setZoomFactor(
double zoomFactor )
218 m_zoomFactor = zoomFactor;
222VKoPainter::ensureSpace(
unsigned int newindex )
227 m_path = art_new( ArtBpath, INITIAL_ALLOC );
228 m_alloccount = INITIAL_ALLOC;
230 else if( newindex > m_alloccount )
232 m_alloccount += ALLOC_INCREMENT;
233 m_path = art_renew( m_path, ArtBpath, m_alloccount );
238VKoPainter::moveTo(
const KoPoint &p )
240 ensureSpace( m_index + 1 );
242 m_path[ m_index ].code = ART_MOVETO;
244 m_path[ m_index ].x3 = p.x() * m_zoomFactor;
245 m_path[ m_index ].y3 = p.y() * m_zoomFactor;
251VKoPainter::lineTo(
const KoPoint &p )
253 ensureSpace( m_index + 1 );
255 m_path[ m_index ].code = ART_LINETO;
256 m_path[ m_index ].x3 = p.x() * m_zoomFactor;
257 m_path[ m_index ].y3 = p.y() * m_zoomFactor;
263VKoPainter::curveTo(
const KoPoint &p1,
const KoPoint &p2,
const KoPoint &p3 )
265 ensureSpace( m_index + 1 );
267 m_path[ m_index ].code = ART_CURVETO;
268 m_path[ m_index ].x1 = p1.x() * m_zoomFactor;
269 m_path[ m_index ].y1 = p1.y() * m_zoomFactor;
270 m_path[ m_index ].x2 = p2.x() * m_zoomFactor;
271 m_path[ m_index ].y2 = p2.y() * m_zoomFactor;
272 m_path[ m_index ].x3 = p3.x() * m_zoomFactor;
273 m_path[ m_index ].y3 = p3.y() * m_zoomFactor;
285VKoPainter::setFillRule( VFillRule fillRule )
287 m_fillRule = fillRule;
291VKoPainter::fillPath()
293 if( m_index == 0 )
return;
297 for(
int i = m_index - 1; i >= 0; i-- )
299 if( m_path[i].code == ART_MOVETO_OPEN || m_path[i].code == ART_MOVETO )
307 if( find != -1 && ( m_path[ find ].x3 != m_path[ m_index - 1 ].x3 ||
308 m_path[ find ].y3 != m_path[ m_index - 1 ].y3 ) )
310 ensureSpace( m_index + 1 );
312 m_path[ m_index ].code = ART_LINETO;
313 m_path[ m_index ].x3 = m_path[ find ].x3;
314 m_path[ m_index ].y3 = m_path[ find ].y3;
317 m_path[ m_index ].code = ART_END;
320 m_path[ m_index++ ].code = ART_END;
322 if( m_fill && m_fill->type() != VFill::none )
324 ArtVpath *path = art_bez_path_to_vec( m_path , 0.25 );
332VKoPainter::strokePath()
334 if( m_index == 0 )
return;
336 if( m_stroke && m_stroke->lineWidth() == 0 )
338 if( m_path[ m_index ].code != ART_END)
339 m_path[ m_index ].code = ART_END;
341 ArtVpath *path = art_bez_path_to_vec( m_path , 0.25 );
347VKoPainter::setClipPath()
350 path = art_bez_path_to_vec( m_path , 0.25 );
351 m_clipPaths.append( art_svp_from_vpath( path ) );
356VKoPainter::resetClipPath()
358 art_svp_free( m_clipPaths.current() );
359 m_clipPaths.remove();
363VKoPainter::setPen(
const VStroke &stroke )
366 m_stroke =
new VStroke;
371VKoPainter::setPen(
const TQColor &c )
374 m_stroke =
new VStroke;
376 float r =
static_cast<float>( c.red() ) / 255.0;
377 float g =
static_cast<float>( c.green() ) / 255.0;
378 float b =
static_cast<float>( c.blue() ) / 255.0;
381 color.
set( r, g, b );
382 m_stroke->setColor( color );
386VKoPainter::setPen( TQt::PenStyle style )
388 if( style == TQt::NoPen )
396VKoPainter::setBrush(
const TQColor &c )
401 float r =
static_cast<float>( c.red() ) / 255.0;
402 float g =
static_cast<float>( c.green() ) / 255.0;
403 float b =
static_cast<float>( c.blue() ) / 255.0;
406 color.
set( r, g, b );
407 m_fill->setColor( color );
411VKoPainter::setBrush( TQt::BrushStyle style )
413 if( style == TQt::NoBrush )
421VKoPainter::setBrush(
const VFill &fill )
439VKoPainter::setRasterOp( TQt::RasterOp )
444VKoPainter::clampToViewport(
int &x0,
int &y0,
int &x1,
int &y1 )
448 x0 = kMin( x0,
int( m_width ) );
450 y0 = kMin( y0,
int ( m_height ) );
452 x1 = kMin( x1,
int( m_width ) );
454 y1 = kMin( y1,
int( m_height ) );
458VKoPainter::clampToViewport(
const ArtSVP &svp,
int &x0,
int &y0,
int &x1,
int &y1 )
462 art_drect_svp( &bbox, &svp );
469 x0 = kMin( x0,
int( m_width ) );
472 y0 = kMin( y0,
int ( m_height ) );
473 x1 = int( bbox.x1 ) + 1;
475 x1 = kMin( x1,
int( m_width ) );
476 y1 = int( bbox.y1 ) + 1;
478 y1 = kMin( y1,
int( m_height ) );
482VKoPainter::drawVPath( ArtVpath *vec )
484 ArtSVP *strokeSvp = 0L;
485 ArtSVP *fillSvp = 0L;
489 affine[0] = m_matrix.m11();
492 affine[3] = m_matrix.m22();
493 affine[4] = m_matrix.dx();
494 affine[5] = m_matrix.dy();
495 ArtVpath *temp = art_vpath_affine_transform( vec, affine );
501 art_u32 fillColor = 0;
505 if( m_fill && m_fill->type() != VFill::none )
507 color = m_fill->color();
508 af = tqRound( 255 * m_fill->color().opacity() );
509 fillColor = ( 0 << 24 ) | ( color.blue() << 16 ) | ( color.green() << 8 ) | color.red();
513 temp = art_svp_from_vpath( vec );
515 if( m_fillRule == evenOdd )
516 swr = art_svp_writer_rewind_new( ART_WIND_RULE_ODDEVEN );
518 swr = art_svp_writer_rewind_new( ART_WIND_RULE_NONZERO );
520 art_svp_intersector( temp, swr );
521 fillSvp = art_svp_writer_rewind_reap( swr );
523 art_svp_free( temp );
526 art_u32 strokeColor = 0;
528 if( m_stroke && m_stroke->type() != VStroke::none )
530 ArtPathStrokeCapType capStyle = ART_PATH_STROKE_CAP_BUTT;
531 ArtPathStrokeJoinType joinStyle = ART_PATH_STROKE_JOIN_MITER;
534 color = m_stroke->color();
535 as = tqRound( 255 * m_stroke->color().opacity() );
536 strokeColor = ( 0 << 24 ) | ( color.blue() << 16 ) | ( color.green() << 8 ) | color.red();
538 double ratio = m_zoomFactor;
539 if( m_stroke->dashPattern().array().count() > 0 )
543 dash.offset = m_stroke->dashPattern().offset() * ratio;
544 dash.n_dash = m_stroke->dashPattern().array().count();
545 double *dashes =
new double[ dash.n_dash ];
546 for(
int i = 0; i < dash.n_dash; i++ )
547 dashes[i] = m_stroke->dashPattern().array()[i] * ratio;
551 ArtVpath *vec2 = art_vpath_dash( vec, &dash );
558 if( m_stroke->lineCap() == VStroke::capRound )
559 capStyle = ART_PATH_STROKE_CAP_ROUND;
560 else if( m_stroke->lineCap() == VStroke::capSquare )
561 capStyle = ART_PATH_STROKE_CAP_SQUARE;
564 if( m_stroke->lineJoin() == VStroke::joinRound )
565 joinStyle = ART_PATH_STROKE_JOIN_ROUND;
566 else if( m_stroke->lineJoin() == VStroke::joinBevel )
567 joinStyle = ART_PATH_STROKE_JOIN_BEVEL;
570 strokeSvp = art_svp_vpath_stroke( vec, joinStyle, capStyle, ratio * m_stroke->lineWidth(), m_stroke->miterLimit(), 0.25 );
579 applyGradient( strokeSvp,
false );
581 applyPattern( strokeSvp,
false );
584 clampToViewport( *strokeSvp, x0, y0, x1, y1 );
585 if( x0 != x1 && y0 != y1 )
586 art_rgb_svp_alpha_( strokeSvp, x0, y0, x1, y1, strokeColor, as, m_buffer + x0 * 4 + y0 * m_width * 4, m_width * 4, 0 );
588 art_svp_free( strokeSvp );
594 applyGradient( fillSvp,
true );
596 applyPattern( fillSvp,
true );
599 clampToViewport( *fillSvp, x0, y0, x1, y1 );
600 if( x0 != x1 && y0 != y1 )
601 art_rgb_svp_alpha_( fillSvp, x0, y0, x1, y1, fillColor, af, m_buffer + x0 * 4 + y0 * m_width * 4, m_width * 4, 0 );
603 art_svp_free( fillSvp );
615VKoPainter::applyPattern( ArtSVP *svp,
bool fill )
622 clampToViewport( *svp, x0, y0, x1, y1 );
624 ArtRender *render = 0L;
626 VPattern pat = fill ? m_fill->pattern() : m_stroke->pattern();
627 if( !pat.isValid() ) {
628 pat.load( TDEGlobal::iconLoader()->iconPath(
"karbon.png", -TDEIcon::SizeMedium ) ); }
629 if( !pat.isValid() ) {
630 pat = *(
dynamic_cast<VPattern *
>(KarbonFactory::rServer()->patterns().getFirst() )) ;}
632 ArtPattern *pattern = art_new( ArtPattern, 1 );
634 double dx = ( pat.vector().x() - pat.origin().x() ) * m_zoomFactor;
635 double dy = ( pat.vector().y() - pat.origin().y() ) * m_zoomFactor;
637 pattern->twidth = pat.tileWidth();
638 pattern->theight = pat.tileHeight();
639 pattern->buffer = pat.pixels();
640 pattern->opacity = fill ? short( m_fill->color().opacity() * 255.0 ) : short( m_stroke->color().opacity() * 255.0 );
641 pattern->angle = atan2( -dy, dx );
643 if( x0 != x1 && y0 != y1 )
645 render = art_render_new( x0, y0, x1, y1, m_buffer + 4 *
int(x0) + m_width * 4 *
int(y0), m_width * 4, 3, 8, ART_ALPHA_PREMUL, 0 );
646 art_render_svp( render, svp );
647 art_render_pattern( render, pattern, ART_FILTER_HYPER );
651 art_render_invoke( render );
656VKoPainter::applyGradient( ArtSVP *svp,
bool fill )
659 clampToViewport( *svp, x0, y0, x1, y1 );
661 ArtRender *render = 0L;
663 VGradient gradient = fill ? m_fill->gradient() : m_stroke->gradient();
664 float opa = fill ? m_fill->color().opacity() : m_stroke->color().opacity();
666 if( gradient.type() == VGradient::linear )
668 ArtGradientLinear *linear = art_new( ArtGradientLinear, 1 );
671 if( gradient.repeatMethod() == VGradient::none )
672 linear->spread = ART_GRADIENT_PAD;
673 else if( gradient.repeatMethod() == VGradient::repeat )
674 linear->spread = ART_GRADIENT_REPEAT;
675 else if( gradient.repeatMethod() == VGradient::reflect )
676 linear->spread = ART_GRADIENT_REFLECT;
678 double _x1 = gradient.origin().x();
679 double _x2 = gradient.vector().x();
680 double _y2 = gradient.origin().y();
681 double _y1 = gradient.vector().y();
683 double dx = ( _x2 - _x1 ) * m_zoomFactor;
684 _y1 = m_matrix.m22() * _y1 + m_matrix.dy() / m_zoomFactor;
685 _y2 = m_matrix.m22() * _y2 + m_matrix.dy() / m_zoomFactor;
686 double dy = ( _y1 - _y2 ) * m_zoomFactor;
687 double scale = 1.0 / ( dx * dx + dy * dy );
689 linear->a = dx * scale;
690 linear->b = dy * scale;
691 linear->c = -( ( _x1 * m_zoomFactor + m_matrix.dx() ) * linear->a +
692 ( _y2 * m_zoomFactor ) * linear->b );
696 linear->stops = buildStopArray( gradient, offsets );
697 linear->n_stops = offsets;
699 if( x0 != x1 && y0 != y1 && offsets >= 0 )
701 render = art_render_new( x0, y0, x1, y1, m_buffer + 4 *
int(x0) + m_width * 4 *
int(y0), m_width * 4, 3, 8, ART_ALPHA_PREMUL, 0 );
702 int opacity = int( opa * 255.0 );
703 art_render_svp( render, svp );
704 art_render_mask_solid (render, (opacity << 8) + opacity + (opacity >> 7));
705 art_karbon_render_gradient_linear( render, linear, ART_FILTER_NEAREST );
706 art_render_invoke( render );
708 art_free( linear->stops );
711 else if( gradient.type() == VGradient::radial )
713 ArtGradientRadial *radial = art_new( ArtGradientRadial, 1 );
716 if( gradient.repeatMethod() == VGradient::none )
717 radial->spread = ART_GRADIENT_PAD;
718 else if( gradient.repeatMethod() == VGradient::repeat )
719 radial->spread = ART_GRADIENT_REPEAT;
720 else if( gradient.repeatMethod() == VGradient::reflect )
721 radial->spread = ART_GRADIENT_REFLECT;
723 radial->affine[0] = m_matrix.m11();
724 radial->affine[1] = m_matrix.m12();
725 radial->affine[2] = m_matrix.m21();
726 radial->affine[3] = m_matrix.m22();
727 radial->affine[4] = m_matrix.dx();
728 radial->affine[5] = m_matrix.dy();
730 double cx = gradient.origin().x() * m_zoomFactor;
731 double cy = gradient.origin().y() * m_zoomFactor;
732 double fx = gradient.focalPoint().x() * m_zoomFactor;
733 double fy = gradient.focalPoint().y() * m_zoomFactor;
734 double r = sqrt( pow( gradient.vector().x() - gradient.origin().x(), 2 ) +
735 pow( gradient.vector().y() - gradient.origin().y(), 2 ) );
738 radial->fx = (fx - cx) / r;
739 radial->fy = (fy - cy) / r;
741 double aff1[6], aff2[6];
742 art_affine_scale( aff1, r, r);
743 art_affine_translate( aff2, cx, cy );
744 art_affine_multiply( aff1, aff1, aff2 );
745 art_affine_multiply( aff1, aff1, radial->affine );
746 art_affine_invert( radial->affine, aff1 );
750 radial->stops = buildStopArray( gradient, offsets );
751 radial->n_stops = offsets;
753 if( x0 != x1 && y0 != y1 && offsets >= 0 )
755 render = art_render_new( x0, y0, x1, y1, m_buffer + 4 * x0 + m_width * 4 * y0, m_width * 4, 3, 8, ART_ALPHA_PREMUL, 0 );
756 int opacity = int( opa * 255.0 );
757 art_render_svp( render, svp );
758 art_render_mask_solid (render, (opacity << 8) + opacity + (opacity >> 7));
759 art_karbon_render_gradient_radial( render, radial, ART_FILTER_NEAREST );
760 art_render_invoke( render );
762 art_free( radial->stops );
765 else if( gradient.type() == VGradient::conic )
767 ArtGradientConical *conical = art_new( ArtGradientConical, 1 );
770 if( gradient.repeatMethod() == VGradient::none )
771 conical->spread = ART_GRADIENT_PAD;
772 else if( gradient.repeatMethod() == VGradient::repeat )
773 conical->spread = ART_GRADIENT_REPEAT;
774 else if( gradient.repeatMethod() == VGradient::reflect )
775 conical->spread = ART_GRADIENT_REFLECT;
777 double cx = gradient.origin().x() * m_zoomFactor;
778 cx = m_matrix.m11() * cx + m_matrix.dx();
779 double cy = gradient.origin().y() * m_zoomFactor;
780 cy = m_matrix.m22() * cy + m_matrix.dy();
781 double r = sqrt( pow( gradient.vector().x() - gradient.origin().x(), 2 ) +
782 pow( gradient.vector().y() - gradient.origin().y(), 2 ) );
791 conical->stops = buildStopArray( gradient, offsets );
792 conical->n_stops = offsets;
794 if( x0 != x1 && y0 != y1 && offsets >= 0 )
796 render = art_render_new( x0, y0, x1, y1, m_buffer + 4 * x0 + m_width * 4 * y0, m_width * 4, 3, 8, ART_ALPHA_PREMUL, 0 );
797 int opacity = int( opa * 255.0 );
798 art_render_svp( render, svp );
799 art_render_mask_solid (render, (opacity << 8) + opacity + (opacity >> 7));
800 art_karbon_render_gradient_conical( render, conical, ART_FILTER_NEAREST );
801 art_render_invoke( render );
803 art_free( conical->stops );
809VKoPainter::buildStopArray( VGradient &gradient,
int &offsets )
812 TQPtrVector<VColorStop> colorStops = gradient.colorStops();
813 offsets = colorStops.count();
815 ArtGradientStop *stopArray = art_new( ArtGradientStop, offsets * 2 - 1 );
817 for(
int offset = 0 ; offset < offsets ; offset++ )
819 double ramp = colorStops[ offset ]->rampPoint;
821 stopArray[ offset * 2 ].offset = ramp;
823 TQColor qStopColor = colorStops[ offset ]->color;
824 int r = tqRed( qStopColor.rgb() );
825 int g = tqGreen( qStopColor.rgb() );
826 int b = tqBlue( qStopColor.rgb() );
827 art_u32 rgba = (r << 24) | (g << 16) | (b << 8) | tqAlpha(qStopColor.rgb());
829 int a = int( colorStops[ offset]->color.opacity() * 255.0 );
830 r = (rgba >> 24) * a + 0x80;
831 r = (r + (r >> 8)) >> 8;
832 g = ((rgba >> 16) & 0xff) * a + 0x80;
833 g = (g + (g >> 8)) >> 8;
834 b = ((rgba >> 8) & 0xff) * a + 0x80;
835 b = (b + (b >> 8)) >> 8;
836 stopArray[ offset * 2 ].color[ 0 ] = ART_PIX_MAX_FROM_8(r);
837 stopArray[ offset * 2 ].color[ 1 ] = ART_PIX_MAX_FROM_8(g);
838 stopArray[ offset * 2 ].color[ 2 ] = ART_PIX_MAX_FROM_8(b);
839 stopArray[ offset * 2 ].color[ 3 ] = ART_PIX_MAX_FROM_8(a);
841 if( offset + 1 != offsets )
843 stopArray[ offset * 2 + 1 ].offset = ramp + ( colorStops[ offset + 1 ]->rampPoint - ramp ) * colorStops[ offset ]->midPoint;
845 TQColor qStopColor2 = colorStops[ offset + 1 ]->color;
846 rgba = int(r + ((tqRed(qStopColor2.rgb()) - r)) * 0.5) << 24 |
847 int(g + ((tqGreen(qStopColor2.rgb()) - g)) * 0.5) << 16 |
848 int(b + ((tqBlue(qStopColor2.rgb()) - b)) * 0.5) << 8 |
849 tqAlpha(qStopColor2.rgb());
851 int a = int( colorStops[ offset]->color.opacity() * 255.0 );
852 r = (rgba >> 24) * a + 0x80;
853 r = (r + (r >> 8)) >> 8;
854 g = ((rgba >> 16) & 0xff) * a + 0x80;
855 g = (g + (g >> 8)) >> 8;
856 b = ((rgba >> 8) & 0xff) * a + 0x80;
857 b = (b + (b >> 8)) >> 8;
858 stopArray[ offset * 2 + 1 ].color[ 0 ] = ART_PIX_MAX_FROM_8(r);
859 stopArray[ offset * 2 + 1 ].color[ 1 ] = ART_PIX_MAX_FROM_8(g);
860 stopArray[ offset * 2 + 1 ].color[ 2 ] = ART_PIX_MAX_FROM_8(b);
861 stopArray[ offset * 2 + 1 ].color[ 3 ] = ART_PIX_MAX_FROM_8(a);
865 offsets = offsets * 2 - 1;
870VKoPainter::drawNode(
const KoPoint& p,
int width )
872 if( !m_bDrawNodes )
return;
874 KoPoint _p( m_matrix.map( TQPoint(
int( p.x() * m_zoomFactor ),
int( p.y() * m_zoomFactor ) ) ) );
875 int x1 = int( _p.x() - width );
876 int x2 = int( _p.x() + width );
877 int y1 = int( _p.y() - width );
878 int y2 = int( _p.y() + width );
880 clampToViewport( x1, y1, x2, y2 );
882 int baseindex = 4 * x1 + ( m_width * 4 * y1 );
884 TQColor color = m_fill->color();
885 for(
int i = 0; i < y2 - y1; i++ )
887 for(
int j = 0; j < x2 - x1; j++ )
889 m_buffer[ baseindex + 4 * j + ( m_width * 4 * i ) ] = color.red();
890 m_buffer[ baseindex + 4 * j + ( m_width * 4 * i ) + 1 ] = color.green();
891 m_buffer[ baseindex + 4 * j + ( m_width * 4 * i ) + 2 ] = color.blue();
892 m_buffer[ baseindex + 4 * j + ( m_width * 4 * i ) + 3 ] = 0xFF;
898VKoPainter::drawImage(
const TQImage &image,
const TQWMatrix &affine )
901 double affineresult[6];
903 affineresult[0] = affine.m11() * m_matrix.m11() * m_zoomFactor + affine.m12() * m_matrix.m21();
904 affineresult[1] = (affine.m11() * m_matrix.m12() + affine.m12() * m_matrix.m22() ) * m_zoomFactor;
905 affineresult[2] = (affine.m21() * m_matrix.m11() + affine.m22() * m_matrix.m21() ) * m_zoomFactor;
906 affineresult[3] = affine.m22() * m_matrix.m22() * m_zoomFactor + affine.m21() * m_matrix.m12();
907 affineresult[4] = m_matrix.dx() + affine.dx() * m_zoomFactor;
908 affineresult[5] = m_matrix.dy() - affine.dy() * m_zoomFactor;
920 art_rgba_affine( m_buffer, 0, 0, m_width, m_height, m_width * 4,
921 image.bits(), image.width(), image.height(), image.width() * 4,
922 affineresult, ART_FILTER_NEAREST, 0L );
926VKoPainter::drawRect(
const KoRect &r )
929 moveTo( r.topLeft() );
930 lineTo( r.topRight() );
931 lineTo( r.bottomRight() );
932 lineTo( r.bottomLeft() );
933 lineTo( r.topLeft() );
939VKoPainter::drawRect(
double x,
double y,
double w,
double h )
941 drawRect( KoRect( x, y, w, h ) );
void set(float v1)
Sets the first color component.
Manages the fill of shapes.
Manages stroke properties.