The unified diff between revisions [b129692a..] and [aa05e185..] is displayed below. It can also be downloaded as a raw diff.
#
#
# patch "testgtk/testcairo.adb"
# from [39e8aeec30ad1bdbfd99c410a24a5c9b8f1a4ae5]
# to [d5eb1056ed754822575d74b2947a6d4658250f18]
#
============================================================
--- testgtk/testcairo.adb 39e8aeec30ad1bdbfd99c410a24a5c9b8f1a4ae5
+++ testgtk/testcairo.adb d5eb1056ed754822575d74b2947a6d4658250f18
@@ -26,9 +26,16 @@
-- executable file might be covered by the GNU Public License. --
-----------------------------------------------------------------------
+pragma Ada_2005;
+
+with Ada.Numerics;
+with Ada.Numerics.Generic_Elementary_Functions;
+
with Glib; use Glib;
-with Cairo; use Cairo;
+with Cairo; use Cairo;
+with Cairo.Matrix; use Cairo.Matrix;
+with Cairo.Pattern; use Cairo.Pattern;
with Gdk.Cairo; use Gdk.Cairo;
@@ -38,9 +45,18 @@ procedure Testcairo is
with Gtk.Handlers; use Gtk.Handlers;
procedure Testcairo is
+
+ package Gdouble_Numerics is new Ada.Numerics.Generic_Elementary_Functions
+ (Gdouble);
+ use Gdouble_Numerics;
+
+ -- Pi : constant Gdouble := Gdouble (Ada.Numerics.Pi);
+ Two_Pi : constant Gdouble := Gdouble (2.0 * Ada.Numerics.Pi);
+
Win : Gtk_Window;
- type Test_Type is (Rectangles);
+ type Test_Type is (Rectangles, Transparency, Matrix, Transformations,
+ Paths, Patterns);
package Event_Cb is new Gtk.Handlers.Return_Callback
(Gtk_Window_Record, Boolean);
@@ -57,9 +73,12 @@ procedure Testcairo is
is
pragma Unreferenced (Event);
Cr : Cairo_Context;
- D : Gdouble;
+ D, D2, D3 : Gdouble;
+ M, M2, M3 : Cairo_Matrix_Access;
- Test : constant Test_Type := Rectangles;
+ P : Cairo_Pattern;
+
+ Test : constant Test_Type := Test_Type'Last;
begin
Cr := Create (Get_Window (Win));
@@ -74,7 +93,204 @@ procedure Testcairo is
Rectangle (Cr, 0.0, 0.0, D * 10.0, D * 10.0);
Fill (Cr);
end loop;
+
+ when Transparency =>
+ for J in 1 .. 5 loop
+ D := Gdouble (J);
+
+ -- Create a transparent color
+ Set_Source_Rgba (Cr, 0.0, 0.0, 1.0, 1.0 - D / 5.0);
+
+ -- Draw a disk
+ Arc (Cr => Cr,
+ Xc => 100.0 + D * 60.0,
+ Yc => 100.0,
+ Radius => 100.0,
+ Angle1 => 0.0,
+ Angle2 => Two_Pi);
+ Fill (Cr);
+ end loop;
+
+ when Matrix =>
+ M := new Cairo_Matrix;
+ M2 := new Cairo_Matrix;
+ M3 := new Cairo_Matrix;
+
+ for J in 1 .. 50 loop
+ D := Gdouble (J - 1) / 50.0;
+
+ -- Create a color
+ Set_Source_Rgba (Cr, 0.0, 1.0 - D, D, 0.7);
+
+ -- Create a rotation matrix
+ Init_Rotate (M, Two_Pi * D);
+
+ -- Create a translation matrix
+ Init_Translate (M2, 400.0 * D + 50.0, 200.0 * D + 50.0);
+
+ -- Create a scale matrix
+ Init_Scale (M3, 1.0 - D, 1.0 - D);
+
+ -- We want first to scale, then rotate...
+ Multiply (M, M, M3);
+
+ -- ...then translate.
+ Multiply (M, M, M2);
+
+ -- Reset the transformation matrix on CR...
+ Identity_Matrix (Cr);
+
+ -- ... then apply our scale + rotate + translate matrix
+ Transform (Cr, M);
+
+ -- Draw a rectangle
+ Rectangle (Cr, -50.0, -50.0, 100.0, 100.0);
+ Fill (Cr);
+ end loop;
+
+ Unchecked_Free (M);
+ Unchecked_Free (M2);
+ Unchecked_Free (M3);
+
+ when Transformations =>
+ for J in 1 .. 50 loop
+ D := Gdouble (J - 1) / 50.0;
+
+ -- Create a color
+ Set_Source_Rgba (Cr, 0.0, 1.0 - D, D, 0.7);
+
+ -- Reset the transformation matrix on CR...
+ Identity_Matrix (Cr);
+
+ -- ... then apply our scale + rotate + translate matrix
+ Translate (Cr, 400.0 * D + 50.0, 200.0 * D + 50.0);
+ Rotate (Cr, Two_Pi * D);
+ Scale (Cr, 1.0 - D, 1.0 - D);
+
+ -- Draw a rectangle
+ Rectangle (Cr, -50.0, -50.0, 100.0, 100.0);
+ Fill (Cr);
+ end loop;
+
+ when Paths =>
+ New_Path (Cr);
+
+ Move_To (Cr, 2.0, 50.0);
+ for J in 2 .. 40 loop
+ D := Gdouble (J) / 20.0;
+ Line_To (Cr, 300.0 * D, 50.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Source_Rgb (Cr, 0.2, 0.0, 0.5);
+ Stroke (Cr);
+
+ Move_To (Cr, 2.0, 100.0);
+ for J in 2 .. 40 loop
+ D := Gdouble (J - 1) / 20.0;
+ D2 := (Gdouble (J) - 1.6) / 20.0;
+ D3 := (Gdouble (J) - 1.3) / 20.0;
+
+ Curve_To (Cr,
+ 300.0 * D2,
+ 100.0 + 50.0 * Sin (Two_Pi * D2 * 2.0),
+
+ 300.0 * D3,
+ 100.0 + 50.0 * Sin (Two_Pi * D3 * 2.0),
+
+ 300.0 * D,
+
+ 100.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Source_Rgb (Cr, 0.5, 0.0, 0.2);
+ Stroke (Cr);
+
+ Move_To (Cr, 2.0, 150.0);
+ for J in 2 .. 40 loop
+ D := Gdouble (J - 1) / 20.0;
+ Line_To (Cr, 300.0 * D, 150.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Source_Rgb (Cr, 0.5, 0.0, 0.5);
+ Set_Dash (Cr, (1 => 15.0, 2 => 10.0, 3 => 2.0, 4 => 10.0), 0.1);
+ Stroke (Cr);
+
+ Move_To (Cr, 2.0, 200.0);
+ for J in 1 .. 40 loop
+ D := Gdouble (J - 1) / 20.0;
+ Line_To (Cr, 300.0 * D, 200.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Line_Width (Cr, 7.0);
+ Set_Line_Cap (Cr, Cairo_Line_Cap_Round);
+ Set_Source_Rgb (Cr, 0.5, 0.5, 1.0);
+ Stroke (Cr);
+
+ Move_To (Cr, 2.0, 250.0);
+ for J in 2 .. 40 loop
+ D := Gdouble (J - 1) / 20.0;
+ Line_To (Cr, 300.0 * D, 250.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Line_Width (Cr, 1.0);
+ Set_Line_Cap (Cr, Cairo_Line_Cap_Butt);
+ Set_Source_Rgb (Cr, 0.0, 0.0, 0.0);
+ Set_Dash (Cr, No_Dashes, 0.0);
+ Stroke (Cr);
+
+ Move_To (Cr, 2.0, 300.0);
+ for J in 2 .. 40 loop
+ D := Gdouble (J - 1) / 20.0;
+ Line_To (Cr, 300.0 * D, 300.0 + 50.0 * Sin (Two_Pi * D * 2.0));
+ end loop;
+
+ Set_Antialias (Cr, Cairo_Antialias_None);
+ Stroke (Cr);
+
+ when Patterns =>
+ P := Create_Rgb (1.0, 1.0, 0.0);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 10.0, 10.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
+
+ P := Create_Rgba (0.0, 0.0, 1.0, 0.3);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 5.0, 30.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
+
+ P := Create_Linear (70.0, 10.0, 120.0, 60.0);
+ Add_Color_Stop_Rgb (P, 0.0, 1.0, 1.0, 0.0);
+ Add_Color_Stop_Rgb (P, 1.0, 0.0, 0.0, 1.0);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 70.0, 10.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
+
+ P := Create_Rgb (1.0, 1.0, 0.0);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 130.0, 10.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
+ P := Create_Linear (175.0, 30.0, 125.0, 80.0);
+ Add_Color_Stop_Rgba (P, 0.0, 0.0, 1.0, 0.0, 0.0);
+ Add_Color_Stop_Rgba (P, 1.0, 0.0, 0.0, 1.0, 1.0);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 125.0, 30.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
+
+ Set_Source_Rgb (Cr, 0.5, 0.0, 0.5);
+ P := Create_Radial (215.0, 35.0, 10.0, 215.0, 35.0, 30.0);
+ Add_Color_Stop_Rgba (P, 0.0, 0.0, 1.0, 0.0, 0.0);
+ Add_Color_Stop_Rgba (P, 1.0, 0.0, 0.0, 1.0, 1.0);
+ Set_Source (Cr, P);
+ Rectangle (Cr, 190.0, 10.0, 50.0, 50.0);
+ Fill (Cr);
+ Destroy (P);
end case;
+
Destroy (Cr);
return True;
end Expose_Cb;
@@ -83,6 +299,7 @@ begin
Gtk.Main.Set_Locale;
Gtk.Main.Init;
Gtk_New (Win);
+ Set_Default_Size (Win, 600, 400);
-- Connect to the "expose" event.