summaryrefslogtreecommitdiff
path: root/src/corelib/render/software/ctrl/agg_bezier_ctrl.pas
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/render/software/ctrl/agg_bezier_ctrl.pas')
-rw-r--r--src/corelib/render/software/ctrl/agg_bezier_ctrl.pas1774
1 files changed, 887 insertions, 887 deletions
diff --git a/src/corelib/render/software/ctrl/agg_bezier_ctrl.pas b/src/corelib/render/software/ctrl/agg_bezier_ctrl.pas
index 6f158c2b..2b92baa3 100644
--- a/src/corelib/render/software/ctrl/agg_bezier_ctrl.pas
+++ b/src/corelib/render/software/ctrl/agg_bezier_ctrl.pas
@@ -1,887 +1,887 @@
-//----------------------------------------------------------------------------
-// Anti-Grain Geometry - Version 2.4 (Public License)
-// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
-//
-// Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
-// Pascal Port By: Milan Marusinec alias Milano
-// milan@marusinec.sk
-// http://www.aggpas.org
-// Copyright (c) 2005-2006
-//
-// Permission to copy, use, modify, sell and distribute this software
-// is granted provided this copyright notice appears in all copies.
-// This software is provided "as is" without express or implied
-// warranty, and with no claim as to its suitability for any purpose.
-//
-//----------------------------------------------------------------------------
-// Contact: mcseem@antigrain.com
-// mcseemagg@yahoo.com
-// http://www.antigrain.com
-//
-//----------------------------------------------------------------------------
-//
-// classes bezier_ctrl_impl, bezier_ctrl
-//
-// [Pascal Port History] -----------------------------------------------------
-//
-// 23.02.2006-Milano: Unit port establishment
-//
-{ agg_bezier_ctrl.pas }
-unit
- agg_bezier_ctrl ;
-
-INTERFACE
-
-{$I agg_mode.inc }
-
-uses
- agg_basics ,
- agg_ctrl ,
- agg_math ,
- agg_ellipse ,
- agg_trans_affine ,
- agg_color ,
- agg_curves ,
- agg_conv_stroke ,
- agg_conv_curve ,
- agg_polygon_ctrl ;
-
-{ TYPES DEFINITION }
-type
- bezier_ctrl_impl = object(ctrl )
- m_curve : curve4;
- m_ellipse : ellipse;
- m_stroke : conv_stroke;
- m_poly : polygon_ctrl_impl;
- m_idx : unsigned;
-
- constructor Construct;
- destructor Destruct; virtual;
-
- procedure curve_(x1 ,y1 ,x2 ,y2 ,x3 ,y3 ,x4 ,y4 : double );
- function _curve : curve4_ptr;
-
- function _x1 : double;
- function _y1 : double;
- function _x2 : double;
- function _y2 : double;
- function _x3 : double;
- function _y3 : double;
- function _x4 : double;
- function _y4 : double;
-
- procedure x1_(x : double );
- procedure y1_(y : double );
- procedure x2_(x : double );
- procedure y2_(y : double );
- procedure x3_(x : double );
- procedure y3_(y : double );
- procedure x4_(x : double );
- procedure y4_(y : double );
-
- procedure line_width_(w : double );
- function _line_width : double;
-
- procedure point_radius_(r : double );
- function _point_radius : double;
-
- // Event handlers
- function in_rect(x ,y : double ) : boolean; virtual;
-
- function on_mouse_button_down(x ,y : double ) : boolean; virtual;
- function on_mouse_button_up (x ,y : double ) : boolean; virtual;
-
- function on_mouse_move(x ,y : double; button_flag : boolean ) : boolean; virtual;
- function on_arrow_keys(left ,right ,down ,up : boolean ) : boolean; virtual;
-
- // Vertex source interface
- function num_paths : unsigned; virtual;
- procedure rewind(path_id : unsigned ); virtual;
- function vertex(x ,y : double_ptr ) : unsigned; virtual;
-
- end;
-
- bezier_ctrl = object(bezier_ctrl_impl )
- m_color : aggclr;
-
- constructor Construct;
-
- procedure line_color_(c : aggclr_ptr );
-
- function _color(i : unsigned ) : aggclr_ptr; virtual;
-
- end;
-
- curve3_ctrl_impl = object(ctrl )
- m_curve : curve3;
- m_ellipse : ellipse;
- m_stroke : conv_stroke;
- m_poly : polygon_ctrl_impl;
- m_idx : unsigned;
-
- constructor Construct;
- destructor Destruct; virtual;
-
- procedure curve_(x1 ,y1 ,x2 ,y2 ,x3 ,y3 : double );
- function _curve : curve3_ptr;
-
- function _x1 : double;
- function _y1 : double;
- function _x2 : double;
- function _y2 : double;
- function _x3 : double;
- function _y3 : double;
-
- procedure x1_(x : double );
- procedure y1_(y : double );
- procedure x2_(x : double );
- procedure y2_(y : double );
- procedure x3_(x : double );
- procedure y3_(y : double );
-
- procedure line_width_(w : double );
- function _line_width : double;
-
- procedure point_radius_(r : double );
- function _point_radius : double;
-
- // Event handlers
- function in_rect(x ,y : double ) : boolean; virtual;
-
- function on_mouse_button_down(x ,y : double ) : boolean; virtual;
- function on_mouse_button_up (x ,y : double ) : boolean; virtual;
-
- function on_mouse_move(x ,y : double; button_flag : boolean ) : boolean; virtual;
- function on_arrow_keys(left ,right ,down ,up : boolean ) : boolean; virtual;
-
- // Vertex source interface
- function num_paths : unsigned; virtual;
- procedure rewind(path_id : unsigned ); virtual;
- function vertex(x ,y : double_ptr ) : unsigned; virtual;
-
- end;
-
- curve3_ctrl = object(curve3_ctrl_impl )
- m_color : aggclr;
-
- constructor Construct;
-
- procedure line_color_(c : aggclr_ptr );
-
- function _color(i : unsigned ) : aggclr_ptr; virtual;
-
- end;
-
-{ GLOBAL PROCEDURES }
-
-
-IMPLEMENTATION
-{ LOCAL VARIABLES & CONSTANTS }
-{ UNIT IMPLEMENTATION }
-{ CONSTRUCT }
-constructor bezier_ctrl_impl.Construct;
-begin
- inherited Construct(0 ,0 ,1 ,1 ,false );
-
- m_curve.Construct;
- m_ellipse.Construct;
- m_stroke.Construct(@m_curve );
- m_poly.Construct (4 ,5.0 );
-
- m_idx:=0;
-
- m_poly.in_polygon_check_(false );
-
- m_poly.xn_ptr(0 )^:=100.0;
- m_poly.yn_ptr(0 )^:= 0.0;
- m_poly.xn_ptr(1 )^:=100.0;
- m_poly.yn_ptr(1 )^:= 50.0;
- m_poly.xn_ptr(2 )^:= 50.0;
- m_poly.yn_ptr(2 )^:=100.0;
- m_poly.xn_ptr(3 )^:= 0.0;
- m_poly.yn_ptr(3 )^:=100.0;
-
-end;
-
-{ DESTRUCT }
-destructor bezier_ctrl_impl.Destruct;
-begin
- m_curve.Destruct;
- m_stroke.Destruct;
- m_poly.Destruct;
-
-end;
-
-{ CURVE_ }
-procedure bezier_ctrl_impl.curve_;
-begin
- m_poly.xn_ptr(0 )^:=x1;
- m_poly.yn_ptr(0 )^:=y1;
- m_poly.xn_ptr(1 )^:=x2;
- m_poly.yn_ptr(1 )^:=y2;
- m_poly.xn_ptr(2 )^:=x3;
- m_poly.yn_ptr(2 )^:=y3;
- m_poly.xn_ptr(3 )^:=x4;
- m_poly.yn_ptr(3 )^:=y4;
-
- _curve;
-
-end;
-
-{ _CURVE }
-function bezier_ctrl_impl._curve;
-begin
- m_curve.init4(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- m_poly._xn(1 ) ,m_poly._yn(1 ) ,
- m_poly._xn(2 ) ,m_poly._yn(2 ) ,
- m_poly._xn(3 ) ,m_poly._yn(3 ) );
-
- result:=@m_curve;
-
-end;
-
-{ _X1 }
-function bezier_ctrl_impl._x1;
-begin
- result:=m_poly._xn(0 );
-
-end;
-
-{ _Y1 }
-function bezier_ctrl_impl._y1;
-begin
- result:=m_poly._yn(0 );
-
-end;
-
-{ _X2 }
-function bezier_ctrl_impl._x2;
-begin
- result:=m_poly._xn(1 );
-
-end;
-
-{ _Y2 }
-function bezier_ctrl_impl._y2;
-begin
- result:=m_poly._yn(1 );
-
-end;
-
-{ _X3 }
-function bezier_ctrl_impl._x3;
-begin
- result:=m_poly._xn(2 );
-
-end;
-
-{ _Y3 }
-function bezier_ctrl_impl._y3;
-begin
- result:=m_poly._yn(2 );
-
-end;
-
-{ _X4 }
-function bezier_ctrl_impl._x4;
-begin
- result:=m_poly._xn(3 );
-
-end;
-
-{ _Y4 }
-function bezier_ctrl_impl._y4;
-begin
- result:=m_poly._yn(3 );
-
-end;
-
-{ X1_ }
-procedure bezier_ctrl_impl.x1_;
-begin
- m_poly.xn_ptr(0 )^:=x;
-
-end;
-
-{ Y1_ }
-procedure bezier_ctrl_impl.y1_;
-begin
- m_poly.yn_ptr(0 )^:=y;
-
-end;
-
-{ X2_ }
-procedure bezier_ctrl_impl.x2_;
-begin
- m_poly.xn_ptr(1 )^:=x;
-
-end;
-
-{ Y2_ }
-procedure bezier_ctrl_impl.y2_;
-begin
- m_poly.yn_ptr(1 )^:=y;
-
-end;
-
-{ X3_ }
-procedure bezier_ctrl_impl.x3_;
-begin
- m_poly.xn_ptr(2 )^:=x;
-
-end;
-
-{ Y3_ }
-procedure bezier_ctrl_impl.y3_;
-begin
- m_poly.yn_ptr(2 )^:=y;
-
-end;
-
-{ X4_ }
-procedure bezier_ctrl_impl.x4_;
-begin
- m_poly.xn_ptr(3 )^:=x;
-
-end;
-
-{ Y4_ }
-procedure bezier_ctrl_impl.y4_;
-begin
- m_poly.yn_ptr(3 )^:=y;
-
-end;
-
-{ LINE_WIDTH_ }
-procedure bezier_ctrl_impl.line_width_;
-begin
- m_stroke.width_(w );
-
-end;
-
-{ _LINE_WIDTH }
-function bezier_ctrl_impl._line_width;
-begin
- result:=m_stroke._width;
-
-end;
-
-{ POINT_RADIUS_ }
-procedure bezier_ctrl_impl.point_radius_;
-begin
- m_poly.point_radius_(r );
-
-end;
-
-{ _POINT_RADIUS }
-function bezier_ctrl_impl._point_radius;
-begin
- result:=m_poly._point_radius;
-
-end;
-
-{ IN_RECT }
-function bezier_ctrl_impl.in_rect;
-begin
- result:=false;
-
-end;
-
-{ ON_MOUSE_BUTTON_DOWN }
-function bezier_ctrl_impl.on_mouse_button_down;
-begin
- inverse_transform_xy(@x ,@y );
-
- result:=m_poly.on_mouse_button_down(x ,y );
-
-end;
-
-{ ON_MOUSE_BUTTON_UP }
-function bezier_ctrl_impl.on_mouse_button_up;
-begin
- result:=m_poly.on_mouse_button_up(x ,y );
-
-end;
-
-{ ON_MOUSE_MOVE }
-function bezier_ctrl_impl.on_mouse_move;
-begin
- inverse_transform_xy(@x ,@y );
-
- result:=m_poly.on_mouse_move(x ,y ,button_flag );
-
-end;
-
-{ ON_ARROW_KEYS }
-function bezier_ctrl_impl.on_arrow_keys;
-begin
- result:=m_poly.on_arrow_keys(left ,right ,down ,up );
-
-end;
-
-{ NUM_PATHS }
-function bezier_ctrl_impl.num_paths;
-begin
- result:=7;
-
-end;
-
-{ REWIND }
-procedure bezier_ctrl_impl.rewind;
-begin
- m_idx:=path_id;
-
- m_curve.approximation_scale_(scale );
-
- case path_id of
- 0 : // Control line 1
- begin
- m_curve.init4(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5 ,
- (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5 ,
- (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5 ,
- (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5 ,
- m_poly._xn(1 ) ,m_poly._yn(1 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 1 : // Control line 2
- begin
- m_curve.init4(
- m_poly._xn(2 ) ,m_poly._yn(2 ) ,
- (m_poly._xn(2 ) + m_poly._xn(3 ) ) * 0.5,
- (m_poly._yn(2 ) + m_poly._yn(3 ) ) * 0.5,
- (m_poly._xn(2 ) + m_poly._xn(3 ) ) * 0.5,
- (m_poly._yn(2 ) + m_poly._yn(3 ) ) * 0.5,
- m_poly._xn(3 ) ,m_poly._yn(3 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 2 : // Curve itself
- begin
- m_curve.init4(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- m_poly._xn(1 ) ,m_poly._yn(1 ) ,
- m_poly._xn(2 ) ,m_poly._yn(2 ) ,
- m_poly._xn(3 ) ,m_poly._yn(3 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 3 : // Point 1
- begin
- m_ellipse.init (m_poly._xn(0 ) ,m_poly._yn(0 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- 4 : // Point 2
- begin
- m_ellipse.init (m_poly._xn(1 ) ,m_poly._yn(1 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- 5 : // Point 3
- begin
- m_ellipse.init (m_poly._xn(2 ) ,m_poly._yn(2 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- 6 : // Point 4
- begin
- m_ellipse.init (m_poly._xn(3 ) ,m_poly._yn(3 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- end;
-
-end;
-
-{ VERTEX }
-function bezier_ctrl_impl.vertex;
-var
- cmd : unsigned;
-
-begin
- cmd:=path_cmd_stop;
-
- case m_idx of
- 0 ,1 ,2 :
- cmd:=m_stroke.vertex(x ,y );
-
- 3 ,4 ,5 ,6 ,7 :
- cmd:=m_ellipse.vertex(x, y);
-
- end;
-
- if not is_stop(cmd ) then
- transform_xy(x ,y );
-
- result:=cmd;
-
-end;
-
-{ CONSTRUCT }
-constructor bezier_ctrl.Construct;
-begin
- inherited Construct;
-
- m_color.ConstrDbl(0.0 ,0.0 ,0.0 );
-
-end;
-
-{ LINE_COLOR_ }
-procedure bezier_ctrl.line_color_;
-begin
- m_color:=c^;
-
-end;
-
-{ _COLOR }
-function bezier_ctrl._color;
-begin
- result:=@m_color;
-
-end;
-
-{ CONSTRUCT }
-constructor curve3_ctrl_impl.Construct;
-begin
- inherited Construct(0 ,0 ,1 ,1 ,false );
-
- m_curve.Construct;
- m_ellipse.Construct;
- m_stroke.Construct(@m_curve );
- m_poly.Construct (3 ,5.0 );
-
- m_idx:=0;
-
- m_poly.in_polygon_check_(false );
-
- m_poly.xn_ptr(0 )^:=100.0;
- m_poly.yn_ptr(0 )^:= 0.0;
- m_poly.xn_ptr(1 )^:=100.0;
- m_poly.yn_ptr(1 )^:= 50.0;
- m_poly.xn_ptr(2 )^:= 50.0;
- m_poly.yn_ptr(2 )^:=100.0;
-
-end;
-
-{ DESTRUCT }
-destructor curve3_ctrl_impl.Destruct;
-begin
- m_curve.Destruct;
- m_stroke.Destruct;
- m_poly.Destruct;
-
-end;
-
-{ CURVE_ }
-procedure curve3_ctrl_impl.curve_;
-begin
- m_poly.xn_ptr(0 )^:=x1;
- m_poly.yn_ptr(0 )^:=y1;
- m_poly.xn_ptr(1 )^:=x2;
- m_poly.yn_ptr(1 )^:=y2;
- m_poly.xn_ptr(2 )^:=x3;
- m_poly.yn_ptr(2 )^:=y3;
-
- _curve;
-
-end;
-
-{ _CURVE }
-function curve3_ctrl_impl._curve;
-begin
- m_curve.init3(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- m_poly._xn(1 ) ,m_poly._yn(1 ) ,
- m_poly._xn(2 ) ,m_poly._yn(2 ) );
-
- result:=@m_curve;
-
-end;
-
-{ _X1 }
-function curve3_ctrl_impl._x1;
-begin
- result:=m_poly._xn(0 );
-
-end;
-
-{ _Y1 }
-function curve3_ctrl_impl._y1;
-begin
- result:=m_poly._yn(0 );
-
-end;
-
-{ _X2 }
-function curve3_ctrl_impl._x2;
-begin
- result:=m_poly._xn(1 );
-
-end;
-
-{ _Y2 }
-function curve3_ctrl_impl._y2;
-begin
- result:=m_poly._yn(1 );
-
-end;
-
-{ _X3 }
-function curve3_ctrl_impl._x3;
-begin
- result:=m_poly._xn(2 );
-
-end;
-
-{ _Y3 }
-function curve3_ctrl_impl._y3;
-begin
- result:=m_poly._yn(2 );
-
-end;
-
-{ X1_ }
-procedure curve3_ctrl_impl.x1_;
-begin
- m_poly.xn_ptr(0 )^:=x;
-
-end;
-
-{ Y1_ }
-procedure curve3_ctrl_impl.y1_;
-begin
- m_poly.yn_ptr(0 )^:=y;
-
-end;
-
-{ X2_ }
-procedure curve3_ctrl_impl.x2_;
-begin
- m_poly.xn_ptr(1 )^:=x;
-
-end;
-
-{ Y2_ }
-procedure curve3_ctrl_impl.y2_;
-begin
- m_poly.yn_ptr(1 )^:=y;
-
-end;
-
-{ X3_ }
-procedure curve3_ctrl_impl.x3_;
-begin
- m_poly.xn_ptr(2 )^:=x;
-
-end;
-
-{ Y3_ }
-procedure curve3_ctrl_impl.y3_;
-begin
- m_poly.yn_ptr(2 )^:=y;
-
-end;
-
-{ LINE_WIDTH_ }
-procedure curve3_ctrl_impl.line_width_;
-begin
- m_stroke.width_(w );
-
-end;
-
-{ _LINE_WIDTH }
-function curve3_ctrl_impl._line_width;
-begin
- result:=m_stroke._width;
-
-end;
-
-{ POINT_RADIUS_ }
-procedure curve3_ctrl_impl.point_radius_;
-begin
- m_poly.point_radius_(r );
-
-end;
-
-{ _POINT_RADIUS }
-function curve3_ctrl_impl._point_radius;
-begin
- result:=m_poly._point_radius;
-
-end;
-
-{ IN_RECT }
-function curve3_ctrl_impl.in_rect;
-begin
- result:=false;
-
-end;
-
-{ ON_MOUSE_BUTTON_DOWN }
-function curve3_ctrl_impl.on_mouse_button_down;
-begin
- inverse_transform_xy(@x ,@y );
-
- result:=m_poly.on_mouse_button_down(x ,y );
-
-end;
-
-{ ON_MOUSE_BUTTON_UP }
-function curve3_ctrl_impl.on_mouse_button_up;
-begin
- result:=m_poly.on_mouse_button_up(x ,y );
-
-end;
-
-{ ON_MOUSE_MOVE }
-function curve3_ctrl_impl.on_mouse_move;
-begin
- inverse_transform_xy(@x ,@y );
-
- result:=m_poly.on_mouse_move(x ,y ,button_flag );
-
-end;
-
-{ ON_ARROW_KEYS }
-function curve3_ctrl_impl.on_arrow_keys;
-begin
- result:=m_poly.on_arrow_keys(left ,right ,down ,up );
-
-end;
-
-{ NUM_PATHS }
-function curve3_ctrl_impl.num_paths;
-begin
- result:=6;
-
-end;
-
-{ REWIND }
-procedure curve3_ctrl_impl.rewind;
-begin
- m_idx:=path_id;
-
- case path_id of
- 0 : // Control line
- begin
- m_curve.init3(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5,
- (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5,
- m_poly._xn(1 ) ,m_poly._yn(1 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 1 : // Control line 2
- begin
- m_curve.init3(
- m_poly._xn(1 ) ,m_poly._yn(1 ) ,
- (m_poly._xn(1 ) + m_poly._xn(2 ) ) * 0.5,
- (m_poly._yn(1 ) + m_poly._yn(2 ) ) * 0.5,
- m_poly._xn(2 ) ,m_poly._yn(2 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 2 : // Curve itself
- begin
- m_curve.init3(
- m_poly._xn(0 ) ,m_poly._yn(0 ) ,
- m_poly._xn(1 ) ,m_poly._yn(1 ) ,
- m_poly._xn(2 ) ,m_poly._yn(2 ) );
-
- m_stroke.rewind(0 );
-
- end;
-
- 3 : // Point 1
- begin
- m_ellipse.init (m_poly._xn(0 ) ,m_poly._yn(0 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- 4 : // Point 2
- begin
- m_ellipse.init (m_poly._xn(1 ) ,m_poly._yn(1 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- 5 : // Point 3
- begin
- m_ellipse.init (m_poly._xn(2 ) ,m_poly._yn(2 ) ,_point_radius ,_point_radius ,20 );
- m_ellipse.rewind(0 );
-
- end;
-
- end;
-
-end;
-
-{ VERTEX }
-function curve3_ctrl_impl.vertex;
-var
- cmd : unsigned;
-
-begin
- cmd:=path_cmd_stop;
-
- case m_idx of
- 0 ,1 ,2 :
- cmd:=m_stroke.vertex(x ,y );
-
- 3 ,4 ,5 ,6 :
- cmd:=m_ellipse.vertex(x ,y );
-
- end;
-
- if not is_stop(cmd ) then
- transform_xy(x ,y );
-
- result:=cmd;
-
-end;
-
-{ CONSTRUCT }
-constructor curve3_ctrl.Construct;
-begin
- inherited Construct;
-
- m_color.ConstrDbl(0.0 ,0.0 ,0.0 );
-
-end;
-
-{ LINE_COLOR_ }
-procedure curve3_ctrl.line_color_;
-begin
- m_color:=c^;
-
-end;
-
-{ _COLOR }
-function curve3_ctrl._color;
-begin
- result:=@m_color;
-
-end;
-
-END.
-
+//----------------------------------------------------------------------------
+// Anti-Grain Geometry - Version 2.4 (Public License)
+// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
+//
+// Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
+// Pascal Port By: Milan Marusinec alias Milano
+// milan@marusinec.sk
+// http://www.aggpas.org
+// Copyright (c) 2005-2006
+//
+// Permission to copy, use, modify, sell and distribute this software
+// is granted provided this copyright notice appears in all copies.
+// This software is provided "as is" without express or implied
+// warranty, and with no claim as to its suitability for any purpose.
+//
+//----------------------------------------------------------------------------
+// Contact: mcseem@antigrain.com
+// mcseemagg@yahoo.com
+// http://www.antigrain.com
+//
+//----------------------------------------------------------------------------
+//
+// classes bezier_ctrl_impl, bezier_ctrl
+//
+// [Pascal Port History] -----------------------------------------------------
+//
+// 23.02.2006-Milano: Unit port establishment
+//
+{ agg_bezier_ctrl.pas }
+unit
+ agg_bezier_ctrl ;
+
+INTERFACE
+
+{$I agg_mode.inc }
+
+uses
+ agg_basics ,
+ agg_ctrl ,
+ agg_math ,
+ agg_ellipse ,
+ agg_trans_affine ,
+ agg_color ,
+ agg_curves ,
+ agg_conv_stroke ,
+ agg_conv_curve ,
+ agg_polygon_ctrl ;
+
+{ TYPES DEFINITION }
+type
+ bezier_ctrl_impl = object(ctrl )
+ m_curve : curve4;
+ m_ellipse : ellipse;
+ m_stroke : conv_stroke;
+ m_poly : polygon_ctrl_impl;
+ m_idx : unsigned;
+
+ constructor Construct;
+ destructor Destruct; virtual;
+
+ procedure curve_(x1 ,y1 ,x2 ,y2 ,x3 ,y3 ,x4 ,y4 : double );
+ function _curve : curve4_ptr;
+
+ function _x1 : double;
+ function _y1 : double;
+ function _x2 : double;
+ function _y2 : double;
+ function _x3 : double;
+ function _y3 : double;
+ function _x4 : double;
+ function _y4 : double;
+
+ procedure x1_(x : double );
+ procedure y1_(y : double );
+ procedure x2_(x : double );
+ procedure y2_(y : double );
+ procedure x3_(x : double );
+ procedure y3_(y : double );
+ procedure x4_(x : double );
+ procedure y4_(y : double );
+
+ procedure line_width_(w : double );
+ function _line_width : double;
+
+ procedure point_radius_(r : double );
+ function _point_radius : double;
+
+ // Event handlers
+ function in_rect(x ,y : double ) : boolean; virtual;
+
+ function on_mouse_button_down(x ,y : double ) : boolean; virtual;
+ function on_mouse_button_up (x ,y : double ) : boolean; virtual;
+
+ function on_mouse_move(x ,y : double; button_flag : boolean ) : boolean; virtual;
+ function on_arrow_keys(left ,right ,down ,up : boolean ) : boolean; virtual;
+
+ // Vertex source interface
+ function num_paths : unsigned; virtual;
+ procedure rewind(path_id : unsigned ); virtual;
+ function vertex(x ,y : double_ptr ) : unsigned; virtual;
+
+ end;
+
+ bezier_ctrl = object(bezier_ctrl_impl )
+ m_color : aggclr;
+
+ constructor Construct;
+
+ procedure line_color_(c : aggclr_ptr );
+
+ function _color(i : unsigned ) : aggclr_ptr; virtual;
+
+ end;
+
+ curve3_ctrl_impl = object(ctrl )
+ m_curve : curve3;
+ m_ellipse : ellipse;
+ m_stroke : conv_stroke;
+ m_poly : polygon_ctrl_impl;
+ m_idx : unsigned;
+
+ constructor Construct;
+ destructor Destruct; virtual;
+
+ procedure curve_(x1 ,y1 ,x2 ,y2 ,x3 ,y3 : double );
+ function _curve : curve3_ptr;
+
+ function _x1 : double;
+ function _y1 : double;
+ function _x2 : double;
+ function _y2 : double;
+ function _x3 : double;
+ function _y3 : double;
+
+ procedure x1_(x : double );
+ procedure y1_(y : double );
+ procedure x2_(x : double );
+ procedure y2_(y : double );
+ procedure x3_(x : double );
+ procedure y3_(y : double );
+
+ procedure line_width_(w : double );
+ function _line_width : double;
+
+ procedure point_radius_(r : double );
+ function _point_radius : double;
+
+ // Event handlers
+ function in_rect(x ,y : double ) : boolean; virtual;
+
+ function on_mouse_button_down(x ,y : double ) : boolean; virtual;
+ function on_mouse_button_up (x ,y : double ) : boolean; virtual;
+
+ function on_mouse_move(x ,y : double; button_flag : boolean ) : boolean; virtual;
+ function on_arrow_keys(left ,right ,down ,up : boolean ) : boolean; virtual;
+
+ // Vertex source interface
+ function num_paths : unsigned; virtual;
+ procedure rewind(path_id : unsigned ); virtual;
+ function vertex(x ,y : double_ptr ) : unsigned; virtual;
+
+ end;
+
+ curve3_ctrl = object(curve3_ctrl_impl )
+ m_color : aggclr;
+
+ constructor Construct;
+
+ procedure line_color_(c : aggclr_ptr );
+
+ function _color(i : unsigned ) : aggclr_ptr; virtual;
+
+ end;
+
+{ GLOBAL PROCEDURES }
+
+
+IMPLEMENTATION
+{ LOCAL VARIABLES & CONSTANTS }
+{ UNIT IMPLEMENTATION }
+{ CONSTRUCT }
+constructor bezier_ctrl_impl.Construct;
+begin
+ inherited Construct(0 ,0 ,1 ,1 ,false );
+
+ m_curve.Construct;
+ m_ellipse.Construct;
+ m_stroke.Construct(@m_curve );
+ m_poly.Construct (4 ,5.0 );
+
+ m_idx:=0;
+
+ m_poly.in_polygon_check_(false );
+
+ m_poly.xn_ptr(0 )^:=100.0;
+ m_poly.yn_ptr(0 )^:= 0.0;
+ m_poly.xn_ptr(1 )^:=100.0;
+ m_poly.yn_ptr(1 )^:= 50.0;
+ m_poly.xn_ptr(2 )^:= 50.0;
+ m_poly.yn_ptr(2 )^:=100.0;
+ m_poly.xn_ptr(3 )^:= 0.0;
+ m_poly.yn_ptr(3 )^:=100.0;
+
+end;
+
+{ DESTRUCT }
+destructor bezier_ctrl_impl.Destruct;
+begin
+ m_curve.Destruct;
+ m_stroke.Destruct;
+ m_poly.Destruct;
+
+end;
+
+{ CURVE_ }
+procedure bezier_ctrl_impl.curve_;
+begin
+ m_poly.xn_ptr(0 )^:=x1;
+ m_poly.yn_ptr(0 )^:=y1;
+ m_poly.xn_ptr(1 )^:=x2;
+ m_poly.yn_ptr(1 )^:=y2;
+ m_poly.xn_ptr(2 )^:=x3;
+ m_poly.yn_ptr(2 )^:=y3;
+ m_poly.xn_ptr(3 )^:=x4;
+ m_poly.yn_ptr(3 )^:=y4;
+
+ _curve;
+
+end;
+
+{ _CURVE }
+function bezier_ctrl_impl._curve;
+begin
+ m_curve.init4(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) ,
+ m_poly._xn(2 ) ,m_poly._yn(2 ) ,
+ m_poly._xn(3 ) ,m_poly._yn(3 ) );
+
+ result:=@m_curve;
+
+end;
+
+{ _X1 }
+function bezier_ctrl_impl._x1;
+begin
+ result:=m_poly._xn(0 );
+
+end;
+
+{ _Y1 }
+function bezier_ctrl_impl._y1;
+begin
+ result:=m_poly._yn(0 );
+
+end;
+
+{ _X2 }
+function bezier_ctrl_impl._x2;
+begin
+ result:=m_poly._xn(1 );
+
+end;
+
+{ _Y2 }
+function bezier_ctrl_impl._y2;
+begin
+ result:=m_poly._yn(1 );
+
+end;
+
+{ _X3 }
+function bezier_ctrl_impl._x3;
+begin
+ result:=m_poly._xn(2 );
+
+end;
+
+{ _Y3 }
+function bezier_ctrl_impl._y3;
+begin
+ result:=m_poly._yn(2 );
+
+end;
+
+{ _X4 }
+function bezier_ctrl_impl._x4;
+begin
+ result:=m_poly._xn(3 );
+
+end;
+
+{ _Y4 }
+function bezier_ctrl_impl._y4;
+begin
+ result:=m_poly._yn(3 );
+
+end;
+
+{ X1_ }
+procedure bezier_ctrl_impl.x1_;
+begin
+ m_poly.xn_ptr(0 )^:=x;
+
+end;
+
+{ Y1_ }
+procedure bezier_ctrl_impl.y1_;
+begin
+ m_poly.yn_ptr(0 )^:=y;
+
+end;
+
+{ X2_ }
+procedure bezier_ctrl_impl.x2_;
+begin
+ m_poly.xn_ptr(1 )^:=x;
+
+end;
+
+{ Y2_ }
+procedure bezier_ctrl_impl.y2_;
+begin
+ m_poly.yn_ptr(1 )^:=y;
+
+end;
+
+{ X3_ }
+procedure bezier_ctrl_impl.x3_;
+begin
+ m_poly.xn_ptr(2 )^:=x;
+
+end;
+
+{ Y3_ }
+procedure bezier_ctrl_impl.y3_;
+begin
+ m_poly.yn_ptr(2 )^:=y;
+
+end;
+
+{ X4_ }
+procedure bezier_ctrl_impl.x4_;
+begin
+ m_poly.xn_ptr(3 )^:=x;
+
+end;
+
+{ Y4_ }
+procedure bezier_ctrl_impl.y4_;
+begin
+ m_poly.yn_ptr(3 )^:=y;
+
+end;
+
+{ LINE_WIDTH_ }
+procedure bezier_ctrl_impl.line_width_;
+begin
+ m_stroke.width_(w );
+
+end;
+
+{ _LINE_WIDTH }
+function bezier_ctrl_impl._line_width;
+begin
+ result:=m_stroke._width;
+
+end;
+
+{ POINT_RADIUS_ }
+procedure bezier_ctrl_impl.point_radius_;
+begin
+ m_poly.point_radius_(r );
+
+end;
+
+{ _POINT_RADIUS }
+function bezier_ctrl_impl._point_radius;
+begin
+ result:=m_poly._point_radius;
+
+end;
+
+{ IN_RECT }
+function bezier_ctrl_impl.in_rect;
+begin
+ result:=false;
+
+end;
+
+{ ON_MOUSE_BUTTON_DOWN }
+function bezier_ctrl_impl.on_mouse_button_down;
+begin
+ inverse_transform_xy(@x ,@y );
+
+ result:=m_poly.on_mouse_button_down(x ,y );
+
+end;
+
+{ ON_MOUSE_BUTTON_UP }
+function bezier_ctrl_impl.on_mouse_button_up;
+begin
+ result:=m_poly.on_mouse_button_up(x ,y );
+
+end;
+
+{ ON_MOUSE_MOVE }
+function bezier_ctrl_impl.on_mouse_move;
+begin
+ inverse_transform_xy(@x ,@y );
+
+ result:=m_poly.on_mouse_move(x ,y ,button_flag );
+
+end;
+
+{ ON_ARROW_KEYS }
+function bezier_ctrl_impl.on_arrow_keys;
+begin
+ result:=m_poly.on_arrow_keys(left ,right ,down ,up );
+
+end;
+
+{ NUM_PATHS }
+function bezier_ctrl_impl.num_paths;
+begin
+ result:=7;
+
+end;
+
+{ REWIND }
+procedure bezier_ctrl_impl.rewind;
+begin
+ m_idx:=path_id;
+
+ m_curve.approximation_scale_(scale );
+
+ case path_id of
+ 0 : // Control line 1
+ begin
+ m_curve.init4(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5 ,
+ (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5 ,
+ (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5 ,
+ (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5 ,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 1 : // Control line 2
+ begin
+ m_curve.init4(
+ m_poly._xn(2 ) ,m_poly._yn(2 ) ,
+ (m_poly._xn(2 ) + m_poly._xn(3 ) ) * 0.5,
+ (m_poly._yn(2 ) + m_poly._yn(3 ) ) * 0.5,
+ (m_poly._xn(2 ) + m_poly._xn(3 ) ) * 0.5,
+ (m_poly._yn(2 ) + m_poly._yn(3 ) ) * 0.5,
+ m_poly._xn(3 ) ,m_poly._yn(3 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 2 : // Curve itself
+ begin
+ m_curve.init4(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) ,
+ m_poly._xn(2 ) ,m_poly._yn(2 ) ,
+ m_poly._xn(3 ) ,m_poly._yn(3 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 3 : // Point 1
+ begin
+ m_ellipse.init (m_poly._xn(0 ) ,m_poly._yn(0 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ 4 : // Point 2
+ begin
+ m_ellipse.init (m_poly._xn(1 ) ,m_poly._yn(1 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ 5 : // Point 3
+ begin
+ m_ellipse.init (m_poly._xn(2 ) ,m_poly._yn(2 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ 6 : // Point 4
+ begin
+ m_ellipse.init (m_poly._xn(3 ) ,m_poly._yn(3 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ end;
+
+end;
+
+{ VERTEX }
+function bezier_ctrl_impl.vertex;
+var
+ cmd : unsigned;
+
+begin
+ cmd:=path_cmd_stop;
+
+ case m_idx of
+ 0 ,1 ,2 :
+ cmd:=m_stroke.vertex(x ,y );
+
+ 3 ,4 ,5 ,6 ,7 :
+ cmd:=m_ellipse.vertex(x, y);
+
+ end;
+
+ if not is_stop(cmd ) then
+ transform_xy(x ,y );
+
+ result:=cmd;
+
+end;
+
+{ CONSTRUCT }
+constructor bezier_ctrl.Construct;
+begin
+ inherited Construct;
+
+ m_color.ConstrDbl(0.0 ,0.0 ,0.0 );
+
+end;
+
+{ LINE_COLOR_ }
+procedure bezier_ctrl.line_color_;
+begin
+ m_color:=c^;
+
+end;
+
+{ _COLOR }
+function bezier_ctrl._color;
+begin
+ result:=@m_color;
+
+end;
+
+{ CONSTRUCT }
+constructor curve3_ctrl_impl.Construct;
+begin
+ inherited Construct(0 ,0 ,1 ,1 ,false );
+
+ m_curve.Construct;
+ m_ellipse.Construct;
+ m_stroke.Construct(@m_curve );
+ m_poly.Construct (3 ,5.0 );
+
+ m_idx:=0;
+
+ m_poly.in_polygon_check_(false );
+
+ m_poly.xn_ptr(0 )^:=100.0;
+ m_poly.yn_ptr(0 )^:= 0.0;
+ m_poly.xn_ptr(1 )^:=100.0;
+ m_poly.yn_ptr(1 )^:= 50.0;
+ m_poly.xn_ptr(2 )^:= 50.0;
+ m_poly.yn_ptr(2 )^:=100.0;
+
+end;
+
+{ DESTRUCT }
+destructor curve3_ctrl_impl.Destruct;
+begin
+ m_curve.Destruct;
+ m_stroke.Destruct;
+ m_poly.Destruct;
+
+end;
+
+{ CURVE_ }
+procedure curve3_ctrl_impl.curve_;
+begin
+ m_poly.xn_ptr(0 )^:=x1;
+ m_poly.yn_ptr(0 )^:=y1;
+ m_poly.xn_ptr(1 )^:=x2;
+ m_poly.yn_ptr(1 )^:=y2;
+ m_poly.xn_ptr(2 )^:=x3;
+ m_poly.yn_ptr(2 )^:=y3;
+
+ _curve;
+
+end;
+
+{ _CURVE }
+function curve3_ctrl_impl._curve;
+begin
+ m_curve.init3(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) ,
+ m_poly._xn(2 ) ,m_poly._yn(2 ) );
+
+ result:=@m_curve;
+
+end;
+
+{ _X1 }
+function curve3_ctrl_impl._x1;
+begin
+ result:=m_poly._xn(0 );
+
+end;
+
+{ _Y1 }
+function curve3_ctrl_impl._y1;
+begin
+ result:=m_poly._yn(0 );
+
+end;
+
+{ _X2 }
+function curve3_ctrl_impl._x2;
+begin
+ result:=m_poly._xn(1 );
+
+end;
+
+{ _Y2 }
+function curve3_ctrl_impl._y2;
+begin
+ result:=m_poly._yn(1 );
+
+end;
+
+{ _X3 }
+function curve3_ctrl_impl._x3;
+begin
+ result:=m_poly._xn(2 );
+
+end;
+
+{ _Y3 }
+function curve3_ctrl_impl._y3;
+begin
+ result:=m_poly._yn(2 );
+
+end;
+
+{ X1_ }
+procedure curve3_ctrl_impl.x1_;
+begin
+ m_poly.xn_ptr(0 )^:=x;
+
+end;
+
+{ Y1_ }
+procedure curve3_ctrl_impl.y1_;
+begin
+ m_poly.yn_ptr(0 )^:=y;
+
+end;
+
+{ X2_ }
+procedure curve3_ctrl_impl.x2_;
+begin
+ m_poly.xn_ptr(1 )^:=x;
+
+end;
+
+{ Y2_ }
+procedure curve3_ctrl_impl.y2_;
+begin
+ m_poly.yn_ptr(1 )^:=y;
+
+end;
+
+{ X3_ }
+procedure curve3_ctrl_impl.x3_;
+begin
+ m_poly.xn_ptr(2 )^:=x;
+
+end;
+
+{ Y3_ }
+procedure curve3_ctrl_impl.y3_;
+begin
+ m_poly.yn_ptr(2 )^:=y;
+
+end;
+
+{ LINE_WIDTH_ }
+procedure curve3_ctrl_impl.line_width_;
+begin
+ m_stroke.width_(w );
+
+end;
+
+{ _LINE_WIDTH }
+function curve3_ctrl_impl._line_width;
+begin
+ result:=m_stroke._width;
+
+end;
+
+{ POINT_RADIUS_ }
+procedure curve3_ctrl_impl.point_radius_;
+begin
+ m_poly.point_radius_(r );
+
+end;
+
+{ _POINT_RADIUS }
+function curve3_ctrl_impl._point_radius;
+begin
+ result:=m_poly._point_radius;
+
+end;
+
+{ IN_RECT }
+function curve3_ctrl_impl.in_rect;
+begin
+ result:=false;
+
+end;
+
+{ ON_MOUSE_BUTTON_DOWN }
+function curve3_ctrl_impl.on_mouse_button_down;
+begin
+ inverse_transform_xy(@x ,@y );
+
+ result:=m_poly.on_mouse_button_down(x ,y );
+
+end;
+
+{ ON_MOUSE_BUTTON_UP }
+function curve3_ctrl_impl.on_mouse_button_up;
+begin
+ result:=m_poly.on_mouse_button_up(x ,y );
+
+end;
+
+{ ON_MOUSE_MOVE }
+function curve3_ctrl_impl.on_mouse_move;
+begin
+ inverse_transform_xy(@x ,@y );
+
+ result:=m_poly.on_mouse_move(x ,y ,button_flag );
+
+end;
+
+{ ON_ARROW_KEYS }
+function curve3_ctrl_impl.on_arrow_keys;
+begin
+ result:=m_poly.on_arrow_keys(left ,right ,down ,up );
+
+end;
+
+{ NUM_PATHS }
+function curve3_ctrl_impl.num_paths;
+begin
+ result:=6;
+
+end;
+
+{ REWIND }
+procedure curve3_ctrl_impl.rewind;
+begin
+ m_idx:=path_id;
+
+ case path_id of
+ 0 : // Control line
+ begin
+ m_curve.init3(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ (m_poly._xn(0 ) + m_poly._xn(1 ) ) * 0.5,
+ (m_poly._yn(0 ) + m_poly._yn(1 ) ) * 0.5,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 1 : // Control line 2
+ begin
+ m_curve.init3(
+ m_poly._xn(1 ) ,m_poly._yn(1 ) ,
+ (m_poly._xn(1 ) + m_poly._xn(2 ) ) * 0.5,
+ (m_poly._yn(1 ) + m_poly._yn(2 ) ) * 0.5,
+ m_poly._xn(2 ) ,m_poly._yn(2 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 2 : // Curve itself
+ begin
+ m_curve.init3(
+ m_poly._xn(0 ) ,m_poly._yn(0 ) ,
+ m_poly._xn(1 ) ,m_poly._yn(1 ) ,
+ m_poly._xn(2 ) ,m_poly._yn(2 ) );
+
+ m_stroke.rewind(0 );
+
+ end;
+
+ 3 : // Point 1
+ begin
+ m_ellipse.init (m_poly._xn(0 ) ,m_poly._yn(0 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ 4 : // Point 2
+ begin
+ m_ellipse.init (m_poly._xn(1 ) ,m_poly._yn(1 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ 5 : // Point 3
+ begin
+ m_ellipse.init (m_poly._xn(2 ) ,m_poly._yn(2 ) ,_point_radius ,_point_radius ,20 );
+ m_ellipse.rewind(0 );
+
+ end;
+
+ end;
+
+end;
+
+{ VERTEX }
+function curve3_ctrl_impl.vertex;
+var
+ cmd : unsigned;
+
+begin
+ cmd:=path_cmd_stop;
+
+ case m_idx of
+ 0 ,1 ,2 :
+ cmd:=m_stroke.vertex(x ,y );
+
+ 3 ,4 ,5 ,6 :
+ cmd:=m_ellipse.vertex(x ,y );
+
+ end;
+
+ if not is_stop(cmd ) then
+ transform_xy(x ,y );
+
+ result:=cmd;
+
+end;
+
+{ CONSTRUCT }
+constructor curve3_ctrl.Construct;
+begin
+ inherited Construct;
+
+ m_color.ConstrDbl(0.0 ,0.0 ,0.0 );
+
+end;
+
+{ LINE_COLOR_ }
+procedure curve3_ctrl.line_color_;
+begin
+ m_color:=c^;
+
+end;
+
+{ _COLOR }
+function curve3_ctrl._color;
+begin
+ result:=@m_color;
+
+end;
+
+END.
+