diff --git a/src/Tizen.NUI.PenWave/Properties/AssemblyInfo.cs b/src/Tizen.NUI.PenWave/Properties/AssemblyInfo.cs
new file mode 100755
index 00000000000..58d444169cb
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/Properties/AssemblyInfo.cs
@@ -0,0 +1,4 @@
+using Tizen.NUI;
+
+// Xamarin.Forms.Loader.dll Xamarin.Forms.Xaml.XamlLoader.Load(object, string), kzu@microsoft.com
+[assembly: XmlnsDefinition("http://tizen.org/Tizen.NUI/2018/XAML", "Tizen.NUI.PenWave")]
diff --git a/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.csproj b/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.csproj
new file mode 100755
index 00000000000..3d6d7e346b1
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net6.0
+ $(NoWarn);CS0618;CA1054;CA1056
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.sln b/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.sln
new file mode 100755
index 00000000000..ce4854b735a
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/Tizen.NUI.PenWave.sln
@@ -0,0 +1,79 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31515.178
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI.PenWave", "Tizen.NUI.PenWave.csproj", "{F6CEE887-775A-4623-8BF8-DCA18C363D62}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI", "..\Tizen.NUI\Tizen.NUI.csproj", "{F9DAA9C3-593D-467E-B02C-FFF51F1BC8CD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.Common", "..\Tizen.Applications.Common\Tizen.Applications.Common.csproj", "{CE90CD24-82F7-45A3-96B2-2E3C97D25C30}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.System.SystemSettings", "..\Tizen.System.SystemSettings\Tizen.System.SystemSettings.csproj", "{D726EEB8-6382-4BA3-BE0C-D9E61B5D8374}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen", "..\Tizen\Tizen.csproj", "{6D5FFD69-6DCC-4953-85E9-C23AC18B190E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.System.Information", "..\Tizen.System.Information\Tizen.System.Information.csproj", "{A951EAFE-D191-4F45-9AEF-7D97C382A747}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Log", "..\Tizen.Log\Tizen.Log.csproj", "{E1E30AEC-AD46-4E53-B9B1-780A68B59963}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.ComponentBased", "..\Tizen.Applications.ComponentBased\Tizen.Applications.ComponentBased.csproj", "{70341AA2-1324-4215-9DB8-BFB13389D932}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.ThemeManager", "..\Tizen.Applications.ThemeManager\Tizen.Applications.ThemeManager.csproj", "{F6A776BF-6743-4C1D-A8AF-F3E9F8CEFA0A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Tracer", "..\Tizen.Tracer\Tizen.Tracer.csproj", "{6DABE78F-1816-4F2E-8966-F909173194C8}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F6CEE887-775A-4623-8BF8-DCA18C363D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F6CEE887-775A-4623-8BF8-DCA18C363D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F6CEE887-775A-4623-8BF8-DCA18C363D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F6CEE887-775A-4623-8BF8-DCA18C363D62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9DAA9C3-593D-467E-B02C-FFF51F1BC8CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F9DAA9C3-593D-467E-B02C-FFF51F1BC8CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9DAA9C3-593D-467E-B02C-FFF51F1BC8CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F9DAA9C3-593D-467E-B02C-FFF51F1BC8CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CE90CD24-82F7-45A3-96B2-2E3C97D25C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CE90CD24-82F7-45A3-96B2-2E3C97D25C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CE90CD24-82F7-45A3-96B2-2E3C97D25C30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CE90CD24-82F7-45A3-96B2-2E3C97D25C30}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D726EEB8-6382-4BA3-BE0C-D9E61B5D8374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D726EEB8-6382-4BA3-BE0C-D9E61B5D8374}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D726EEB8-6382-4BA3-BE0C-D9E61B5D8374}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D726EEB8-6382-4BA3-BE0C-D9E61B5D8374}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6D5FFD69-6DCC-4953-85E9-C23AC18B190E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6D5FFD69-6DCC-4953-85E9-C23AC18B190E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6D5FFD69-6DCC-4953-85E9-C23AC18B190E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6D5FFD69-6DCC-4953-85E9-C23AC18B190E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A951EAFE-D191-4F45-9AEF-7D97C382A747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A951EAFE-D191-4F45-9AEF-7D97C382A747}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A951EAFE-D191-4F45-9AEF-7D97C382A747}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A951EAFE-D191-4F45-9AEF-7D97C382A747}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1E30AEC-AD46-4E53-B9B1-780A68B59963}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1E30AEC-AD46-4E53-B9B1-780A68B59963}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1E30AEC-AD46-4E53-B9B1-780A68B59963}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1E30AEC-AD46-4E53-B9B1-780A68B59963}.Release|Any CPU.Build.0 = Release|Any CPU
+ {70341AA2-1324-4215-9DB8-BFB13389D932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {70341AA2-1324-4215-9DB8-BFB13389D932}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {70341AA2-1324-4215-9DB8-BFB13389D932}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {70341AA2-1324-4215-9DB8-BFB13389D932}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F6A776BF-6743-4C1D-A8AF-F3E9F8CEFA0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F6A776BF-6743-4C1D-A8AF-F3E9F8CEFA0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F6A776BF-6743-4C1D-A8AF-F3E9F8CEFA0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F6A776BF-6743-4C1D-A8AF-F3E9F8CEFA0A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6DABE78F-1816-4F2E-8966-F909173194C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6DABE78F-1816-4F2E-8966-F909173194C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6DABE78F-1816-4F2E-8966-F909173194C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6DABE78F-1816-4F2E-8966-F909173194C8}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {83C85CFB-3AB8-403A-9F6D-CC2783C6C559}
+ EndGlobalSection
+EndGlobal
diff --git a/src/Tizen.NUI.PenWave/res/3d/3dmodel_thumb.png b/src/Tizen.NUI.PenWave/res/3d/3dmodel_thumb.png
new file mode 100644
index 00000000000..2ef22d4484f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/3dmodel_thumb.png differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/Irradiance.ktx b/src/Tizen.NUI.PenWave/res/3d/Irradiance.ktx
new file mode 100644
index 00000000000..df24c05eb8a
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/Irradiance.ktx differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/Radiance.ktx b/src/Tizen.NUI.PenWave/res/3d/Radiance.ktx
new file mode 100644
index 00000000000..51aa6817fed
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/Radiance.ktx differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/assembled.bin b/src/Tizen.NUI.PenWave/res/3d/assembled.bin
new file mode 100644
index 00000000000..0f84250ab0f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/assembled.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/assembled.gltf b/src/Tizen.NUI.PenWave/res/3d/assembled.gltf
new file mode 100644
index 00000000000..88d2dd6e626
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/assembled.gltf
@@ -0,0 +1,495 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.001",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ },
+ {
+ "mesh" : 1,
+ "name" : "Cube.002",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ },
+ {
+ "mesh" : 2,
+ "name" : "Cube.003",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ },
+ {
+ "mesh" : 3,
+ "name" : "Cube.004",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ },
+ {
+ "mesh" : 4,
+ "name" : "Cube.005",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.001",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ },
+ {
+ "doubleSided" : true,
+ "name" : "Material.002",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ },
+ {
+ "doubleSided" : true,
+ "name" : "Material.003",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ },
+ {
+ "doubleSided" : true,
+ "name" : "Material.004",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ },
+ {
+ "doubleSided" : true,
+ "name" : "Material.005",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.001",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ },
+ {
+ "name" : "Cube.002",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 4,
+ "NORMAL" : 5,
+ "TEXCOORD_0" : 6
+ },
+ "indices" : 7,
+ "material" : 1
+ }
+ ]
+ },
+ {
+ "name" : "Cube.003",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 8,
+ "NORMAL" : 9,
+ "TEXCOORD_0" : 10
+ },
+ "indices" : 11,
+ "material" : 2
+ }
+ ]
+ },
+ {
+ "name" : "Cube.004",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 12,
+ "NORMAL" : 13,
+ "TEXCOORD_0" : 14
+ },
+ "indices" : 15,
+ "material" : 3
+ }
+ ]
+ },
+ {
+ "name" : "Cube.005",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 16,
+ "NORMAL" : 17,
+ "TEXCOORD_0" : 18
+ },
+ "indices" : 19,
+ "material" : 4
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 144,
+ "max" : [
+ 1,
+ 3,
+ 3
+ ],
+ "min" : [
+ -1,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 228,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 4,
+ "componentType" : 5126,
+ "count" : 144,
+ "max" : [
+ 3,
+ 3,
+ 3
+ ],
+ "min" : [
+ 1,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 5,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 6,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 7,
+ "componentType" : 5123,
+ "count" : 228,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 8,
+ "componentType" : 5126,
+ "count" : 210,
+ "max" : [
+ 1,
+ 3,
+ 3
+ ],
+ "min" : [
+ -3,
+ -1,
+ -1
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 9,
+ "componentType" : 5126,
+ "count" : 210,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 10,
+ "componentType" : 5126,
+ "count" : 210,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 11,
+ "componentType" : 5123,
+ "count" : 336,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 12,
+ "componentType" : 5126,
+ "count" : 204,
+ "max" : [
+ 1,
+ 3,
+ 1
+ ],
+ "min" : [
+ -3,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 13,
+ "componentType" : 5126,
+ "count" : 204,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 14,
+ "componentType" : 5126,
+ "count" : 204,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 15,
+ "componentType" : 5123,
+ "count" : 324,
+ "type" : "SCALAR"
+ },
+ {
+ "bufferView" : 16,
+ "componentType" : 5126,
+ "count" : 205,
+ "max" : [
+ 3,
+ 1,
+ 3
+ ],
+ "min" : [
+ -3,
+ -3,
+ -1
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 17,
+ "componentType" : 5126,
+ "count" : 205,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 18,
+ "componentType" : 5126,
+ "count" : 205,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 19,
+ "componentType" : 5123,
+ "count" : 324,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 1728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1152,
+ "byteOffset" : 3456
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 456,
+ "byteOffset" : 4608
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 5064
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 6792
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1152,
+ "byteOffset" : 8520
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 456,
+ "byteOffset" : 9672
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2520,
+ "byteOffset" : 10128
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2520,
+ "byteOffset" : 12648
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1680,
+ "byteOffset" : 15168
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 672,
+ "byteOffset" : 16848
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2448,
+ "byteOffset" : 17520
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2448,
+ "byteOffset" : 19968
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1632,
+ "byteOffset" : 22416
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 648,
+ "byteOffset" : 24048
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2460,
+ "byteOffset" : 24696
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2460,
+ "byteOffset" : 27156
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1640,
+ "byteOffset" : 29616
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 648,
+ "byteOffset" : 31256
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 31904,
+ "uri" : "assembled.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part1.bin b/src/Tizen.NUI.PenWave/res/3d/part1.bin
new file mode 100644
index 00000000000..f62fb66b725
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part1.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part1.gltf b/src/Tizen.NUI.PenWave/res/3d/part1.gltf
new file mode 100644
index 00000000000..5c6ca6fc46f
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part1.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.006",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.006",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.006",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 202,
+ "max" : [
+ 3,
+ 3,
+ 1
+ ],
+ "min" : [
+ -1,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 202,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 202,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 324,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 2424,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2424,
+ "byteOffset" : 2424
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1616,
+ "byteOffset" : 4848
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 648,
+ "byteOffset" : 6464
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 7112,
+ "uri" : "part1.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part2.bin b/src/Tizen.NUI.PenWave/res/3d/part2.bin
new file mode 100644
index 00000000000..8419fb2429f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part2.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part2.gltf b/src/Tizen.NUI.PenWave/res/3d/part2.gltf
new file mode 100644
index 00000000000..0dcbfe72a81
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part2.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.007",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.007",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.007",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 205,
+ "max" : [
+ 1,
+ 3,
+ 1
+ ],
+ "min" : [
+ -3,
+ -1,
+ -5
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 205,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 205,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 324,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 2460,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2460,
+ "byteOffset" : 2460
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1640,
+ "byteOffset" : 4920
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 648,
+ "byteOffset" : 6560
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 7208,
+ "uri" : "part2.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part3.bin b/src/Tizen.NUI.PenWave/res/3d/part3.bin
new file mode 100644
index 00000000000..e197828d1ac
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part3.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part3.gltf b/src/Tizen.NUI.PenWave/res/3d/part3.gltf
new file mode 100644
index 00000000000..8889668dfb2
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part3.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.008",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.008",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.008",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 210,
+ "max" : [
+ 1,
+ 3,
+ 1
+ ],
+ "min" : [
+ -3,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 210,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 210,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 336,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 2520,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2520,
+ "byteOffset" : 2520
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1680,
+ "byteOffset" : 5040
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 672,
+ "byteOffset" : 6720
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 7392,
+ "uri" : "part3.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part4.bin b/src/Tizen.NUI.PenWave/res/3d/part4.bin
new file mode 100644
index 00000000000..929a4f68e86
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part4.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part4.gltf b/src/Tizen.NUI.PenWave/res/3d/part4.gltf
new file mode 100644
index 00000000000..792decad9c3
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part4.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.009",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.009",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.009",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 144,
+ "max" : [
+ 1,
+ 5,
+ 3
+ ],
+ "min" : [
+ -1,
+ -1,
+ -1
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 228,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 1728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1152,
+ "byteOffset" : 3456
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 456,
+ "byteOffset" : 4608
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 5064,
+ "uri" : "part4.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part5.bin b/src/Tizen.NUI.PenWave/res/3d/part5.bin
new file mode 100644
index 00000000000..d838e210846
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part5.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part5.gltf b/src/Tizen.NUI.PenWave/res/3d/part5.gltf
new file mode 100644
index 00000000000..738b22ef136
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part5.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.010",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.010",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.010",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 197,
+ "max" : [
+ 3,
+ 5,
+ 1
+ ],
+ "min" : [
+ -1,
+ -1,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 197,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 197,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 300,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 2364,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2364,
+ "byteOffset" : 2364
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1576,
+ "byteOffset" : 4728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 600,
+ "byteOffset" : 6304
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 6904,
+ "uri" : "part5.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/part6.bin b/src/Tizen.NUI.PenWave/res/3d/part6.bin
new file mode 100644
index 00000000000..8559cc98644
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/part6.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/part6.gltf b/src/Tizen.NUI.PenWave/res/3d/part6.gltf
new file mode 100644
index 00000000000..d05f6bd3014
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/part6.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.011",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.011",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.22352,
+ 0.27843,
+ 0.66666,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.011",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 144,
+ "max" : [
+ 1,
+ 1,
+ 1
+ ],
+ "min" : [
+ -1,
+ -3,
+ -5
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 144,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 228,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1728,
+ "byteOffset" : 1728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1152,
+ "byteOffset" : 3456
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 456,
+ "byteOffset" : 4608
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 5064,
+ "uri" : "part6.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/3d/solution.bin b/src/Tizen.NUI.PenWave/res/3d/solution.bin
new file mode 100644
index 00000000000..a427164eb59
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/3d/solution.bin differ
diff --git a/src/Tizen.NUI.PenWave/res/3d/solution.gltf b/src/Tizen.NUI.PenWave/res/3d/solution.gltf
new file mode 100644
index 00000000000..216a6bef76f
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/3d/solution.gltf
@@ -0,0 +1,123 @@
+{
+ "asset" : {
+ "generator" : "Khronos glTF Blender I/O v3.2.43",
+ "version" : "2.0"
+ },
+ "scene" : 0,
+ "scenes" : [
+ {
+ "name" : "Scene",
+ "nodes" : [
+ 0
+ ]
+ }
+ ],
+ "nodes" : [
+ {
+ "mesh" : 0,
+ "name" : "Cube.018",
+ "rotation" : [
+ 0.7071068286895752,
+ 0,
+ 0,
+ 0.7071067094802856
+ ]
+ }
+ ],
+ "materials" : [
+ {
+ "doubleSided" : true,
+ "name" : "Material.018",
+ "pbrMetallicRoughness" : {
+ "baseColorFactor" : [
+ 0.85882,
+ 0.92941,
+ 0.0,
+ 1
+ ],
+ "metallicFactor" : 0.5,
+ "roughnessFactor" : 0.5
+ }
+ }
+ ],
+ "meshes" : [
+ {
+ "name" : "Cube.018",
+ "primitives" : [
+ {
+ "attributes" : {
+ "POSITION" : 0,
+ "NORMAL" : 1,
+ "TEXCOORD_0" : 2
+ },
+ "indices" : 3,
+ "material" : 0
+ }
+ ]
+ }
+ ],
+ "accessors" : [
+ {
+ "bufferView" : 0,
+ "componentType" : 5126,
+ "count" : 197,
+ "max" : [
+ 3,
+ 1,
+ 1
+ ],
+ "min" : [
+ -3,
+ -3,
+ -3
+ ],
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 1,
+ "componentType" : 5126,
+ "count" : 197,
+ "type" : "VEC3"
+ },
+ {
+ "bufferView" : 2,
+ "componentType" : 5126,
+ "count" : 197,
+ "type" : "VEC2"
+ },
+ {
+ "bufferView" : 3,
+ "componentType" : 5123,
+ "count" : 300,
+ "type" : "SCALAR"
+ }
+ ],
+ "bufferViews" : [
+ {
+ "buffer" : 0,
+ "byteLength" : 2364,
+ "byteOffset" : 0
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 2364,
+ "byteOffset" : 2364
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 1576,
+ "byteOffset" : 4728
+ },
+ {
+ "buffer" : 0,
+ "byteLength" : 600,
+ "byteOffset" : 6304
+ }
+ ],
+ "buffers" : [
+ {
+ "byteLength" : 6904,
+ "uri" : "solution.bin"
+ }
+ ]
+}
diff --git a/src/Tizen.NUI.PenWave/res/charts/chart_data.txt b/src/Tizen.NUI.PenWave/res/charts/chart_data.txt
new file mode 100644
index 00000000000..b5acfd1cc1b
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/charts/chart_data.txt
@@ -0,0 +1,2204 @@
+-10 -1.1878
+-9.9 0.0552767
+-9.8 -1.53886
+-9.7 -1.71388
+-9.6 0.306392
+-9.5 -0.124741
+-9.4 -1.72641
+-9.3 -0.317125
+-9.2 -3.08983
+-9.1 -0.876645
+-9 -0.902333
+-8.9 -3.54475
+-8.8 -1.98134
+-8.7 -2.19984
+-8.59999 -3.32084
+-8.49999 -2.19434
+-8.39999 -1.35461
+-8.29999 -2.12511
+-8.19999 -1.41964
+-8.09999 -2.38842
+-7.99999 -3.36507
+-7.89999 -3.05368
+-7.79999 -1.74009
+-7.69999 -3.80167
+-7.59999 -2.51005
+-7.49999 -1.17207
+-7.39999 -2.4233
+-7.29999 -1.47349
+-7.19999 -2.78787
+-7.09999 -0.624278
+-6.99999 -1.10207
+-6.89999 -1.54325
+-6.79999 -0.954359
+-6.69999 0.160383
+-6.59999 -0.266853
+-6.49999 -0.468631
+-6.39999 0.401945
+-6.29999 -1.44426
+-6.19999 -0.0604244
+-6.09999 1.20532
+-5.99999 1.72976
+-5.89999 0.233058
+-5.79999 1.9875
+-5.7 1.19079
+-5.6 2.57394
+-5.5 0.28733
+-5.4 0.67759
+-5.3 2.94053
+-5.2 2.9024
+-5.1 0.995513
+-5 2.2652
+-4.9 1.20404
+-4.8 2.54041
+-4.7 2.03419
+-4.6 1.80117
+-4.5 1.29892
+-4.4 1.98148
+-4.3 3.33023
+-4.2 0.59439
+-4.1 2.76428
+-4 3.06516
+-3.9 2.62866
+-3.8 1.12506
+-3.7 1.77508
+-3.6 2.20824
+-3.5 0.0291284
+-3.4 0.228083
+-3.3 1.28372
+-3.2 0.01367
+-3.1 1.35722
+-3 0.446972
+-2.9 -0.52066
+-2.8 -0.884297
+-2.7 -0.237267
+-2.6 0.81625
+-2.5 -1.32986
+-2.4 -0.117191
+-2.3 -1.8021
+-2.2 -1.79392
+-2.1 -0.707202
+-2 -1.36541
+-1.9 -0.132178
+-1.8 -0.129347
+-1.7 -2.45206
+-1.6 -1.70438
+-1.5 -1.89285
+-1.4 -1.65577
+-1.3 -0.144074
+-1.2 -1.88403
+-1.1 -1.26604
+-0.999998 -0.452166
+-0.899998 -1.74505
+-0.799998 -1.40521
+-0.699998 1.07369
+-0.599998 0.607724
+-0.499998 1.56386
+-0.399998 2.05086
+-0.299998 1.97297
+-0.199998 1.1736
+-0.0999981 0.576952
+1.86116e-06 2.0244
+0.100002 0.489821
+0.200002 2.0918
+0.300002 3.33113
+0.400002 2.58649
+0.500002 2.37057
+0.600002 1.57645
+0.700002 2.13982
+0.800002 3.31574
+0.900002 2.58689
+1 4.27355
+1.1 4.80663
+1.2 2.30474
+1.3 3.96607
+1.4 5.12638
+1.5 3.30042
+1.6 4.68024
+1.7 2.96394
+1.8 2.51616
+1.9 5.00373
+2 3.73558
+2.1 3.91566
+2.2 4.90972
+2.3 3.76789
+2.4 3.20229
+2.5 3.49668
+2.6 3.07019
+2.7 2.74581
+2.8 2.71372
+2.9 4.23862
+3 3.06991
+3.1 1.2413
+3.2 0.993522
+3.3 1.19663
+3.4 3.38714
+3.5 2.18635
+3.6 1.9788
+3.7 0.195719
+3.8 2.39559
+3.9 0.21933
+4 0.582022
+4.1 1.36335
+4.2 -0.364078
+4.3 0.433954
+4.4 -0.164352
+4.5 2.24949
+4.6 1.22433
+4.7 2.03009
+4.8 -0.227166
+4.9 1.36528
+5 1.74322
+5.1 1.32052
+5.2 0.212513
+5.3 1.71927
+5.4 0.303101
+5.5 1.7897
+5.6 0.761001
+5.7 2.09645
+5.8 3.44263
+5.9 2.56952
+6 2.61911
+6.1 2.98518
+6.2 3.46924
+6.3 3.45184
+6.4 4.19473
+6.5 4.03389
+6.6 2.96921
+6.7 3.64517
+6.8 4.82727
+6.9 6.07231
+7 4.6643
+7.1 6.2826
+7.2 5.36267
+7.3 5.26028
+7.4 4.68837
+7.5 6.16019
+7.6 5.4398
+7.7 6.789
+7.8 5.99121
+7.9 5.91701
+8 5.74157
+8.1 5.18498
+8.2 4.53273
+8.3 6.07662
+8.4 6.8382
+8.5 4.56688
+8.6 4.38186
+8.7 6.88848
+8.8 5.71756
+8.9 6.63694
+9 5.02406
+9.1 3.65386
+9.2 4.69019
+9.3 3.31415
+9.4 4.68342
+9.5 3.22574
+9.6 4.46024
+9.7 4.54648
+9.8 3.55855
+9.9 2.78286
+
+
+-10 -4.38089
+-9.99 -4.37678
+-9.98 -4.37326
+-9.97 -4.37033
+-9.96 -4.36799
+-9.95 -4.36625
+-9.94 -4.36512
+-9.93 -4.36459
+-9.92 -4.36466
+-9.91 -4.36535
+-9.9 -4.36665
+-9.89 -4.36856
+-9.88 -4.37108
+-9.87 -4.37421
+-9.86 -4.37795
+-9.85 -4.38229
+-9.84 -4.38723
+-9.83 -4.39277
+-9.82 -4.39891
+-9.81 -4.40563
+-9.8 -4.41293
+-9.79 -4.42081
+-9.77999 -4.42927
+-9.76999 -4.43828
+-9.75999 -4.44784
+-9.74999 -4.45795
+-9.73999 -4.4686
+-9.72999 -4.47976
+-9.71999 -4.49145
+-9.70999 -4.50364
+-9.69999 -4.51631
+-9.68999 -4.52947
+-9.67999 -4.5431
+-9.66999 -4.55718
+-9.65999 -4.57169
+-9.64999 -4.58664
+-9.63999 -4.60199
+-9.62999 -4.61774
+-9.61999 -4.63387
+-9.60999 -4.65037
+-9.59999 -4.66721
+-9.58999 -4.68439
+-9.57999 -4.70188
+-9.56999 -4.71967
+-9.55999 -4.73774
+-9.54999 -4.75607
+-9.53999 -4.77464
+-9.52999 -4.79344
+-9.51999 -4.81244
+-9.50999 -4.83163
+-9.49999 -4.85099
+-9.48999 -4.8705
+-9.47999 -4.89014
+-9.46999 -4.90989
+-9.45999 -4.92973
+-9.44999 -4.94963
+-9.43999 -4.96959
+-9.42999 -4.98958
+-9.41999 -5.00958
+-9.40999 -5.02957
+-9.39999 -5.04953
+-9.38999 -5.06944
+-9.37999 -5.08928
+-9.36999 -5.10904
+-9.35999 -5.12868
+-9.34999 -5.1482
+-9.33998 -5.16756
+-9.32998 -5.18676
+-9.31998 -5.20577
+-9.30998 -5.22458
+-9.29998 -5.24316
+-9.28998 -5.2615
+-9.27998 -5.27958
+-9.26998 -5.29738
+-9.25998 -5.31489
+-9.24998 -5.33207
+-9.23998 -5.34893
+-9.22998 -5.36544
+-9.21998 -5.38159
+-9.20998 -5.39736
+-9.19998 -5.41273
+-9.18998 -5.42769
+-9.17998 -5.44223
+-9.16998 -5.45632
+-9.15998 -5.46997
+-9.14998 -5.48315
+-9.13998 -5.49584
+-9.12998 -5.50805
+-9.11998 -5.51976
+-9.10998 -5.53095
+-9.09998 -5.54162
+-9.08998 -5.55175
+-9.07998 -5.56133
+-9.06998 -5.57037
+-9.05998 -5.57884
+-9.04998 -5.58675
+-9.03998 -5.59408
+-9.02998 -5.60083
+-9.01998 -5.60698
+-9.00998 -5.61255
+-8.99998 -5.61752
+-8.98998 -5.62188
+-8.97998 -5.62565
+-8.96998 -5.6288
+-8.95998 -5.63135
+-8.94998 -5.63328
+-8.93998 -5.63461
+-8.92998 -5.63532
+-8.91998 -5.63542
+-8.90998 -5.63492
+-8.89997 -5.63381
+-8.88997 -5.6321
+-8.87997 -5.62978
+-8.86997 -5.62687
+-8.85997 -5.62337
+-8.84997 -5.61929
+-8.83997 -5.61463
+-8.82997 -5.60939
+-8.81997 -5.60359
+-8.80997 -5.59724
+-8.79997 -5.59034
+-8.78997 -5.5829
+-8.77997 -5.57493
+-8.76997 -5.56645
+-8.75997 -5.55746
+-8.74997 -5.54797
+-8.73997 -5.53801
+-8.72997 -5.52758
+-8.71997 -5.51669
+-8.70997 -5.50536
+-8.69997 -5.49361
+-8.68997 -5.48144
+-8.67997 -5.46889
+-8.66997 -5.45595
+-8.65997 -5.44265
+-8.64997 -5.42901
+-8.63997 -5.41505
+-8.62997 -5.40077
+-8.61997 -5.38621
+-8.60997 -5.37137
+-8.59997 -5.35628
+-8.58997 -5.34096
+-8.57997 -5.32544
+-8.56997 -5.30971
+-8.55997 -5.29382
+-8.54997 -5.27778
+-8.53997 -5.26161
+-8.52997 -5.24534
+-8.51997 -5.22898
+-8.50997 -5.21255
+-8.49997 -5.19609
+-8.48997 -5.17961
+-8.47997 -5.16313
+-8.46996 -5.14668
+-8.45996 -5.13028
+-8.44996 -5.11395
+-8.43996 -5.09771
+-8.42996 -5.0816
+-8.41996 -5.06562
+-8.40996 -5.04981
+-8.39996 -5.03418
+-8.38996 -5.01877
+-8.37996 -5.00358
+-8.36996 -4.98865
+-8.35996 -4.974
+-8.34996 -4.95964
+-8.33996 -4.94561
+-8.32996 -4.93192
+-8.31996 -4.91859
+-8.30996 -4.90566
+-8.29996 -4.89313
+-8.28996 -4.88102
+-8.27996 -4.86937
+-8.26996 -4.85819
+-8.25996 -4.8475
+-8.24996 -4.83731
+-8.23996 -4.82766
+-8.22996 -4.81855
+-8.21996 -4.81001
+-8.20996 -4.80205
+-8.19996 -4.7947
+-8.18996 -4.78796
+-8.17996 -4.78186
+-8.16996 -4.77641
+-8.15996 -4.77162
+-8.14996 -4.76752
+-8.13996 -4.76411
+-8.12996 -4.76141
+-8.11996 -4.75943
+-8.10996 -4.75819
+-8.09996 -4.75769
+-8.08996 -4.75795
+-8.07996 -4.75898
+-8.06996 -4.76079
+-8.05996 -4.76338
+-8.04996 -4.76677
+-8.03996 -4.77097
+-8.02995 -4.77597
+-8.01995 -4.7818
+-8.00995 -4.78844
+-7.99995 -4.79591
+-7.98995 -4.80422
+-7.97995 -4.81335
+-7.96995 -4.82333
+-7.95995 -4.83414
+-7.94995 -4.84579
+-7.93995 -4.85829
+-7.92995 -4.87162
+-7.91995 -4.88579
+-7.90995 -4.90079
+-7.89995 -4.91663
+-7.88995 -4.93329
+-7.87995 -4.95078
+-7.86995 -4.96909
+-7.85995 -4.9882
+-7.84995 -5.00813
+-7.83995 -5.02885
+-7.82995 -5.05035
+-7.81995 -5.07264
+-7.80995 -5.09569
+-7.79995 -5.1195
+-7.78995 -5.14406
+-7.77995 -5.16935
+-7.76995 -5.19536
+-7.75995 -5.22207
+-7.74995 -5.24947
+-7.73995 -5.27755
+-7.72995 -5.30628
+-7.71995 -5.33566
+-7.70995 -5.36566
+-7.69995 -5.39626
+-7.68995 -5.42745
+-7.67995 -5.45921
+-7.66995 -5.49151
+-7.65995 -5.52433
+-7.64995 -5.55766
+-7.63995 -5.59146
+-7.62995 -5.62573
+-7.61995 -5.66042
+-7.60995 -5.69553
+-7.59995 -5.73102
+-7.58994 -5.76687
+-7.57994 -5.80305
+-7.56994 -5.83955
+-7.55994 -5.87632
+-7.54994 -5.91335
+-7.53994 -5.9506
+-7.52994 -5.98806
+-7.51994 -6.02568
+-7.50994 -6.06345
+-7.49994 -6.10133
+-7.48994 -6.1393
+-7.47994 -6.17732
+-7.46994 -6.21536
+-7.45994 -6.2534
+-7.44994 -6.29141
+-7.43994 -6.32935
+-7.42994 -6.36719
+-7.41994 -6.40491
+-7.40994 -6.44247
+-7.39994 -6.47985
+-7.38994 -6.517
+-7.37994 -6.55391
+-7.36994 -6.59053
+-7.35994 -6.62684
+-7.34994 -6.66281
+-7.33994 -6.69841
+-7.32994 -6.7336
+-7.31994 -6.76836
+-7.30994 -6.80266
+-7.29994 -6.83646
+-7.28994 -6.86973
+-7.27994 -6.90245
+-7.26994 -6.93459
+-7.25994 -6.96611
+-7.24994 -6.99699
+-7.23994 -7.02719
+-7.22994 -7.0567
+-7.21994 -7.08548
+-7.20994 -7.11351
+-7.19994 -7.14075
+-7.18994 -7.16718
+-7.17994 -7.19278
+-7.16994 -7.21752
+-7.15993 -7.24137
+-7.14993 -7.26431
+-7.13993 -7.28632
+-7.12993 -7.30736
+-7.11993 -7.32743
+-7.10993 -7.3465
+-7.09993 -7.36453
+-7.08993 -7.38153
+-7.07993 -7.39745
+-7.06993 -7.4123
+-7.05993 -7.42603
+-7.04993 -7.43864
+-7.03993 -7.45012
+-7.02993 -7.46044
+-7.01993 -7.46958
+-7.00993 -7.47754
+-6.99993 -7.48429
+-6.98993 -7.48983
+-6.97993 -7.49414
+-6.96993 -7.49722
+-6.95993 -7.49904
+-6.94993 -7.49961
+-6.93993 -7.4989
+-6.92993 -7.49692
+-6.91993 -7.49365
+-6.90993 -7.48909
+-6.89993 -7.48324
+-6.88993 -7.47609
+-6.87993 -7.46763
+-6.86993 -7.45787
+-6.85993 -7.4468
+-6.84993 -7.43442
+-6.83993 -7.42073
+-6.82993 -7.40573
+-6.81993 -7.38943
+-6.80993 -7.37183
+-6.79993 -7.35292
+-6.78993 -7.33273
+-6.77993 -7.31125
+-6.76993 -7.28849
+-6.75993 -7.26446
+-6.74993 -7.23916
+-6.73993 -7.21261
+-6.72993 -7.18482
+-6.71992 -7.1558
+-6.70992 -7.12556
+-6.69992 -7.09411
+-6.68992 -7.06147
+-6.67992 -7.02766
+-6.66992 -6.99269
+-6.65992 -6.95657
+-6.64992 -6.91933
+-6.63992 -6.88099
+-6.62992 -6.84156
+-6.61992 -6.80106
+-6.60992 -6.75952
+-6.59992 -6.71695
+-6.58992 -6.67339
+-6.57992 -6.62885
+-6.56992 -6.58335
+-6.55992 -6.53693
+-6.54992 -6.48961
+-6.53992 -6.44141
+-6.52992 -6.39236
+-6.51992 -6.3425
+-6.50992 -6.29184
+-6.49992 -6.24041
+-6.48992 -6.18825
+-6.47992 -6.13539
+-6.46992 -6.08185
+-6.45992 -6.02767
+-6.44992 -5.97288
+-6.43992 -5.91751
+-6.42992 -5.8616
+-6.41992 -5.80517
+-6.40992 -5.74826
+-6.39992 -5.6909
+-6.38992 -5.63313
+-6.37992 -5.57498
+-6.36992 -5.51649
+-6.35992 -5.45768
+-6.34992 -5.39861
+-6.33992 -5.33929
+-6.32992 -5.27977
+-6.31992 -5.22009
+-6.30992 -5.16027
+-6.29992 -5.10035
+-6.28992 -5.04038
+-6.27991 -4.98038
+-6.26991 -4.92039
+-6.25991 -4.86045
+-6.24991 -4.80059
+-6.23991 -4.74086
+-6.22991 -4.68128
+-6.21991 -4.62189
+-6.20991 -4.56272
+-6.19991 -4.50382
+-6.18991 -4.44522
+-6.17991 -4.38695
+-6.16991 -4.32904
+-6.15991 -4.27154
+-6.14991 -4.21447
+-6.13991 -4.15787
+-6.12991 -4.10177
+-6.11991 -4.04621
+-6.10991 -3.99121
+-6.09991 -3.93682
+-6.08991 -3.88305
+-6.07991 -3.82995
+-6.06991 -3.77755
+-6.05991 -3.72587
+-6.04991 -3.67494
+-6.03991 -3.62479
+-6.02991 -3.57546
+-6.01991 -3.52697
+-6.00991 -3.47934
+-5.99991 -3.4326
+-5.98991 -3.38678
+-5.97991 -3.34191
+-5.96991 -3.298
+-5.95991 -3.25509
+-5.94991 -3.21319
+-5.93991 -3.17233
+-5.92991 -3.13253
+-5.91991 -3.09381
+-5.90991 -3.05618
+-5.89991 -3.01968
+-5.88991 -2.98431
+-5.87991 -2.95009
+-5.86991 -2.91705
+-5.85991 -2.88519
+-5.84991 -2.85453
+-5.8399 -2.82508
+-5.8299 -2.79686
+-5.8199 -2.76988
+-5.8099 -2.74415
+-5.7999 -2.71968
+-5.7899 -2.69648
+-5.7799 -2.67455
+-5.7699 -2.65391
+-5.7599 -2.63457
+-5.7499 -2.61651
+-5.7399 -2.59976
+-5.7299 -2.58431
+-5.7199 -2.57017
+-5.7099 -2.55734
+-5.6999 -2.54581
+-5.6899 -2.5356
+-5.6799 -2.52669
+-5.6699 -2.51908
+-5.6599 -2.51278
+-5.6499 -2.50778
+-5.6399 -2.50407
+-5.6299 -2.50164
+-5.6199 -2.50049
+-5.6099 -2.50062
+-5.5999 -2.50201
+-5.5899 -2.50465
+-5.5799 -2.50854
+-5.5699 -2.51365
+-5.5599 -2.51999
+-5.5499 -2.52753
+-5.5399 -2.53627
+-5.5299 -2.54618
+-5.5199 -2.55726
+-5.5099 -2.56948
+-5.4999 -2.58283
+-5.4899 -2.59729
+-5.4799 -2.61284
+-5.4699 -2.62947
+-5.4599 -2.64715
+-5.4499 -2.66586
+-5.4399 -2.68558
+-5.4299 -2.70629
+-5.4199 -2.72797
+-5.40989 -2.75059
+-5.39989 -2.77413
+-5.38989 -2.79856
+-5.37989 -2.82387
+-5.36989 -2.85001
+-5.35989 -2.87698
+-5.34989 -2.90474
+-5.33989 -2.93326
+-5.32989 -2.96252
+-5.31989 -2.99249
+-5.30989 -3.02314
+-5.29989 -3.05444
+-5.28989 -3.08636
+-5.27989 -3.11889
+-5.26989 -3.15197
+-5.25989 -3.18559
+-5.24989 -3.21972
+-5.23989 -3.25432
+-5.22989 -3.28937
+-5.21989 -3.32483
+-5.20989 -3.36067
+-5.19989 -3.39687
+-5.18989 -3.43339
+-5.17989 -3.4702
+-5.16989 -3.50728
+-5.15989 -3.54458
+-5.14989 -3.58208
+-5.13989 -3.61974
+-5.12989 -3.65755
+-5.11989 -3.69546
+-5.10989 -3.73345
+-5.09989 -3.77148
+-5.08989 -3.80953
+-5.07989 -3.84756
+-5.06989 -3.88554
+-5.05989 -3.92346
+-5.04989 -3.96127
+-5.03989 -3.99895
+-5.02989 -4.03646
+-5.01989 -4.07379
+-5.00989 -4.1109
+-4.99989 -4.14776
+-4.98989 -4.18436
+-4.97989 -4.22065
+-4.96988 -4.25662
+-4.95988 -4.29224
+-4.94988 -4.32748
+-4.93988 -4.36232
+-4.92988 -4.39674
+-4.91988 -4.4307
+-4.90988 -4.4642
+-4.89988 -4.4972
+-4.88988 -4.52968
+-4.87988 -4.56163
+-4.86988 -4.59301
+-4.85988 -4.62382
+-4.84988 -4.65403
+-4.83988 -4.68363
+-4.82988 -4.71259
+-4.81988 -4.74089
+-4.80988 -4.76853
+-4.79988 -4.79548
+-4.78988 -4.82174
+-4.77988 -4.84728
+-4.76988 -4.87209
+-4.75988 -4.89616
+-4.74988 -4.91947
+-4.73988 -4.94203
+-4.72988 -4.9638
+-4.71988 -4.9848
+-4.70988 -5.00499
+-4.69988 -5.02439
+-4.68988 -5.04298
+-4.67988 -5.06075
+-4.66988 -5.0777
+-4.65988 -5.09382
+-4.64988 -5.10912
+-4.63988 -5.12358
+-4.62988 -5.1372
+-4.61988 -5.14998
+-4.60988 -5.16192
+-4.59988 -5.17303
+-4.58988 -5.18329
+-4.57988 -5.19272
+-4.56988 -5.20131
+-4.55988 -5.20907
+-4.54988 -5.216
+-4.53988 -5.2221
+-4.52987 -5.22739
+-4.51987 -5.23187
+-4.50987 -5.23553
+-4.49987 -5.2384
+-4.48987 -5.24048
+-4.47987 -5.24178
+-4.46987 -5.24231
+-4.45987 -5.24207
+-4.44987 -5.24109
+-4.43987 -5.23936
+-4.42987 -5.23691
+-4.41987 -5.23374
+-4.40987 -5.22988
+-4.39987 -5.22533
+-4.38987 -5.2201
+-4.37987 -5.21422
+-4.36987 -5.2077
+-4.35987 -5.20056
+-4.34987 -5.19281
+-4.33987 -5.18447
+-4.32987 -5.17555
+-4.31987 -5.16609
+-4.30987 -5.15608
+-4.29987 -5.14557
+-4.28987 -5.13455
+-4.27987 -5.12306
+-4.26987 -5.11111
+-4.25987 -5.09873
+-4.24987 -5.08593
+-4.23987 -5.07273
+-4.22987 -5.05917
+-4.21987 -5.04525
+-4.20987 -5.031
+-4.19987 -5.01645
+-4.18987 -5.00161
+-4.17987 -4.98651
+-4.16987 -4.97117
+-4.15987 -4.95562
+-4.14987 -4.93987
+-4.13987 -4.92395
+-4.12987 -4.90788
+-4.11987 -4.89168
+-4.10987 -4.87538
+-4.09986 -4.859
+-4.08986 -4.84256
+-4.07986 -4.82609
+-4.06986 -4.80961
+-4.05986 -4.79314
+-4.04986 -4.7767
+-4.03986 -4.76031
+-4.02986 -4.74401
+-4.01986 -4.7278
+-4.00986 -4.71171
+-3.99986 -4.69577
+-3.98986 -4.67998
+-3.97986 -4.66439
+-3.96986 -4.64899
+-3.95986 -4.63382
+-3.94986 -4.6189
+-3.93986 -4.60424
+-3.92986 -4.58986
+-3.91986 -4.57579
+-3.90986 -4.56203
+-3.89986 -4.54861
+-3.88986 -4.53555
+-3.87986 -4.52286
+-3.86986 -4.51056
+-3.85986 -4.49866
+-3.84986 -4.48719
+-3.83986 -4.47614
+-3.82986 -4.46555
+-3.81986 -4.45542
+-3.80986 -4.44577
+-3.79986 -4.43661
+-3.78986 -4.42795
+-3.77986 -4.4198
+-3.76986 -4.41218
+-3.75986 -4.40509
+-3.74986 -4.39854
+-3.73986 -4.39255
+-3.72986 -4.38712
+-3.71986 -4.38226
+-3.70986 -4.37797
+-3.69986 -4.37427
+-3.68986 -4.37116
+-3.67986 -4.36864
+-3.66986 -4.36672
+-3.65986 -4.3654
+-3.64986 -4.36468
+-3.63986 -4.36458
+-3.62986 -4.36508
+-3.61986 -4.36619
+-3.60986 -4.36791
+-3.59986 -4.37025
+-3.58986 -4.37319
+-3.57986 -4.37674
+-3.56986 -4.3809
+-3.55986 -4.38566
+-3.54986 -4.39102
+-3.53986 -4.39697
+-3.52986 -4.40351
+-3.51986 -4.41064
+-3.50986 -4.41835
+-3.49986 -4.42662
+-3.48986 -4.43547
+-3.47986 -4.44486
+-3.46986 -4.45481
+-3.45986 -4.46529
+-3.44986 -4.4763
+-3.43986 -4.48783
+-3.42986 -4.49986
+-3.41986 -4.51239
+-3.40986 -4.5254
+-3.39986 -4.53888
+-3.38986 -4.55283
+-3.37986 -4.56721
+-3.36986 -4.58203
+-3.35986 -4.59726
+-3.34986 -4.61289
+-3.33986 -4.6289
+-3.32986 -4.64529
+-3.31986 -4.66203
+-3.30986 -4.6791
+-3.29986 -4.6965
+-3.28986 -4.7142
+-3.27986 -4.73218
+-3.26986 -4.75043
+-3.25986 -4.76893
+-3.24986 -4.78766
+-3.23986 -4.8066
+-3.22986 -4.82574
+-3.21986 -4.84505
+-3.20986 -4.86452
+-3.19986 -4.88412
+-3.18986 -4.90383
+-3.17986 -4.92365
+-3.16986 -4.94353
+-3.15986 -4.96348
+-3.14986 -4.98346
+-3.13986 -5.00346
+-3.12986 -5.02345
+-3.11986 -5.04342
+-3.10986 -5.06335
+-3.09986 -5.08322
+-3.08986 -5.103
+-3.07986 -5.12267
+-3.06986 -5.14223
+-3.05986 -5.16164
+-3.04986 -5.1809
+-3.03986 -5.19997
+-3.02986 -5.21884
+-3.01986 -5.23749
+-3.00986 -5.25591
+-2.99986 -5.27407
+-2.98986 -5.29196
+-2.97986 -5.30955
+-2.96986 -5.32684
+-2.95986 -5.3438
+-2.94986 -5.36042
+-2.93986 -5.37668
+-2.92986 -5.39256
+-2.91986 -5.40806
+-2.90986 -5.42315
+-2.89986 -5.43781
+-2.88986 -5.45205
+-2.87986 -5.46583
+-2.86986 -5.47915
+-2.85986 -5.492
+-2.84986 -5.50436
+-2.83986 -5.51622
+-2.82986 -5.52757
+-2.81986 -5.5384
+-2.80986 -5.54869
+-2.79986 -5.55845
+-2.78986 -5.56765
+-2.77986 -5.5763
+-2.76986 -5.58438
+-2.75986 -5.59189
+-2.74986 -5.59882
+-2.73986 -5.60515
+-2.72986 -5.6109
+-2.71986 -5.61606
+-2.70986 -5.62061
+-2.69986 -5.62455
+-2.68986 -5.6279
+-2.67986 -5.63063
+-2.66986 -5.63275
+-2.65986 -5.63426
+-2.64986 -5.63517
+-2.63986 -5.63546
+-2.62986 -5.63514
+-2.61986 -5.63421
+-2.60986 -5.63269
+-2.59986 -5.63056
+-2.58986 -5.62783
+-2.57986 -5.62451
+-2.56986 -5.62061
+-2.55986 -5.61612
+-2.54986 -5.61106
+-2.53986 -5.60544
+-2.52986 -5.59925
+-2.51986 -5.59252
+-2.50986 -5.58524
+-2.49986 -5.57744
+-2.48986 -5.56911
+-2.47986 -5.56028
+-2.46986 -5.55094
+-2.45986 -5.54113
+-2.44986 -5.53084
+-2.43986 -5.52009
+-2.42986 -5.50889
+-2.41986 -5.49727
+-2.40986 -5.48523
+-2.39986 -5.4728
+-2.38986 -5.45997
+-2.37986 -5.44679
+-2.36986 -5.43325
+-2.35986 -5.41938
+-2.34986 -5.4052
+-2.33986 -5.39072
+-2.32986 -5.37597
+-2.31986 -5.36096
+-2.30986 -5.34571
+-2.29986 -5.33024
+-2.28986 -5.31458
+-2.27986 -5.29874
+-2.26986 -5.28274
+-2.25986 -5.26661
+-2.24986 -5.25037
+-2.23986 -5.23403
+-2.22986 -5.21763
+-2.21986 -5.20117
+-2.20986 -5.18469
+-2.19986 -5.16821
+-2.18986 -5.15175
+-2.17986 -5.13533
+-2.16986 -5.11898
+-2.15986 -5.10271
+-2.14986 -5.08656
+-2.13986 -5.07054
+-2.12986 -5.05467
+-2.11986 -5.03899
+-2.10986 -5.0235
+-2.09986 -5.00824
+-2.08986 -4.99323
+-2.07986 -4.97849
+-2.06986 -4.96404
+-2.05986 -4.94991
+-2.04986 -4.93611
+-2.03986 -4.92267
+-2.02986 -4.90961
+-2.01986 -4.89695
+-2.00986 -4.88472
+-1.99986 -4.87292
+-1.98986 -4.86159
+-1.97986 -4.85075
+-1.96986 -4.84041
+-1.95986 -4.83059
+-1.94986 -4.82131
+-1.93986 -4.81259
+-1.92986 -4.80445
+-1.91986 -4.79691
+-1.90986 -4.78998
+-1.89986 -4.78368
+-1.88986 -4.77802
+-1.87986 -4.77303
+-1.86986 -4.76871
+-1.85986 -4.76509
+-1.84986 -4.76216
+-1.83986 -4.75996
+-1.82986 -4.75849
+-1.81986 -4.75776
+-1.80986 -4.75779
+-1.79987 -4.75858
+-1.78987 -4.76014
+-1.77987 -4.7625
+-1.76987 -4.76564
+-1.75987 -4.76958
+-1.74987 -4.77434
+-1.73987 -4.77991
+-1.72987 -4.7863
+-1.71987 -4.79351
+-1.70987 -4.80156
+-1.69987 -4.81043
+-1.68987 -4.82015
+-1.67987 -4.8307
+-1.66987 -4.84209
+-1.65987 -4.85433
+-1.64987 -4.8674
+-1.63987 -4.88131
+-1.62987 -4.89605
+-1.61987 -4.91163
+-1.60987 -4.92804
+-1.59987 -4.94527
+-1.58987 -4.96333
+-1.57987 -4.98219
+-1.56987 -5.00187
+-1.55987 -5.02234
+-1.54987 -5.0436
+-1.53987 -5.06565
+-1.52987 -5.08846
+-1.51987 -5.11204
+-1.50987 -5.13636
+-1.49987 -5.16143
+-1.48987 -5.18721
+-1.47987 -5.21371
+-1.46987 -5.2409
+-1.45987 -5.26877
+-1.44987 -5.2973
+-1.43987 -5.32648
+-1.42987 -5.35628
+-1.41987 -5.3867
+-1.40987 -5.41771
+-1.39987 -5.44929
+-1.38987 -5.48142
+-1.37987 -5.51409
+-1.36987 -5.54726
+-1.35987 -5.58092
+-1.34987 -5.61504
+-1.33987 -5.6496
+-1.32987 -5.68458
+-1.31987 -5.71996
+-1.30987 -5.7557
+-1.29987 -5.79178
+-1.28987 -5.82818
+-1.27987 -5.86487
+-1.26987 -5.90182
+-1.25987 -5.93901
+-1.24987 -5.9764
+-1.23987 -6.01397
+-1.22987 -6.0517
+-1.21987 -6.08955
+-1.20987 -6.12749
+-1.19987 -6.16549
+-1.18987 -6.20353
+-1.17987 -6.24158
+-1.16987 -6.2796
+-1.15987 -6.31756
+-1.14987 -6.35544
+-1.13987 -6.3932
+-1.12987 -6.43081
+-1.11987 -6.46824
+-1.10987 -6.50547
+-1.09987 -6.54245
+-1.08987 -6.57917
+-1.07987 -6.61558
+-1.06987 -6.65166
+-1.05987 -6.68738
+-1.04987 -6.7227
+-1.03987 -6.75759
+-1.02987 -6.79204
+-1.01987 -6.82599
+-1.00987 -6.85943
+-0.999866 -6.89233
+-0.989866 -6.92465
+-0.979866 -6.95636
+-0.969866 -6.98744
+-0.959866 -7.01786
+-0.949866 -7.04759
+-0.939866 -7.0766
+-0.929866 -7.10486
+-0.919866 -7.13235
+-0.909866 -7.15903
+-0.899866 -7.1849
+-0.889866 -7.2099
+-0.879866 -7.23403
+-0.869866 -7.25726
+-0.859866 -7.27956
+-0.849866 -7.30091
+-0.839866 -7.32128
+-0.829866 -7.34066
+-0.819866 -7.35902
+-0.809866 -7.37634
+-0.799866 -7.3926
+-0.789866 -7.40778
+-0.779866 -7.42187
+-0.769866 -7.43483
+-0.759866 -7.44666
+-0.749866 -7.45734
+-0.739866 -7.46685
+-0.729866 -7.47518
+-0.719866 -7.48231
+-0.709866 -7.48823
+-0.699866 -7.49293
+-0.689866 -7.49639
+-0.679866 -7.49861
+-0.669866 -7.49957
+-0.659866 -7.49926
+-0.649866 -7.49767
+-0.639866 -7.49481
+-0.629866 -7.49066
+-0.619866 -7.48521
+-0.609866 -7.47846
+-0.599866 -7.47041
+-0.589866 -7.46106
+-0.579866 -7.45039
+-0.569866 -7.43842
+-0.559866 -7.42514
+-0.549866 -7.41056
+-0.539866 -7.39466
+-0.529866 -7.37747
+-0.519866 -7.35897
+-0.509866 -7.33918
+-0.499866 -7.3181
+-0.489866 -7.29574
+-0.479866 -7.2721
+-0.469866 -7.2472
+-0.459866 -7.22105
+-0.449866 -7.19364
+-0.439866 -7.165
+-0.429866 -7.13514
+-0.419866 -7.10407
+-0.409866 -7.07181
+-0.399866 -7.03836
+-0.389866 -7.00375
+-0.379866 -6.96799
+-0.369866 -6.9311
+-0.359866 -6.8931
+-0.349866 -6.85401
+-0.339866 -6.81384
+-0.329866 -6.77263
+-0.319866 -6.73038
+-0.309866 -6.68713
+-0.299866 -6.64289
+-0.289866 -6.5977
+-0.279866 -6.55156
+-0.269866 -6.50452
+-0.259866 -6.45659
+-0.249866 -6.40781
+-0.239866 -6.3582
+-0.229866 -6.30778
+-0.219866 -6.2566
+-0.209866 -6.20467
+-0.199866 -6.15202
+-0.189866 -6.09869
+-0.179866 -6.04471
+-0.169866 -5.99011
+-0.159866 -5.93492
+-0.149866 -5.87918
+-0.139866 -5.8229
+-0.129866 -5.76614
+-0.119866 -5.70892
+-0.109866 -5.65128
+-0.0998664 -5.59325
+-0.0898664 -5.53486
+-0.0798664 -5.47615
+-0.0698664 -5.41716
+-0.0598664 -5.35791
+-0.0498664 -5.29846
+-0.0398664 -5.23882
+-0.0298664 -5.17904
+-0.0198664 -5.11915
+-0.00986641 -5.05919
+0.000133585 -4.9992
+0.0101336 -4.9392
+0.0201336 -4.87925
+0.0301336 -4.81936
+0.0401336 -4.75959
+0.0501336 -4.69995
+0.0601336 -4.6405
+0.0701336 -4.58126
+0.0801336 -4.52228
+0.0901336 -4.46358
+0.100134 -4.4052
+0.110134 -4.34718
+0.120134 -4.28954
+0.130134 -4.23234
+0.140134 -4.17559
+0.150134 -4.11933
+0.160134 -4.06359
+0.170134 -4.00842
+0.180134 -3.95384
+0.190134 -3.89987
+0.200134 -3.84656
+0.210134 -3.79394
+0.220134 -3.74203
+0.230134 -3.69086
+0.240134 -3.64047
+0.250134 -3.59087
+0.260134 -3.54211
+0.270134 -3.49421
+0.280134 -3.44719
+0.290134 -3.40108
+0.300134 -3.35591
+0.310134 -3.3117
+0.320134 -3.26848
+0.330134 -3.22626
+0.340134 -3.18507
+0.350134 -3.14493
+0.360134 -3.10587
+0.370134 -3.0679
+0.380134 -3.03104
+0.390134 -2.99531
+0.400133 -2.96073
+0.410133 -2.92732
+0.420133 -2.89508
+0.430133 -2.86405
+0.440133 -2.83422
+0.450133 -2.80561
+0.460133 -2.77824
+0.470133 -2.75212
+0.480133 -2.72725
+0.490133 -2.70365
+0.500133 -2.68132
+0.510133 -2.66027
+0.520133 -2.64052
+0.530133 -2.62206
+0.540133 -2.6049
+0.550133 -2.58904
+0.560133 -2.57448
+0.570133 -2.56124
+0.580133 -2.5493
+0.590133 -2.53868
+0.600133 -2.52936
+0.610133 -2.52134
+0.620133 -2.51463
+0.630133 -2.50922
+0.640133 -2.5051
+0.650133 -2.50227
+0.660133 -2.50072
+0.670133 -2.50044
+0.680133 -2.50144
+0.690133 -2.50368
+0.700133 -2.50718
+0.710133 -2.51191
+0.720133 -2.51786
+0.730133 -2.52502
+0.740133 -2.53338
+0.750133 -2.54293
+0.760133 -2.55364
+0.770133 -2.5655
+0.780133 -2.57849
+0.790133 -2.59261
+0.800133 -2.60782
+0.810133 -2.62411
+0.820133 -2.64145
+0.830133 -2.65984
+0.840133 -2.67925
+0.850133 -2.69965
+0.860133 -2.72102
+0.870133 -2.74335
+0.880133 -2.7666
+0.890133 -2.79075
+0.900133 -2.81578
+0.910133 -2.84167
+0.920133 -2.86838
+0.930133 -2.89589
+0.940133 -2.92417
+0.950133 -2.9532
+0.960133 -2.98294
+0.970133 -3.01338
+0.980133 -3.04448
+0.990133 -3.07621
+1.00013 -3.10855
+1.01013 -3.14145
+1.02013 -3.17491
+1.03013 -3.20888
+1.04013 -3.24333
+1.05013 -3.27824
+1.06013 -3.31357
+1.07013 -3.3493
+1.08013 -3.38539
+1.09013 -3.42181
+1.10013 -3.45853
+1.11013 -3.49552
+1.12013 -3.53275
+1.13013 -3.57019
+1.14013 -3.60781
+1.15013 -3.64557
+1.16013 -3.68345
+1.17013 -3.72142
+1.18013 -3.75944
+1.19013 -3.79748
+1.20013 -3.83552
+1.21013 -3.87353
+1.22013 -3.91147
+1.23013 -3.94931
+1.24013 -3.98703
+1.25013 -4.0246
+1.26013 -4.06199
+1.27013 -4.09917
+1.28013 -4.13612
+1.29013 -4.1728
+1.30013 -4.20919
+1.31013 -4.24526
+1.32013 -4.28099
+1.33013 -4.31636
+1.34013 -4.35133
+1.35013 -4.38588
+1.36013 -4.41999
+1.37013 -4.45363
+1.38013 -4.48679
+1.39013 -4.51944
+1.40013 -4.55156
+1.41013 -4.58313
+1.42013 -4.61412
+1.43013 -4.64452
+1.44013 -4.67431
+1.45013 -4.70347
+1.46013 -4.73199
+1.47013 -4.75984
+1.48013 -4.78701
+1.49013 -4.81349
+1.50013 -4.83925
+1.51013 -4.86429
+1.52013 -4.8886
+1.53013 -4.91216
+1.54013 -4.93495
+1.55013 -4.95698
+1.56013 -4.97822
+1.57013 -4.99867
+1.58013 -5.01832
+1.59013 -5.03717
+1.60013 -5.0552
+1.61013 -5.07241
+1.62013 -5.0888
+1.63013 -5.10435
+1.64013 -5.11907
+1.65013 -5.13296
+1.66013 -5.14601
+1.67013 -5.15822
+1.68013 -5.16959
+1.69013 -5.18012
+1.70013 -5.18981
+1.71013 -5.19867
+1.72013 -5.20669
+1.73013 -5.21389
+1.74013 -5.22025
+1.75013 -5.2258
+1.76013 -5.23053
+1.77013 -5.23446
+1.78013 -5.23758
+1.79013 -5.23991
+1.80013 -5.24145
+1.81013 -5.24222
+1.82013 -5.24223
+1.83013 -5.24148
+1.84013 -5.23999
+1.85013 -5.23777
+1.86013 -5.23483
+1.87013 -5.23118
+1.88013 -5.22685
+1.89013 -5.22184
+1.90013 -5.21616
+1.91013 -5.20985
+1.92013 -5.2029
+1.93013 -5.19534
+1.94013 -5.18718
+1.95013 -5.17845
+1.96013 -5.16916
+1.97013 -5.15932
+1.98013 -5.14897
+1.99013 -5.13811
+2.00013 -5.12677
+2.01013 -5.11496
+2.02013 -5.10272
+2.03013 -5.09005
+2.04013 -5.07698
+2.05013 -5.06353
+2.06013 -5.04972
+2.07013 -5.03558
+2.08013 -5.02112
+2.09013 -5.00637
+2.10013 -4.99135
+2.11013 -4.97609
+2.12013 -4.9606
+2.13013 -4.94491
+2.14013 -4.92904
+2.15013 -4.91301
+2.16013 -4.89685
+2.17013 -4.88059
+2.18013 -4.86423
+2.19013 -4.84781
+2.20013 -4.83135
+2.21013 -4.81487
+2.22013 -4.79839
+2.23013 -4.78194
+2.24013 -4.76553
+2.25013 -4.7492
+2.26013 -4.73296
+2.27013 -4.71683
+2.28013 -4.70084
+2.29013 -4.685
+2.30013 -4.66934
+2.31013 -4.65388
+2.32013 -4.63864
+2.33013 -4.62363
+2.34013 -4.60889
+2.35013 -4.59442
+2.36013 -4.58024
+2.37013 -4.56638
+2.38013 -4.55286
+2.39013 -4.53968
+2.40013 -4.52687
+2.41013 -4.51444
+2.42013 -4.50241
+2.43013 -4.4908
+2.44013 -4.47962
+2.45013 -4.46888
+2.46013 -4.45861
+2.47013 -4.4488
+2.48013 -4.43948
+2.49013 -4.43066
+2.50013 -4.42235
+2.51013 -4.41455
+2.52013 -4.40729
+2.53013 -4.40057
+2.54013 -4.3944
+2.55013 -4.38879
+2.56013 -4.38375
+2.57013 -4.37928
+2.58013 -4.37539
+2.59013 -4.37209
+2.60013 -4.36938
+2.61013 -4.36727
+2.62013 -4.36575
+2.63013 -4.36484
+2.64013 -4.36454
+2.65013 -4.36485
+2.66013 -4.36577
+2.67013 -4.3673
+2.68013 -4.36944
+2.69013 -4.37219
+2.70013 -4.37554
+2.71013 -4.37951
+2.72013 -4.38407
+2.73013 -4.38924
+2.74013 -4.39501
+2.75013 -4.40136
+2.76013 -4.4083
+2.77013 -4.41583
+2.78013 -4.42392
+2.79013 -4.43258
+2.80013 -4.4418
+2.81013 -4.45157
+2.82013 -4.46189
+2.83013 -4.47273
+2.84013 -4.48409
+2.85013 -4.49597
+2.86013 -4.50834
+2.87013 -4.5212
+2.88013 -4.53453
+2.89013 -4.54833
+2.90013 -4.56257
+2.91013 -4.57725
+2.92013 -4.59235
+2.93013 -4.60786
+2.94013 -4.62375
+2.95013 -4.64002
+2.96013 -4.65665
+2.97013 -4.67362
+2.98013 -4.69092
+2.99013 -4.70852
+3.00013 -4.72641
+3.01013 -4.74458
+3.02013 -4.763
+3.03013 -4.78166
+3.04013 -4.80054
+3.05013 -4.81962
+3.06013 -4.83887
+3.07013 -4.85829
+3.08013 -4.87785
+3.09013 -4.89753
+3.10013 -4.91731
+3.11013 -4.93718
+3.12013 -4.95711
+3.13013 -4.97708
+3.14013 -4.99708
+3.15013 -5.01707
+3.16013 -5.03706
+3.17013 -5.057
+3.18013 -5.07689
+3.19013 -5.0967
+3.20013 -5.11641
+3.21013 -5.13601
+3.22013 -5.15547
+3.23013 -5.17477
+3.24013 -5.1939
+3.25013 -5.21284
+3.26013 -5.23157
+3.27013 -5.25006
+3.28013 -5.2683
+3.29013 -5.28628
+3.30013 -5.30397
+3.31013 -5.32136
+3.32013 -5.33842
+3.33013 -5.35515
+3.34013 -5.37153
+3.35013 -5.38754
+3.36013 -5.40316
+3.37013 -5.41838
+3.38013 -5.43318
+3.39013 -5.44755
+3.40013 -5.46148
+3.41013 -5.47495
+3.42013 -5.48795
+3.43013 -5.50047
+3.44013 -5.51249
+3.45013 -5.524
+3.46013 -5.535
+3.47013 -5.54547
+3.48013 -5.5554
+3.49013 -5.56478
+3.50013 -5.5736
+3.51013 -5.58187
+3.52013 -5.58956
+3.53013 -5.59667
+3.54013 -5.6032
+3.55013 -5.60913
+3.56013 -5.61448
+3.57013 -5.61922
+3.58013 -5.62336
+3.59013 -5.6269
+3.60013 -5.62982
+3.61013 -5.63214
+3.62013 -5.63385
+3.63013 -5.63494
+3.64013 -5.63543
+3.65013 -5.63531
+3.66013 -5.63458
+3.67013 -5.63324
+3.68013 -5.6313
+3.69013 -5.62877
+3.70013 -5.62564
+3.71013 -5.62192
+3.72013 -5.61762
+3.73013 -5.61274
+3.74013 -5.60729
+3.75013 -5.60129
+3.76013 -5.59473
+3.77013 -5.58762
+3.78013 -5.57999
+3.79013 -5.57182
+3.80013 -5.56315
+3.81013 -5.55398
+3.82013 -5.54431
+3.83013 -5.53417
+3.84013 -5.52357
+3.85013 -5.51251
+3.86013 -5.50103
+3.87013 -5.48912
+3.88013 -5.47681
+3.89013 -5.46411
+3.90013 -5.45103
+3.91013 -5.43761
+3.92013 -5.42384
+3.93013 -5.40976
+3.94013 -5.39537
+3.95013 -5.38071
+3.96013 -5.36578
+3.97013 -5.3506
+3.98013 -5.3352
+3.99013 -5.3196
+4.00013 -5.30381
+4.01013 -5.28786
+4.02013 -5.27177
+4.03013 -5.25556
+4.04013 -5.23925
+4.05013 -5.22286
+4.06013 -5.20642
+4.07013 -5.18995
+4.08013 -5.17347
+4.09013 -5.157
+4.10013 -5.14056
+4.11013 -5.12418
+4.12013 -5.10789
+4.13013 -5.09169
+4.14013 -5.07563
+4.15013 -5.05971
+4.16013 -5.04396
+4.17013 -5.02841
+4.18013 -5.01308
+4.19013 -4.99799
+4.20013 -4.98316
+4.21013 -4.96861
+4.22014 -4.95437
+4.23014 -4.94047
+4.24014 -4.92691
+4.25014 -4.91373
+4.26014 -4.90094
+4.27014 -4.88856
+4.28014 -4.87663
+4.29014 -4.86515
+4.30014 -4.85415
+4.31014 -4.84364
+4.32014 -4.83365
+4.33014 -4.8242
+4.34014 -4.8153
+4.35014 -4.80698
+4.36014 -4.79924
+4.37014 -4.79211
+4.38014 -4.78561
+4.39014 -4.77975
+4.40014 -4.77454
+4.41014 -4.77001
+4.42014 -4.76616
+4.43014 -4.76302
+4.44014 -4.76058
+4.45014 -4.75888
+4.46014 -4.75791
+4.47014 -4.7577
+4.48014 -4.75824
+4.49014 -4.75956
+4.50014 -4.76166
+4.51014 -4.76455
+4.52014 -4.76824
+4.53014 -4.77274
+4.54014 -4.77805
+4.55014 -4.78418
+4.56014 -4.79113
+4.57014 -4.79891
+4.58014 -4.80752
+4.59014 -4.81697
+4.60014 -4.82726
+4.61014 -4.83839
+4.62014 -4.85035
+4.63014 -4.86316
+4.64014 -4.8768
+4.65015 -4.89128
+4.66015 -4.9066
+4.67015 -4.92274
+4.68015 -4.93971
+4.69015 -4.95751
+4.70015 -4.97612
+4.71015 -4.99553
+4.72015 -5.01576
+4.73015 -5.03677
+4.74015 -5.05857
+4.75015 -5.08114
+4.76015 -5.10448
+4.77015 -5.12857
+4.78015 -5.1534
+4.79015 -5.17896
+4.80015 -5.20523
+4.81015 -5.2322
+4.82015 -5.25986
+4.83015 -5.28818
+4.84015 -5.31716
+4.85015 -5.34677
+4.86015 -5.37699
+4.87015 -5.40782
+4.88015 -5.43922
+4.89015 -5.47118
+4.90015 -5.50368
+4.91015 -5.53669
+4.92015 -5.5702
+4.93015 -5.60418
+4.94015 -5.63861
+4.95015 -5.67346
+4.96015 -5.70871
+4.97015 -5.74434
+4.98015 -5.78032
+4.99015 -5.81662
+5.00015 -5.85322
+5.01015 -5.89009
+5.02015 -5.92721
+5.03015 -5.96454
+5.04015 -6.00206
+5.05015 -6.03974
+5.06015 -6.07756
+5.07015 -6.11547
+5.08015 -6.15346
+5.09016 -6.19149
+5.10016 -6.22954
+5.11016 -6.26757
+5.12016 -6.30556
+5.13016 -6.34346
+5.14016 -6.38127
+5.15016 -6.41893
+5.16016 -6.45642
+5.17016 -6.49372
+5.18016 -6.53079
+5.19016 -6.56759
+5.20016 -6.6041
+5.21016 -6.64029
+5.22016 -6.67613
+5.23016 -6.71158
+5.24016 -6.74661
+5.25016 -6.7812
+5.26016 -6.81531
+5.27016 -6.84892
+5.28016 -6.88199
+5.29016 -6.9145
+5.30016 -6.94641
+5.31016 -6.97769
+5.32016 -7.00832
+5.33016 -7.03827
+5.34016 -7.06751
+5.35016 -7.09601
+5.36016 -7.12375
+5.37016 -7.1507
+5.38016 -7.17682
+5.39016 -7.2021
+5.40016 -7.22651
+5.41016 -7.25003
+5.42016 -7.27262
+5.43016 -7.29427
+5.44016 -7.31496
+5.45016 -7.33466
+5.46016 -7.35334
+5.47016 -7.37099
+5.48016 -7.38759
+5.49016 -7.40311
+5.50016 -7.41754
+5.51016 -7.43086
+5.52016 -7.44306
+5.53017 -7.4541
+5.54017 -7.46398
+5.55017 -7.47268
+5.56017 -7.4802
+5.57017 -7.4865
+5.58017 -7.49158
+5.59017 -7.49544
+5.60017 -7.49804
+5.61017 -7.4994
+5.62017 -7.49949
+5.63017 -7.49831
+5.64017 -7.49585
+5.65017 -7.49211
+5.66017 -7.48707
+5.67017 -7.48073
+5.68017 -7.47309
+5.69017 -7.46415
+5.70017 -7.4539
+5.71017 -7.44234
+5.72017 -7.42947
+5.73017 -7.41529
+5.74017 -7.39981
+5.75017 -7.38302
+5.76017 -7.36493
+5.77017 -7.34555
+5.78017 -7.32488
+5.79017 -7.30292
+5.80017 -7.27968
+5.81017 -7.25518
+5.82017 -7.22941
+5.83017 -7.2024
+5.84017 -7.17415
+5.85017 -7.14467
+5.86017 -7.11398
+5.87017 -7.08208
+5.88017 -7.04901
+5.89017 -7.01476
+5.90017 -6.97936
+5.91017 -6.94282
+5.92017 -6.90517
+5.93017 -6.86642
+5.94017 -6.82659
+5.95017 -6.7857
+5.96018 -6.74377
+5.97018 -6.70083
+5.98018 -6.6569
+5.99018 -6.612
+6.00018 -6.56616
+6.01018 -6.5194
+6.02018 -6.47175
+6.03018 -6.42323
+6.04018 -6.37387
+6.05018 -6.32371
+6.06018 -6.27276
+6.07018 -6.22106
+6.08018 -6.16863
+6.09018 -6.11552
+6.10018 -6.06174
+6.11018 -6.00733
+6.12018 -5.95231
+6.13018 -5.89674
+6.14018 -5.84063
+6.15018 -5.78401
+6.16018 -5.72693
+6.17018 -5.66942
+6.18018 -5.6115
+6.19018 -5.55322
+6.20018 -5.49461
+6.21018 -5.4357
+6.22018 -5.37653
+6.23018 -5.31713
+6.24018 -5.25755
+6.25018 -5.19781
+6.26018 -5.13795
+6.27018 -5.07801
+6.28018 -5.01802
+6.29018 -4.95802
+6.30018 -4.89804
+6.31018 -4.83813
+6.32018 -4.77832
+6.33018 -4.71863
+6.34018 -4.65912
+6.35018 -4.59981
+6.36018 -4.54074
+6.37018 -4.48194
+6.38018 -4.42346
+6.39018 -4.36532
+6.40019 -4.30756
+6.41019 -4.25021
+6.42019 -4.19332
+6.43019 -4.1369
+6.44019 -4.081
+6.45019 -4.02564
+6.46019 -3.97087
+6.47019 -3.91671
+6.48019 -3.86319
+6.49019 -3.81034
+6.50019 -3.7582
+6.51019 -3.7068
+6.52019 -3.65616
+6.53019 -3.60631
+6.54019 -3.55729
+6.55019 -3.50911
+6.56019 -3.46181
+6.57019 -3.41542
+6.58019 -3.36995
+6.59019 -3.32543
+6.60019 -3.28189
+6.61019 -3.23936
+6.62019 -3.19784
+6.63019 -3.15737
+6.64019 -3.11797
+6.65019 -3.07966
+6.66019 -3.04245
+6.67019 -3.00636
+6.68019 -2.97142
+6.69019 -2.93764
+6.70019 -2.90503
+6.71019 -2.87362
+6.72019 -2.84341
+6.73019 -2.81442
+6.74019 -2.78666
+6.75019 -2.76015
+6.76019 -2.73488
+6.77019 -2.71089
+6.78019 -2.68816
+6.79019 -2.66671
+6.80019 -2.64655
+6.81019 -2.62769
+6.82019 -2.61012
+6.83019 -2.59385
+6.8402 -2.57889
+6.8502 -2.56524
+6.8602 -2.55289
+6.8702 -2.54185
+6.8802 -2.53213
+6.8902 -2.5237
+6.9002 -2.51658
+6.9102 -2.51077
+6.9202 -2.50624
+6.9302 -2.50301
+6.9402 -2.50106
+6.9502 -2.50039
+6.9602 -2.50099
+6.9702 -2.50285
+6.9802 -2.50595
+6.9902 -2.5103
+7.0002 -2.51587
+7.0102 -2.52266
+7.0202 -2.53065
+7.0302 -2.53983
+7.0402 -2.55017
+7.0502 -2.56168
+7.0602 -2.57432
+7.0702 -2.58809
+7.0802 -2.60296
+7.0902 -2.61891
+7.1002 -2.63593
+7.1102 -2.654
+7.1202 -2.67309
+7.1302 -2.69319
+7.1402 -2.71426
+7.1502 -2.73629
+7.1602 -2.75926
+7.1702 -2.78313
+7.1802 -2.80789
+7.1902 -2.83352
+7.2002 -2.85997
+7.2102 -2.88723
+7.2202 -2.91528
+7.2302 -2.94408
+7.2402 -2.97361
+7.2502 -3.00383
+7.2602 -3.03473
+7.27021 -3.06627
+7.28021 -3.09842
+7.29021 -3.13115
+7.30021 -3.16444
+7.31021 -3.19825
+7.32021 -3.23256
+7.33021 -3.26733
+7.34021 -3.30254
+7.35021 -3.33814
+7.36021 -3.37413
+7.37021 -3.41045
+7.38021 -3.44708
+7.39021 -3.48399
+7.40021 -3.52115
+7.41021 -3.55853
+7.42021 -3.5961
+7.43021 -3.63382
+7.44021 -3.67167
+7.45021 -3.70961
+7.46021 -3.74762
+7.47021 -3.78566
+7.48021 -3.8237
+7.49021 -3.86172
+7.50021 -3.89968
+7.51021 -3.93756
+7.52021 -3.97533
+7.53021 -4.01295
+7.54021 -4.0504
+7.55021 -4.08765
+7.56021 -4.12467
+7.57021 -4.16143
+7.58021 -4.19792
+7.59021 -4.23409
+7.60021 -4.26994
+7.61021 -4.30542
+7.62021 -4.34051
+7.63021 -4.3752
+7.64021 -4.40945
+7.65021 -4.44324
+7.66021 -4.47655
+7.67021 -4.50937
+7.68021 -4.54165
+7.69021 -4.57339
+7.70021 -4.60456
+7.71022 -4.63515
+7.72022 -4.66514
+7.73022 -4.69449
+7.74022 -4.72321
+7.75022 -4.75127
+7.76022 -4.77866
+7.77022 -4.80535
+7.78022 -4.83134
+7.79022 -4.85661
+7.80022 -4.88114
+7.81022 -4.90493
+7.82022 -4.92797
+7.83022 -4.95023
+7.84022 -4.97172
+7.85022 -4.99242
+7.86022 -5.01232
+7.87022 -5.03141
+7.88022 -5.0497
+7.89022 -5.06716
+7.90022 -5.08381
+7.91022 -5.09962
+7.92022 -5.1146
+7.93022 -5.12875
+7.94022 -5.14206
+7.95022 -5.15453
+7.96022 -5.16616
+7.97022 -5.17695
+7.98022 -5.1869
+7.99022 -5.19602
+8.00022 -5.2043
+8.01022 -5.21175
+8.02022 -5.21837
+8.03022 -5.22417
+8.04022 -5.22915
+8.05022 -5.23333
+8.06022 -5.2367
+8.07022 -5.23927
+8.08022 -5.24106
+8.09022 -5.24207
+8.10022 -5.24231
+8.11022 -5.24179
+8.12022 -5.24053
+8.13022 -5.23853
+8.14022 -5.23581
+8.15022 -5.23238
+8.16022 -5.22826
+8.17023 -5.22346
+8.18023 -5.21799
+8.19023 -5.21187
+8.20023 -5.20511
+8.21023 -5.19774
+8.22023 -5.18977
+8.23023 -5.18121
+8.24023 -5.17209
+8.25023 -5.16242
+8.26023 -5.15222
+8.27023 -5.14152
+8.28023 -5.13032
+8.29023 -5.11866
+8.30023 -5.10654
+8.31023 -5.094
+8.32023 -5.08105
+8.33023 -5.06772
+8.34023 -5.05402
+8.35023 -5.03998
+8.36023 -5.02562
+8.37023 -5.01095
+8.38023 -4.99602
+8.39023 -4.98082
+8.40023 -4.9654
+8.41023 -4.94977
+8.42023 -4.93395
+8.43023 -4.91797
+8.44023 -4.90185
+8.45023 -4.88562
+8.46023 -4.86928
+8.47023 -4.85288
+8.48023 -4.83643
+8.49023 -4.81995
+8.50023 -4.80347
+8.51023 -4.78701
+8.52023 -4.77058
+8.53023 -4.75423
+8.54023 -4.73795
+8.55023 -4.72179
+8.56023 -4.70575
+8.57023 -4.68986
+8.58023 -4.67415
+8.59023 -4.65862
+8.60023 -4.64331
+8.61024 -4.62823
+8.62024 -4.6134
+8.63024 -4.59884
+8.64024 -4.58458
+8.65024 -4.57062
+8.66024 -4.55699
+8.67024 -4.5437
+8.68024 -4.53077
+8.69024 -4.51823
+8.70024 -4.50607
+8.71024 -4.49433
+8.72024 -4.48302
+8.73024 -4.47214
+8.74024 -4.46172
+8.75024 -4.45177
+8.76024 -4.4423
+8.77024 -4.43332
+8.78024 -4.42485
+8.79024 -4.4169
+8.80024 -4.40947
+8.81024 -4.40258
+8.82024 -4.39624
+8.83024 -4.39046
+8.84024 -4.38524
+8.85024 -4.38059
+8.86024 -4.37652
+8.87024 -4.37304
+8.88024 -4.37015
+8.89024 -4.36785
+8.90024 -4.36615
+8.91024 -4.36506
+8.92024 -4.36457
+8.93024 -4.36469
+8.94024 -4.36542
+8.95024 -4.36676
+8.96024 -4.36871
+8.97024 -4.37128
+8.98024 -4.37445
+8.99024 -4.37822
+9.00024 -4.38261
+9.01024 -4.38759
+9.02024 -4.39317
+9.03024 -4.39935
+9.04025 -4.40611
+9.05025 -4.41345
+9.06025 -4.42138
+9.07025 -4.42986
+9.08025 -4.43891
+9.09025 -4.44852
+9.10025 -4.45866
+9.11025 -4.46934
+9.12025 -4.48055
+9.13025 -4.49227
+9.14025 -4.50449
+9.15025 -4.5172
+9.16025 -4.53039
+9.17025 -4.54405
+9.18025 -4.55816
+9.19025 -4.5727
+9.20025 -4.58768
+9.21025 -4.60306
+9.22025 -4.61884
+9.23025 -4.63499
+9.24025 -4.65151
+9.25025 -4.66838
+9.26025 -4.68558
+9.27025 -4.70309
+9.28025 -4.7209
+9.29025 -4.73898
+9.30025 -4.75733
+9.31025 -4.77592
+9.32025 -4.79473
+9.33025 -4.81375
+9.34025 -4.83295
+9.35025 -4.85232
+9.36025 -4.87184
+9.37025 -4.89149
+9.38025 -4.91124
+9.39025 -4.93109
+9.40025 -4.951
+9.41025 -4.97096
+9.42025 -4.99095
+9.43025 -5.01095
+9.44025 -5.03094
+9.45025 -5.0509
+9.46025 -5.0708
+9.47025 -5.09064
+9.48026 -5.11039
+9.49026 -5.13002
+9.50026 -5.14953
+9.51026 -5.16888
+9.52026 -5.18807
+9.53026 -5.20707
+9.54026 -5.22586
+9.55026 -5.24443
+9.56026 -5.26275
+9.57026 -5.28081
+9.58026 -5.29859
+9.59026 -5.31607
+9.60026 -5.33324
+9.61026 -5.35007
+9.62026 -5.36656
+9.63026 -5.38268
+9.64026 -5.39842
+9.65026 -5.41377
+9.66026 -5.4287
+9.67026 -5.44321
+9.68026 -5.45727
+9.69026 -5.47088
+9.70026 -5.48403
+9.71026 -5.4967
+9.72026 -5.50887
+9.73026 -5.52054
+9.74026 -5.5317
+9.75026 -5.54233
+9.76026 -5.55242
+9.77026 -5.56197
+9.78026 -5.57097
+9.79026 -5.5794
+9.80026 -5.58727
+9.81026 -5.59456
+9.82026 -5.60127
+9.83026 -5.60738
+9.84026 -5.61291
+9.85026 -5.61784
+9.86026 -5.62216
+9.87026 -5.62588
+9.88026 -5.62899
+9.89026 -5.6315
+9.90026 -5.63339
+9.91026 -5.63467
+9.92027 -5.63535
+9.93027 -5.63541
+9.94027 -5.63486
+9.95027 -5.63371
+9.96027 -5.63196
+9.97027 -5.6296
+9.98027 -5.62665
+9.99027 -5.62311
+
+
diff --git a/src/Tizen.NUI.PenWave/res/fonts/font.ttf b/src/Tizen.NUI.PenWave/res/fonts/font.ttf
new file mode 100644
index 00000000000..b173da27417
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/fonts/font.ttf differ
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_grid.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_grid.svg
new file mode 100644
index 00000000000..470337d6e3f
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_grid.svg
@@ -0,0 +1,111 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_insert.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_insert.svg
new file mode 100644
index 00000000000..74d7b5b5114
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_insert.svg
@@ -0,0 +1,90 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_layers.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_layers.svg
new file mode 100644
index 00000000000..7a14a487e2e
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_layers.svg
@@ -0,0 +1,113 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_more.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_more.svg
new file mode 100644
index 00000000000..3a2fa621fae
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_more.svg
@@ -0,0 +1,93 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_redo.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_redo.svg
new file mode 100644
index 00000000000..9c11a1d1b49
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_redo.svg
@@ -0,0 +1,90 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_rulers.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_rulers.svg
new file mode 100644
index 00000000000..6a166c9a48d
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_rulers.svg
@@ -0,0 +1,111 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_select.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_select.svg
new file mode 100644
index 00000000000..c8a08a35a98
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_select.svg
@@ -0,0 +1,79 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_session.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_session.svg
new file mode 100644
index 00000000000..93f3e49f78e
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_session.svg
@@ -0,0 +1,113 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_template.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_template.svg
new file mode 100644
index 00000000000..8f2b1320c0a
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_template.svg
@@ -0,0 +1,116 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_undo.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_undo.svg
new file mode 100644
index 00000000000..05c71d400ff
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_undo.svg
@@ -0,0 +1,90 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_user - Copy.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_user - Copy.svg
new file mode 100644
index 00000000000..b4fea72f8d6
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_user - Copy.svg
@@ -0,0 +1,105 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/icon_user.svg b/src/Tizen.NUI.PenWave/res/images/dark/icon_user.svg
new file mode 100644
index 00000000000..b4fea72f8d6
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/dark/icon_user.svg
@@ -0,0 +1,105 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/dark/slider_handler.png b/src/Tizen.NUI.PenWave/res/images/dark/slider_handler.png
new file mode 100755
index 00000000000..8cc7da3eda8
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/dark/slider_handler.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/init_thumb.png b/src/Tizen.NUI.PenWave/res/images/init_thumb.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/init_thumb.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/canvas_popup_bg.png b/src/Tizen.NUI.PenWave/res/images/light/canvas_popup_bg.png
new file mode 100644
index 00000000000..472d708bf01
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/canvas_popup_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/canvas_thumbnail.png b/src/Tizen.NUI.PenWave/res/images/light/canvas_thumbnail.png
new file mode 100644
index 00000000000..6751a9b0cea
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/canvas_thumbnail.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/chart_popup_bg.png b/src/Tizen.NUI.PenWave/res/images/light/chart_popup_bg.png
new file mode 100644
index 00000000000..2c411aa8d74
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/chart_popup_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/checkbox.png b/src/Tizen.NUI.PenWave/res/images/light/checkbox.png
new file mode 100644
index 00000000000..9c394e68da4
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/checkbox.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/checkbox_selected.png b/src/Tizen.NUI.PenWave/res/images/light/checkbox_selected.png
new file mode 100644
index 00000000000..f3f66bfc24b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/checkbox_selected.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/color_icon_base.png b/src/Tizen.NUI.PenWave/res/images/light/color_icon_base.png
new file mode 100644
index 00000000000..bd201be5673
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/color_icon_base.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/color_icon_selected.png b/src/Tizen.NUI.PenWave/res/images/light/color_icon_selected.png
new file mode 100644
index 00000000000..971fe87c42f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/color_icon_selected.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/eraser_popup_bg.png b/src/Tizen.NUI.PenWave/res/images/light/eraser_popup_bg.png
new file mode 100644
index 00000000000..2c411aa8d74
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/eraser_popup_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/floating_icon_bg.png b/src/Tizen.NUI.PenWave/res/images/light/floating_icon_bg.png
new file mode 100644
index 00000000000..2c411aa8d74
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/floating_icon_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/grid_popup_bg.png b/src/Tizen.NUI.PenWave/res/images/light/grid_popup_bg.png
new file mode 100644
index 00000000000..2c411aa8d74
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/grid_popup_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_3d.png b/src/Tizen.NUI.PenWave/res/images/light/icon_3d.png
new file mode 100644
index 00000000000..758a762d067
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_3d.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_add.png b/src/Tizen.NUI.PenWave/res/images/light/icon_add.png
new file mode 100644
index 00000000000..9641fe02756
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_add.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_add_page.png b/src/Tizen.NUI.PenWave/res/images/light/icon_add_page.png
new file mode 100644
index 00000000000..35e0ec3a882
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_add_page.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_ai_prediction.png b/src/Tizen.NUI.PenWave/res/images/light/icon_ai_prediction.png
new file mode 100644
index 00000000000..e8b688dd1f0
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_ai_prediction.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_btn_cancel.png b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_cancel.png
new file mode 100755
index 00000000000..8ce15c3f6e8
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_cancel.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_btn_connect.png b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_connect.png
new file mode 100644
index 00000000000..517829b952c
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_connect.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_btn_ok.png b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_ok.png
new file mode 100644
index 00000000000..519cb4c835a
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_ok.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_btn_share.png b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_share.png
new file mode 100644
index 00000000000..3c7ab660d59
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_btn_share.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_chart.png b/src/Tizen.NUI.PenWave/res/images/light/icon_chart.png
new file mode 100644
index 00000000000..8f0eec0040f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_chart.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_chart_add.png b/src/Tizen.NUI.PenWave/res/images/light/icon_chart_add.png
new file mode 100644
index 00000000000..e3fe938312b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_chart_add.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_chart_mode.png b/src/Tizen.NUI.PenWave/res/images/light/icon_chart_mode.png
new file mode 100644
index 00000000000..c651df5fd17
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_chart_mode.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_circle.png b/src/Tizen.NUI.PenWave/res/images/light/icon_circle.png
new file mode 100644
index 00000000000..e1d152709dd
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_circle.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_clear.png b/src/Tizen.NUI.PenWave/res/images/light/icon_clear.png
new file mode 100644
index 00000000000..422794c44b1
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_clear.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_color_palette.png b/src/Tizen.NUI.PenWave/res/images/light/icon_color_palette.png
new file mode 100644
index 00000000000..7008968249d
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_color_palette.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_copy.png b/src/Tizen.NUI.PenWave/res/images/light/icon_copy.png
new file mode 100644
index 00000000000..19f67ad0f7f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_copy.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_cut.png b/src/Tizen.NUI.PenWave/res/images/light/icon_cut.png
new file mode 100644
index 00000000000..c8b91288fa6
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_cut.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dashed_line.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dashed_line.png
new file mode 100644
index 00000000000..59f51cb4cbf
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dashed_line.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dot-10.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-10.png
new file mode 100755
index 00000000000..b11118fcc78
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-10.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dot-25.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-25.png
new file mode 100755
index 00000000000..8bd241e8b62
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-25.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dot-50.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-50.png
new file mode 100755
index 00000000000..7925b8852dd
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-50.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dot-75.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-75.png
new file mode 100644
index 00000000000..5f978b7b835
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dot-75.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_dot.png b/src/Tizen.NUI.PenWave/res/images/light/icon_dot.png
new file mode 100755
index 00000000000..fdb9c2efeda
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_dot.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_draw_line.png b/src/Tizen.NUI.PenWave/res/images/light/icon_draw_line.png
new file mode 100644
index 00000000000..c3d6e8d8a9b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_draw_line.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_draw_stroke.png b/src/Tizen.NUI.PenWave/res/images/light/icon_draw_stroke.png
new file mode 100644
index 00000000000..81817c6f09a
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_draw_stroke.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_eraser.png b/src/Tizen.NUI.PenWave/res/images/light/icon_eraser.png
new file mode 100644
index 00000000000..43f1242b81f
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_eraser.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_full_eraser.png b/src/Tizen.NUI.PenWave/res/images/light/icon_full_eraser.png
new file mode 100755
index 00000000000..3878b1db833
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_full_eraser.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_grid.png b/src/Tizen.NUI.PenWave/res/images/light/icon_grid.png
new file mode 100644
index 00000000000..9dbac3adf31
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_grid.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_highlighter.png b/src/Tizen.NUI.PenWave/res/images/light/icon_highlighter.png
new file mode 100644
index 00000000000..d85d9cc96b3
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_highlighter.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_insert_page.png b/src/Tizen.NUI.PenWave/res/images/light/icon_insert_page.png
new file mode 100644
index 00000000000..e735571e66b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_insert_page.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_large_grid_density.png b/src/Tizen.NUI.PenWave/res/images/light/icon_large_grid_density.png
new file mode 100644
index 00000000000..7c5b931b6c5
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_large_grid_density.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_medium_grid_density.png b/src/Tizen.NUI.PenWave/res/images/light/icon_medium_grid_density.png
new file mode 100644
index 00000000000..53a8e61a833
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_medium_grid_density.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_move.png b/src/Tizen.NUI.PenWave/res/images/light/icon_move.png
new file mode 100644
index 00000000000..0e53c2d667b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_move.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_move_page.png b/src/Tizen.NUI.PenWave/res/images/light/icon_move_page.png
new file mode 100644
index 00000000000..032a9795ec3
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_move_page.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_multidrawing.png b/src/Tizen.NUI.PenWave/res/images/light/icon_multidrawing.png
new file mode 100644
index 00000000000..66014170888
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_multidrawing.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_note.png b/src/Tizen.NUI.PenWave/res/images/light/icon_note.png
new file mode 100644
index 00000000000..3b17737cc69
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_note.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_pages_menu.png b/src/Tizen.NUI.PenWave/res/images/light/icon_pages_menu.png
new file mode 100644
index 00000000000..db3afacd264
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_pages_menu.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_partial_eraser.png b/src/Tizen.NUI.PenWave/res/images/light/icon_partial_eraser.png
new file mode 100644
index 00000000000..2bbacc70ce8
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_partial_eraser.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_paste.png b/src/Tizen.NUI.PenWave/res/images/light/icon_paste.png
new file mode 100644
index 00000000000..cc94e180df0
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_paste.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_pencil.png b/src/Tizen.NUI.PenWave/res/images/light/icon_pencil.png
new file mode 100755
index 00000000000..a4c2a09cd9c
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_pencil.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_picture.png b/src/Tizen.NUI.PenWave/res/images/light/icon_picture.png
new file mode 100644
index 00000000000..8f2e04299a6
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_picture.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_rectangle.png b/src/Tizen.NUI.PenWave/res/images/light/icon_rectangle.png
new file mode 100644
index 00000000000..d22a9a2aff2
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_rectangle.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_redo.png b/src/Tizen.NUI.PenWave/res/images/light/icon_redo.png
new file mode 100644
index 00000000000..db304eef821
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_redo.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_remove.png b/src/Tizen.NUI.PenWave/res/images/light/icon_remove.png
new file mode 100755
index 00000000000..1a60a638531
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_remove.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_remove_page.png b/src/Tizen.NUI.PenWave/res/images/light/icon_remove_page.png
new file mode 100644
index 00000000000..942484c0cae
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_remove_page.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_rotate.png b/src/Tizen.NUI.PenWave/res/images/light/icon_rotate.png
new file mode 100644
index 00000000000..1d281b0700d
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_rotate.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_save.png b/src/Tizen.NUI.PenWave/res/images/light/icon_save.png
new file mode 100644
index 00000000000..e3fe938312b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_save.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_save_pdf.png b/src/Tizen.NUI.PenWave/res/images/light/icon_save_pdf.png
new file mode 100644
index 00000000000..1dc44ffa8b9
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_save_pdf.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_scale.png b/src/Tizen.NUI.PenWave/res/images/light/icon_scale.png
new file mode 100644
index 00000000000..bee41ee3e58
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_scale.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_select.png b/src/Tizen.NUI.PenWave/res/images/light/icon_select.png
new file mode 100644
index 00000000000..10442f03bb9
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_select.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_select_area.png b/src/Tizen.NUI.PenWave/res/images/light/icon_select_area.png
new file mode 100644
index 00000000000..a7331c76c05
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_select_area.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_selection.png b/src/Tizen.NUI.PenWave/res/images/light/icon_selection.png
new file mode 100755
index 00000000000..9efb0b27d7d
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_selection.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_session.png b/src/Tizen.NUI.PenWave/res/images/light/icon_session.png
new file mode 100644
index 00000000000..123e809210b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_session.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_settings.png b/src/Tizen.NUI.PenWave/res/images/light/icon_settings.png
new file mode 100644
index 00000000000..ad31fe1dd89
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_settings.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_shape.png b/src/Tizen.NUI.PenWave/res/images/light/icon_shape.png
new file mode 100644
index 00000000000..b34d68781c6
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_shape.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_share.png b/src/Tizen.NUI.PenWave/res/images/light/icon_share.png
new file mode 100755
index 00000000000..88348d14a67
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_share.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_sharp_brush.png b/src/Tizen.NUI.PenWave/res/images/light/icon_sharp_brush.png
new file mode 100644
index 00000000000..ff1d156ad90
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_sharp_brush.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_small_grid_density.png b/src/Tizen.NUI.PenWave/res/images/light/icon_small_grid_density.png
new file mode 100644
index 00000000000..5560b64e63c
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_small_grid_density.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_soft_brush.png b/src/Tizen.NUI.PenWave/res/images/light/icon_soft_brush.png
new file mode 100644
index 00000000000..081ffa53b4c
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_soft_brush.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_spray.png b/src/Tizen.NUI.PenWave/res/images/light/icon_spray.png
new file mode 100755
index 00000000000..b7b2aefae0a
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_spray.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_text.png b/src/Tizen.NUI.PenWave/res/images/light/icon_text.png
new file mode 100644
index 00000000000..b410da24bba
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_text.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_turn_left.png b/src/Tizen.NUI.PenWave/res/images/light/icon_turn_left.png
new file mode 100644
index 00000000000..5f9e351bc8e
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_turn_left.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_turn_right.png b/src/Tizen.NUI.PenWave/res/images/light/icon_turn_right.png
new file mode 100644
index 00000000000..d631776c330
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_turn_right.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_undo.png b/src/Tizen.NUI.PenWave/res/images/light/icon_undo.png
new file mode 100644
index 00000000000..373e8391437
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_undo.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_dec.png b/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_dec.png
new file mode 100644
index 00000000000..5c771573c73
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_dec.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_inc.png b/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_inc.png
new file mode 100644
index 00000000000..af126d9b1ad
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/icon_varstroke_inc.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/menu_bg.png b/src/Tizen.NUI.PenWave/res/images/light/menu_bg.png
new file mode 100644
index 00000000000..6d9962fda71
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/menu_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/session_bg.png b/src/Tizen.NUI.PenWave/res/images/light/session_bg.png
new file mode 100644
index 00000000000..f8087282ff1
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/session_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/slider_normal.png b/src/Tizen.NUI.PenWave/res/images/light/slider_normal.png
new file mode 100644
index 00000000000..9c394e68da4
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/slider_normal.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/slider_pressed.png b/src/Tizen.NUI.PenWave/res/images/light/slider_pressed.png
new file mode 100644
index 00000000000..67dea85dfbe
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/slider_pressed.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/thumb_background.png b/src/Tizen.NUI.PenWave/res/images/light/thumb_background.png
new file mode 100644
index 00000000000..d372235ed31
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/thumb_background.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/thumb_selected_background.png b/src/Tizen.NUI.PenWave/res/images/light/thumb_selected_background.png
new file mode 100644
index 00000000000..6751a9b0cea
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/thumb_selected_background.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/toolbox_bg.png b/src/Tizen.NUI.PenWave/res/images/light/toolbox_bg.png
new file mode 100644
index 00000000000..1556bb7f0b1
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/toolbox_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/warning_bg.png b/src/Tizen.NUI.PenWave/res/images/light/warning_bg.png
new file mode 100644
index 00000000000..159c4e8b090
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/warning_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/light/zoom_popup_bg.png b/src/Tizen.NUI.PenWave/res/images/light/zoom_popup_bg.png
new file mode 100644
index 00000000000..5962ee7fd0c
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/light/zoom_popup_bg.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/loading_thumb.png b/src/Tizen.NUI.PenWave/res/images/loading_thumb.png
new file mode 100644
index 00000000000..f64d7b7a557
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/loading_thumb.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/background.jpg b/src/Tizen.NUI.PenWave/res/images/pictures/background.jpg
new file mode 100644
index 00000000000..6ecbd3e053d
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/background.jpg differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/background.svg b/src/Tizen.NUI.PenWave/res/images/pictures/background.svg
new file mode 100644
index 00000000000..cbd383ec726
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/pictures/background.svg
@@ -0,0 +1,32 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/iss.png b/src/Tizen.NUI.PenWave/res/images/pictures/iss.png
new file mode 100644
index 00000000000..79740f1efa9
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/iss.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/jupiter.png b/src/Tizen.NUI.PenWave/res/images/pictures/jupiter.png
new file mode 100644
index 00000000000..3261644acb4
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/jupiter.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/mars.png b/src/Tizen.NUI.PenWave/res/images/pictures/mars.png
new file mode 100644
index 00000000000..28f3ab087ea
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/mars.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/mercury.png b/src/Tizen.NUI.PenWave/res/images/pictures/mercury.png
new file mode 100644
index 00000000000..b5acf100573
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/mercury.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/moon.png b/src/Tizen.NUI.PenWave/res/images/pictures/moon.png
new file mode 100644
index 00000000000..22ccf6efeea
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/moon.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/neptune.png b/src/Tizen.NUI.PenWave/res/images/pictures/neptune.png
new file mode 100644
index 00000000000..02b973bf2de
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/neptune.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.bmp b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.bmp
new file mode 100644
index 00000000000..21c80b64d08
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.bmp differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.jpg b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.jpg
new file mode 100644
index 00000000000..85c4ed75d97
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.jpg differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.png b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.png
new file mode 100644
index 00000000000..a2b8680f643
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.svg b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.svg
new file mode 100644
index 00000000000..a59da8d38fd
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/res/images/pictures/picture_test.svg
@@ -0,0 +1,829 @@
+
+
+
+
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/saturn.png b/src/Tizen.NUI.PenWave/res/images/pictures/saturn.png
new file mode 100644
index 00000000000..84b10766966
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/saturn.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/uranus.png b/src/Tizen.NUI.PenWave/res/images/pictures/uranus.png
new file mode 100644
index 00000000000..a2e66bfd3de
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/uranus.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/pictures/venus.png b/src/Tizen.NUI.PenWave/res/images/pictures/venus.png
new file mode 100644
index 00000000000..6c668c8fb70
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/pictures/venus.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/brush_acrylic.png b/src/Tizen.NUI.PenWave/res/images/textures/brush_acrylic.png
new file mode 100644
index 00000000000..2dcb4c088b8
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/brush_acrylic.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/brush_sponge.png b/src/Tizen.NUI.PenWave/res/images/textures/brush_sponge.png
new file mode 100644
index 00000000000..904bb9cb86b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/brush_sponge.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/dot_brush.png b/src/Tizen.NUI.PenWave/res/images/textures/dot_brush.png
new file mode 100644
index 00000000000..53596ecb1c0
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/dot_brush.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/eraser_texture.png b/src/Tizen.NUI.PenWave/res/images/textures/eraser_texture.png
new file mode 100755
index 00000000000..dd76d8125f4
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/eraser_texture.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/highlighter.png b/src/Tizen.NUI.PenWave/res/images/textures/highlighter.png
new file mode 100644
index 00000000000..5997b641f3b
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/highlighter.png differ
diff --git a/src/Tizen.NUI.PenWave/res/images/textures/soft_brush.png b/src/Tizen.NUI.PenWave/res/images/textures/soft_brush.png
new file mode 100644
index 00000000000..125d986fe0e
Binary files /dev/null and b/src/Tizen.NUI.PenWave/res/images/textures/soft_brush.png differ
diff --git a/src/Tizen.NUI.PenWave/src/Internal/Canvas/CanvasRenderer.cs b/src/Tizen.NUI.PenWave/src/Internal/Canvas/CanvasRenderer.cs
new file mode 100644
index 00000000000..03bf9a81411
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/Internal/Canvas/CanvasRenderer.cs
@@ -0,0 +1,184 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The class that provides rendering functionality for PenWave.
+ ///
+ internal class CanvasRenderer
+ {
+ // Paths to resources.
+ private static readonly string FontPath = FrameworkInformation.ResourcePath + "fonts/font.ttf";
+ private static readonly string[] TexturePaths = {
+ FrameworkInformation.ResourcePath + "images/textures/brush_acrylic.png",
+ FrameworkInformation.ResourcePath + "images/textures/brush_sponge.png",
+ FrameworkInformation.ResourcePath + "images/textures/dot_brush.png",
+ FrameworkInformation.ResourcePath + "images/textures/highlighter.png",
+ FrameworkInformation.ResourcePath + "images/textures/soft_brush.png"
+ };
+
+ // Canvas id.
+ private uint canvasId;
+ private PenWave engine;
+
+ ///
+ /// Constructor. Creates a new instance of CanvasRenderer. This constructor sets the current canvas to the specified canvas id. Also it sets paths to resources and initializes textures.
+ ///
+ ///
+ internal CanvasRenderer(uint canvasId)
+ {
+ this.canvasId = canvasId;
+ engine = PenWave.Instance;
+ engine.SetCurrentCanvas(canvasId);
+ engine.SetResourcePath(FrameworkInformation.ResourcePath + "images/");
+ engine.SetFontPath(FontPath);
+ engine.SetTexturePaths(TexturePaths, TexturePaths.Length);
+ }
+
+ ///
+ /// Initializes OpenGL context. This method must be called before any other methods that require OpenGL context.
+ ///
+ internal void InitializeGL()
+ {
+ engine.InitializeGL();
+ }
+
+ ///
+ /// Terminates OpenGL context. This method must be called after all methods that require OpenGL context are finished.
+ ///
+ internal void TerminateGL()
+ {
+ engine.TerminateGL();
+ }
+
+ ///
+ /// Renders frame using OpenGL context. This method should be called from the render thread. It returns 0 when there is no more work to do. Otherwise it returns 1.
+ ///
+ ///
+ ///
+ internal int RenderFrame(in DirectRenderingGLView.RenderCallbackInput input)
+ {
+ return engine.RenderFrameGL();
+ }
+
+ ///
+ /// Resizes the current canvas. This method should be called when the size of the window changes. It updates the size of the current canvas and renders the full redraw.
+ ///
+ ///
+ ///
+ internal void Resize(int width, int height)
+ {
+ engine.UpdateGLWindowSize(width, height);
+ engine.RenderFullyReDraw();
+ }
+
+ ///
+ /// Clears the current canvas. All strokes and pictures will be removed.
+ ///
+ internal void ClearCanvas()
+ {
+ engine.ClearCurrentCanvas();
+ }
+
+ ///
+ /// Adds picture
+ ///
+ ///
+ internal void AddPicture(string path, Size2D size, Position2D position)
+ {
+ engine.AddPicture(path, position.X, position.Y, size.Width, size.Height);
+ }
+
+ ///
+ /// Toggles the grid
+ ///
+ ///
+ internal void ToggleGrid(GridDensityType gridType)
+ {
+ engine.ToggleGrid((int)gridType);
+ }
+
+ ///
+ /// Sets the canvas background color
+ ///
+ ///
+ internal void SetCanvasColor(Color color)
+ {
+ engine.CanvasSetColor(ToHex(color), 1.0f);
+ }
+
+ ///
+ /// Saves the canvas
+ ///
+ ///
+ internal void SaveCanvas(string path)
+ {
+ engine.SaveCanvas(canvasId, path);
+ }
+
+ ///
+ /// Loads the canvas from the specified path.
+ ///
+ ///
+ internal void LoadCanvas(string path)
+ {
+ if (!File.Exists(path))
+ {
+ Tizen.Log.Error("NUI", $"Loading canvas error: {path}\n");
+ }
+ else
+ {
+ engine.LoadCanvas(canvasId, path);
+ }
+ }
+
+ ///
+ /// Takes screenshot of the current canvas and saves it to the specified path. The area of the screenshot is defined by the coordinates and dimensions. The callback is called when the screenshot is saved. The callback has one parameter which is the path to the saved image. If the path is null, then the screenshot was not saved successfully.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ internal void TakeScreenShot(string path, int x, int y, int width, int height, PenWave.ThumbnailSavedCallback callback)
+ {
+ engine.TakeScreenshot(canvasId, path, x, y, width, height, callback);
+ }
+
+ // Converts Color to hex string.
+ private string ToHex(Color color)
+ {
+ var red = (uint)(color.R * 255);
+ var green = (uint)(color.G * 255);
+ var blue = (uint)(color.B * 255);
+ return $"#{red:X2}{green:X2}{blue:X2}";
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Tizen.NUI.PenWave/src/Interop/Interop.PenWave.cs b/src/Tizen.NUI.PenWave/src/Interop/Interop.PenWave.cs
new file mode 100644
index 00000000000..4cd3801c1fb
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/Interop/Interop.PenWave.cs
@@ -0,0 +1,353 @@
+using System;
+using System.Text;
+using System.Runtime.InteropServices;
+
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using System.ComponentModel;
+using System.Net.Http.Headers;
+using System.Data;
+
+namespace Tizen.NUI.PenWave
+{
+ internal static partial class Interop
+ {
+ internal static partial class PenWave
+ {
+ private const string Lib = "libhand-drawing-engine.so";
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "InitializeGL")]
+ public static extern void InitializeGL();
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "RenderFrameGL")]
+ public static extern int RenderFrameGL();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "RenderFullyReDraw")]
+ public static extern void RenderFullyReDraw();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "TerminateGL")]
+ public static extern void TerminateGL();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "UpdateGLWindowSize")]
+ public static extern void UpdateGLWindowSize(int w, int h);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "UpdateGLWindowOrientation")]
+ public static extern void UpdateGLWindowOrientation(int angle);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "BeginShapeDraw")]
+ public static extern uint BeginShapeDraw(float x, float y, uint time = 1);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "DrawShape")]
+ public static extern int DrawShape(uint shapeID, float x, float y, uint time = 1);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EndShapeDraw")]
+ public static extern int EndShapeDraw(uint shapeID, uint time = 1);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "StopErasing")]
+ public static extern void StopErasing();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EraseShape")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool EraseShape(int x, int y, float radius, [MarshalAs(UnmanagedType.I1)] bool partial);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "AddRectanglePath")]
+ public static extern uint AddRectanglePath(float xStart, float yStart, float x, float y, bool finished);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "AddArcPath")]
+ public static extern uint AddArcPath(float xCenter, float yCenter, float radius, float x, float y, bool finished);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ResizeShapePath")]
+ public static extern int ResizeShapePath(uint shapeID, float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "FinishShapePath")]
+ public static extern int FinishShapePath(uint shapeID);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasZoomBegin")]
+ public static extern bool CanvasZoomBegin();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasZoom")]
+ public static extern bool CanvasZoom(float x, float y, float zoom, float dx, float dy);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasZoomEnd")]
+ public static extern bool CanvasZoomEnd();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasGetZoomValue")]
+ public static extern int CanvasGetZoomValue();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasSetZoomValue")]
+ public static extern void CanvasSetZoomValue(float zoomValue);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasMoveBegin")]
+ public static extern bool CanvasMoveBegin();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasMove")]
+ public static extern bool CanvasMove(int x, int y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasMoveEnd")]
+ public static extern bool CanvasMoveEnd();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasSetColor")]
+ public static extern void CanvasSetColor([MarshalAs(UnmanagedType.LPStr)] string hexColor, float a);
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanvasSetSize")]
+ public static extern void CanvasSetSize(int width, int height);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetResourcePath")]
+ public static extern void SetResourcePath([MarshalAs(UnmanagedType.LPStr)] string resourcePath);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetFontPath")]
+ public static extern void SetFontPath([MarshalAs(UnmanagedType.LPStr)] string fontPath);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetTexturePaths")]
+ public static extern void SetTexturePaths([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr)] string[] texturePaths, int textureCount);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetStrokeSize")]
+ public static extern void SetStrokeSize(float val);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetStrokeColor")]
+ public static extern void SetStrokeColor([MarshalAs(UnmanagedType.LPStr)] string hexColor, float a);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetStrokeType")]
+ public static extern void SetStrokeType(int brushId);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetBrushTexture")]
+ public static extern void SetBrushTexture(int textureId);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetBrushDistance")]
+ public static extern void SetBrushDistance(float distance);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetDashArray")]
+ public static extern void SetDashArray([MarshalAs(UnmanagedType.LPStr)] string dashArray);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetLineAngle")]
+ public static extern void SetLineAngle(float angle);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetBrushSize")]
+ public static extern float GetBrushSize();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetBrushType")]
+ public static extern int GetBrushType();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetBrushTexture")]
+ public static extern int GetBrushTexture();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetBrushDistance")]
+ public static extern float GetBrushDistance();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetLineAngle")]
+ public static extern float GetLineAngle();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetShapeCount")]
+ public static extern int GetShapeCount();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CreateCanvas")]
+ public static extern uint CreateCanvas(int canvasWidth, int canvasHeight);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CreateCanvasWithBackgroundImage")]
+ public static extern uint CreateCanvasWithBackgroundImage([MarshalAs(UnmanagedType.LPStr)] string path);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetCurrentCanvas")]
+ public static extern void SetCurrentCanvas(uint canvasID);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ClearCurrentCanvas")]
+ public static extern void ClearCurrentCanvas();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "StartSelectingArea")]
+ public static extern void StartSelectingArea(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ResizeSelectedArea")]
+ public static extern void ResizeSelectedArea(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "InsideSelectedArea")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool InsideSelectedArea(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetSelectionDimensions")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool GetSelectionDimensions(ref float x, ref float y, ref float width, ref float height);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "TouchedDrawable")]
+ public static extern int TouchedDrawable(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SelectDrawable")]
+ public static extern int SelectDrawable(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SelectDrawables")]
+ public static extern int SelectDrawables();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "DragSelectedDrawables")]
+ public static extern void DragSelectedDrawables(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EndDraging")]
+ public static extern void EndDraging();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "StartRotating")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool StartRotating(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "RotateSelected")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool RotateSelected(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EndRotating")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool EndRotating(float x, float y);
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "StartSelectionScale")]
+ public static extern void StartSelectionScale(bool anchorLeft, bool anchorRight, bool anchorTop, bool anchorBottom, ref float anchorX, ref float anchorY);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ScaleSelection")]
+ public static extern void ScaleSelection(float scaleFactorX, float scaleFactorY);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EndSelectionScale")]
+ public static extern void EndSelectionScale(float scaleFactorX, float scaleFactorY);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "DropSelectedDrawables")]
+ public static extern void DropSelectedDrawables();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SelectedAreaZoom")]
+ public static extern void SelectedAreaZoom(float x, float y, float zoom);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SaveCanvas")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SaveCanvas(uint canvasID, [MarshalAs(UnmanagedType.LPStr)] string path);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "LoadCanvas")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool LoadCanvas(uint canvasID, [MarshalAs(UnmanagedType.LPStr)] string path);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "TakeScreenshot")]
+ public static extern void TakeScreenshot(uint canvasID, [MarshalAs(UnmanagedType.LPStr)] string path, int x, int y, int width, int height, [MarshalAs(UnmanagedType.FunctionPtr)] Tizen.NUI.PenWave.PenWave.ThumbnailSavedCallback thumbSaved);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ToggleGrid")]
+ public static extern void ToggleGrid(int densityType);
+
+ //CHART
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ToggleChartGrid")]
+ public static extern void ToggleChartGrid(int densityType);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetChartGridDensity")]
+ public static extern int GetChartGridDensity();
+ //
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Dump")]
+ public static extern void Dump();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Copy")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool Copy();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Paste")]
+ public static extern int Paste(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Cut")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool Cut();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Remove")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool Remove();
+
+ //CHART
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "AddChart")]
+ public static extern void AddChart(int chartType, [MarshalAs(UnmanagedType.LPStr)] string path);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ChangeMode")]
+ public static extern void ChangeMode(int mode);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ChartPosition")]
+ public static extern void ChartPosition(ref float x, ref float y);
+ //
+
+ // PICTURE
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "PlacePicture")]
+ public static extern void AddPicture([MarshalAs(UnmanagedType.LPStr)] string path, float x, float y, float width, float height);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetCanvasBackground")]
+ public static extern void SetCanvasBackground([MarshalAs(UnmanagedType.LPStr)] string path, float x, float y, float width, float height);
+ //
+
+ // TEXT
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "AddText")]
+ public static extern void AddText([MarshalAs(UnmanagedType.LPStr)] string text, float x, float y, float size);
+ //
+ // NOTES
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "AddNote")]
+ public static extern uint AddNote(float x, float y, float w, float h);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "RemoveNote")]
+ public static extern void RemoveNote(uint noteID);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ClearNote")]
+ public static extern void ClearNote();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "DragNote")]
+ public static extern bool DragNote(float x, float y);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "EndNoteDragging")]
+ public static extern bool EndNoteDragging();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetNoteColor")]
+ public static extern void SetNoteColor([MarshalAs(UnmanagedType.LPStr)] string hexColor, float a);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetActiveNote")]
+ public static extern void SetActiveNote(uint noteID);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "TouchedNote")]
+ public static extern uint TouchedNote(float x, float y);
+ //
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Undo")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool Undo();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "Redo")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool Redo();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanUndo")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool CanUndo();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "CanRedo")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool CanRedo();
+
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ResetUndo")]
+ public static extern void ResetUndo();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ResetRedo")]
+ public static extern void ResetRedo();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetConfigurationCount")]
+ public static extern int GetConfigurationCount();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetAllConfigurations", CallingConvention = CallingConvention.Cdecl)]
+ public static extern IntPtr GetAllConfigurations();
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "GetConfiguration", CallingConvention = CallingConvention.Cdecl)]
+ public static extern IntPtr GetConfiguration([MarshalAs(UnmanagedType.LPStr)] string key);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetConfigurationInt", CallingConvention = CallingConvention.Cdecl)]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SetConfigurationInt([MarshalAs(UnmanagedType.LPStr)] string key, int value);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetConfigurationFloat", CallingConvention = CallingConvention.Cdecl)]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SetConfigurationFloat([MarshalAs(UnmanagedType.LPStr)] string key, float value);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetConfigurationString", CallingConvention = CallingConvention.Cdecl)]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SetConfigurationString([MarshalAs(UnmanagedType.LPStr)] string key, [MarshalAs(UnmanagedType.LPStr)] string value);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SetConfigurationBool", CallingConvention = CallingConvention.Cdecl)]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SetConfigurationBool([MarshalAs(UnmanagedType.LPStr)] string key, [MarshalAs(UnmanagedType.I1)] bool value);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "SaveProfiler")]
+ [return:MarshalAs(UnmanagedType.I1)]
+ public static extern bool SaveProfiler([MarshalAs(UnmanagedType.LPStr)] string path);
+
+ [global::System.Runtime.InteropServices.DllImport(Lib, EntryPoint = "ResetProfiler")]
+ public static extern void ResetProfiler();
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Canvas/PenWave.cs b/src/Tizen.NUI.PenWave/src/public/Canvas/PenWave.cs
new file mode 100644
index 00000000000..9b23f614baf
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Canvas/PenWave.cs
@@ -0,0 +1,1068 @@
+using System;
+using System.Text;
+using System.ComponentModel;
+using System.Runtime.InteropServices;
+
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using System.ComponentModel;
+using System.Net.Http.Headers;
+using System.Data;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// PenWave class provides functions to draw on the canvas.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class PenWave
+ {
+ ///
+ /// The delegate for the thumbnail saved callback.
+ ///
+ [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public delegate void ThumbnailSavedCallback();
+
+ private static readonly PenWave instance = new PenWave();
+ private PenWave() { }
+
+ ///
+ /// Gets the singleton instance of PenWave.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static PenWave Instance => instance;
+
+ ///
+ /// Initializes the PenWave library.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void InitializeGL()
+ {
+ Interop.PenWave.InitializeGL();
+ }
+
+ ///
+ /// Renders the frame using OpenGL.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int RenderFrameGL()
+ {
+ return Interop.PenWave.RenderFrameGL();
+ }
+
+ ///
+ /// Renders the fully redraw frame using OpenGL.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void RenderFullyReDraw()
+ {
+ Interop.PenWave.RenderFullyReDraw();
+ }
+
+ ///
+ /// Terminates the PenWave library.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void TerminateGL()
+ {
+ Interop.PenWave.TerminateGL();
+ }
+
+ ///
+ /// Updates the window size in OpenGL. This should be called when the window is resized.
+ ///
+ /// The width
+ /// The height
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void UpdateGLWindowSize(int w, int h)
+ {
+ Interop.PenWave.UpdateGLWindowSize(w, h);
+ }
+
+ ///
+ /// Updates the window orientation in OpenGL. This should be called when the window is rotated.
+ ///
+ /// The angle
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void UpdateGLWindowOrientation(int angle)
+ {
+ Interop.PenWave.UpdateGLWindowOrientation(angle);
+ }
+
+ ///
+ /// Start point for drawing
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// The time
+ /// unique shape id
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint BeginShapeDraw(float x, float y, uint time = 1)
+ {
+ return Interop.PenWave.BeginShapeDraw(x, y, time);
+ }
+
+ ///
+ /// Draw points on cavas
+ ///
+ /// ID of drawn shape
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// The time
+ ///
+ /// 0 No error in adding points
+ /// 1 Too many points (new shape has to be created)
+ /// 2 No canvas set
+ /// 3 No shapes in canvas
+ /// 4 Bad shapeID (not exists)
+ /// 5 Object with id=shapeID is not a shape
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int DrawShape(uint shapeID, float x, float y, uint time = 1)
+ {
+ return Interop.PenWave.DrawShape(shapeID, x, y, time);
+ }
+
+ ///
+ /// Finish shape drawing
+ ///
+ /// ID of drawn shape
+ /// The time
+ ///
+ /// 0 No error in adding points
+ /// 1 Too many points (new shape has to be created)
+ /// 2 No canvas set
+ /// 3 No shapes in canvas
+ /// 4 Bad shapeID (not exists)
+ /// 5 Object with id=shapeID is not a shape
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int EndShapeDraw(uint shapeID, uint time = 1)
+ {
+ return Interop.PenWave.EndShapeDraw(shapeID, time);
+ }
+
+ ///
+ /// Stop erasing
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void StopErasing()
+ {
+ Interop.PenWave.StopErasing();
+ }
+
+ ///
+ /// Erase selected shape
+ ///
+ /// Point X coordinated
+ /// Point Y coordinated
+ /// The radius
+ /// If true, only the touched parts of the shape are erased, otherwise the whole shape is erased.
+ /// Returns true if erasure was successful.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool EraseShape(int x, int y, float radius, bool partial)
+ {
+ return Interop.PenWave.EraseShape(x, y, radius, partial);
+ }
+
+ ///
+ /// Adding rectangle with properties of current stroke
+ ///
+ /// coordinate of upper left corner of rectangle
+ /// coordinate of upper left corner of rectangle
+ /// coordinate of bottom right corner
+ /// coordinate of bottom right corner
+ /// true if drawing of rectangle is finished, false when it is set as current shape and has to be call FinishRectanglePath at the end of drawing
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint AddRectanglePath(float xStart, float yStart, float x, float y, bool finished)
+ {
+ return Interop.PenWave.AddRectanglePath(xStart, yStart, x, y, finished);
+ }
+
+ ///
+ /// Adding arc with properties of current stroke
+ ///
+ /// coordinate of center of circle
+ /// coordinate of center of circle
+ /// radius of circle
+ /// coordinate of start point
+ /// coordinate of start point
+ /// true if drawing of rectangle is finished, false when it is set as current shape and has to be call FinishRectanglePath at the end of drawing
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint AddArcPath(float xCenter, float yCenter, float radius, float x, float y, bool finished)
+ {
+ return Interop.PenWave.AddArcPath(xCenter, yCenter, radius, x, y, finished);
+ }
+
+ ///
+ /// Resize shape on canvas (rectangle or arc)
+ ///
+ /// ID of drawn shape
+ /// Point X coordinate of changed point
+ /// Point Y coordinate of changed point
+ ///
+ /// 0 No error in adding points
+ /// 1 Too many points (new shape has to be created)
+ /// 2 No canvas set
+ /// 3 No shapes in canvas
+ /// 4 Bad shapeID (not exists)
+ /// 5 Object with id=shapeID is not a shape
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int ResizeShapePath(uint shapeID, float x, float y)
+ {
+ return Interop.PenWave.ResizeShapePath(shapeID, x, y);
+ }
+
+ ///
+ /// End drawing shape on cavas (rectangle or arc)
+ ///
+ /// ID of drawn shape
+ ///
+ /// 0 No error in adding points
+ /// 1 Too many points (new shape has to be created)
+ /// 2 No canvas set
+ /// 3 No shapes in canvas
+ /// 4 Bad shapeID (not exists)
+ /// 5 Object with id=shapeID is not a shape
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int FinishShapePath(uint shapeID)
+ {
+ return Interop.PenWave.FinishShapePath(shapeID);
+ }
+
+ ///
+ /// Zoom Canvas Begin
+ ///
+ /// false if some shape is being drawn, true otherwise
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasZoomBegin()
+ {
+ return Interop.PenWave.CanvasZoomBegin();
+ }
+
+ ///
+ /// Zoom Canvas Point
+ ///
+ /// Point X coordinated
+ /// Point Y coordinated
+ /// Zoom level
+ /// dx
+ /// dy
+ /// false if zooming wasn't started with CanvasZoomBegin, true otherwise.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasZoom(float x, float y, float zoom, float dx, float dy)
+ {
+ return Interop.PenWave.CanvasZoom(x, y, zoom, dx, dy);
+ }
+
+ ///
+ /// Zoom Canvas End
+ ///
+ /// false if zooming wasn't started with CanvasZoomBegin, true otherwise.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasZoomEnd()
+ {
+ return Interop.PenWave.CanvasZoomEnd();
+ }
+
+ ///
+ /// Gets Zoom Canvas Value
+ ///
+ /// zoom level
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int CanvasGetZoomValue()
+ {
+ return Interop.PenWave.CanvasGetZoomValue();
+ }
+
+ ///
+ /// Sets Zoom Canvas Value
+ ///
+ /// set zoom level
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void CanvasSetZoomValue(float zoomValue)
+ {
+ Interop.PenWave.CanvasSetZoomValue(zoomValue);
+ }
+
+ ///
+ /// Move Canvas Begin
+ ///
+ /// false if some shape is being drawn, true otherwise
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasMoveBegin()
+ {
+ return Interop.PenWave.CanvasMoveBegin();
+ }
+
+ ///
+ /// Move Canvas Area
+ ///
+ /// Point X coordinated
+ /// Point Y coordinated
+ /// false if moving wasn't started with CanvasMoveBegin, true otherwise.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasMove(int x, int y)
+ {
+ return Interop.PenWave.CanvasMove(x, y);
+ }
+
+ ///
+ /// Move Canvas End
+ ///
+ /// false if moving wasn't started with CanvasMoveBegin, true otherwise.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanvasMoveEnd()
+ {
+ return Interop.PenWave.CanvasMoveEnd();
+ }
+
+ ///
+ /// Set Canvas Color
+ ///
+ /// The rgb color value
+ /// The alpha value
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void CanvasSetColor(string hexColor, float a)
+ {
+ Interop.PenWave.CanvasSetColor(hexColor, a);
+ }
+
+ ///
+ /// Sets canvas size
+ ///
+ /// The width
+ /// The height
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void CanvasSetSize(int width, int height)
+ {
+ Interop.PenWave.CanvasSetSize(width, height);
+ }
+
+ ///
+ /// Sets resource path
+ ///
+ /// The resource path
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetResourcePath(string resourcePath)
+ {
+ Interop.PenWave.SetResourcePath(resourcePath);
+ }
+
+ ///
+ /// Sets font path
+ ///
+ /// The font path
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetFontPath(string fontPath)
+ {
+ Interop.PenWave.SetFontPath(fontPath);
+ }
+
+ ///
+ /// Sets the Texture Paths object
+ ///
+ /// The texture paths.
+ /// The number of textures.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetTexturePaths(string[] texturePaths, int textureCount)
+ {
+ Interop.PenWave.SetTexturePaths(texturePaths, textureCount);
+ }
+
+ ///
+ /// Sets the radius of stroke line
+ ///
+ /// Brush size
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetStrokeSize(float size)
+ {
+ Interop.PenWave.SetStrokeSize(size);
+ }
+
+ ///
+ /// Sets the stroke color
+ ///
+ /// The rgb color value
+ /// The alpha value
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetStrokeColor(string hexColor, float a)
+ {
+ Interop.PenWave.SetStrokeColor(hexColor, a);
+ }
+
+ ///
+ /// Sets the stroke type
+ ///
+ /// The brush type
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetStrokeType(int brushType)
+ {
+ Interop.PenWave.SetStrokeType(brushType);
+ }
+
+ ///
+ /// Sets the brush texture
+ ///
+ /// The brush texture
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetBrushTexture(int textureId)
+ {
+ Interop.PenWave.SetBrushTexture(textureId);
+ }
+
+ ///
+ /// Sets the distance between neighbouring textures in brush
+ ///
+ /// The brush distance
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetBrushDistance(float distance)
+ {
+ Interop.PenWave.SetBrushDistance(distance);
+ }
+
+ ///
+ /// Sets used dash array
+ ///
+ /// The dash array
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetDashArray(string dashArray)
+ {
+ Interop.PenWave.SetDashArray(dashArray);
+ }
+
+ ///
+ /// Set the line angle
+ ///
+ /// The line angle in degrees
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetLineAngle(float angle)
+ {
+ Interop.PenWave.SetLineAngle(angle);
+ }
+
+ ///
+ /// Gets Current Brush Size
+ ///
+ /// The brush Size
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public float GetBrushSize()
+ {
+ return Interop.PenWave.GetBrushSize();
+ }
+
+ ///
+ /// Gets Current Brush Type
+ ///
+ /// The brush type
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int GetBrushType()
+ {
+ return Interop.PenWave.GetBrushType();
+ }
+
+ ///
+ /// Gets Current Brush Texture
+ ///
+ /// The brush texture
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int GetBrushTexture()
+ {
+ return Interop.PenWave.GetBrushTexture();
+ }
+
+ ///
+ /// Gets the distance between neighbouring textures in brush
+ ///
+ /// The brush distance
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public float GetBrushDistance()
+ {
+ return Interop.PenWave.GetBrushDistance();
+ }
+
+ ///
+ /// Gets Current Line Angle
+ ///
+ /// The line angle
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public float GetLineAngle()
+ {
+ return Interop.PenWave.GetLineAngle();
+ }
+
+ ///
+ /// Gets count of shapes on current canvas
+ ///
+ /// The shape count
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int GetShapeCount()
+ {
+ return Interop.PenWave.GetShapeCount();
+ }
+
+ ///
+ /// Create Canvas
+ ///
+ /// The width
+ /// The height
+ /// The canvas ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint CreateCanvas(int canvasWidth, int canvasHeight)
+ {
+ return Interop.PenWave.CreateCanvas(canvasWidth, canvasHeight);
+ }
+
+ ///
+ /// Create Canvas with background image from file path.
+ ///
+ /// The background image path
+ /// The canvas ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint CreateCanvasWithBackgroundImage(string path)
+ {
+ return Interop.PenWave.CreateCanvasWithBackgroundImage(path);
+ }
+
+ ///
+ /// Sets Current Canvas
+ ///
+ /// The canvas ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetCurrentCanvas(uint canvasID)
+ {
+ Interop.PenWave.SetCurrentCanvas(canvasID);
+ }
+
+ ///
+ /// Clear Current Canvas
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ClearCurrentCanvas()
+ {
+ Interop.PenWave.ClearCurrentCanvas();
+ }
+
+ ///
+ /// Start Selecting Area
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void StartSelectingArea(float x, float y)
+ {
+ Interop.PenWave.StartSelectingArea(x, y);
+ }
+
+ ///
+ /// Resize Current Selected Area
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ResizeSelectedArea(float x, float y)
+ {
+ Interop.PenWave.ResizeSelectedArea(x, y);
+ }
+
+ ///
+ /// Is inside selected area
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if it is inside selected area. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool InsideSelectedArea(float x, float y)
+ {
+ return Interop.PenWave.InsideSelectedArea(x, y);
+ }
+
+ ///
+ /// Gets screen-space position of top-left corner and size of current selection
+ ///
+ /// destination reference for horizontal position or NaN if no selection is present
+ /// destination reference for vertical position or NaN if no selection is present
+ /// destination reference for selection width or NaN if no selection is present
+ /// destination reference for selection height or NaN if no selection is present
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool GetSelectionDimensions(ref float x, ref float y, ref float width, ref float height)
+ {
+ return Interop.PenWave.GetSelectionDimensions(ref x, ref y, ref width, ref height);
+ }
+
+ ///
+ /// TouchedDrawable
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int TouchedDrawable(float x, float y)
+ {
+ return Interop.PenWave.TouchedDrawable(x, y);
+ }
+
+ ///
+ /// Select Drawable
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// The DrawableType
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int SelectDrawable(float x, float y)
+ {
+ return Interop.PenWave.SelectDrawable(x, y);
+ }
+
+ ///
+ /// Select Drawables
+ ///
+ /// The DrawableType
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int SelectDrawables()
+ {
+ return Interop.PenWave.SelectDrawables();
+ }
+
+ ///
+ /// Drag Selected Drawables
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void DragSelectedDrawables(float x, float y)
+ {
+ Interop.PenWave.DragSelectedDrawables(x, y);
+ }
+
+ ///
+ /// End Draging
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void EndDraging()
+ {
+ Interop.PenWave.EndDraging();
+ }
+
+ ///
+ /// Start rotating selected shapes
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool StartRotating(float x, float y)
+ {
+ return Interop.PenWave.StartRotating(x, y);
+ }
+
+ ///
+ /// Rotate selected shapes
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool RotateSelected(float x, float y)
+ {
+ return Interop.PenWave.RotateSelected(x, y);
+ }
+
+ ///
+ /// Finish rotating selected shapes
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool EndRotating(float x, float y)
+ {
+ return Interop.PenWave.EndRotating(x, y);
+ }
+
+ ///
+ /// Initialize scaling of selected area.
+ /// Selecting neither or both of left/right or bottom/top anchor will put the anchor in the middle of relevant axis
+ ///
+ /// place anchor on the left side of current selection
+ /// place anchor on the right side of current selection
+ /// place anchor on the bottom side of current selection
+ /// place anchor on the top side of current selection
+ /// x cooridinate of anchor point
+ /// y cooridinate of anchor point
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void StartSelectionScale(bool anchorLeft, bool anchorRight, bool anchorTop, bool anchorBottom, ref float anchorX, ref float anchorY)
+ {
+ Interop.PenWave.StartSelectionScale(anchorLeft, anchorRight, anchorTop, anchorBottom, ref anchorX, ref anchorY);
+ }
+
+ ///
+ /// Scale Selected Area
+ ///
+ /// horizontal scale factor relative to initial size
+ /// vertical scale factor relative to initial size
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ScaleSelection(float scaleFactorX, float scaleFactorY)
+ {
+ Interop.PenWave.ScaleSelection(scaleFactorX, scaleFactorY);
+ }
+
+ ///
+ /// Finalize scaling of selected area
+ ///
+ /// horizontal scale factor relative to initial size
+ /// vertical scale factor relative to initial size
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void EndSelectionScale(float scaleFactorX, float scaleFactorY)
+ {
+ Interop.PenWave.EndSelectionScale(scaleFactorX, scaleFactorY);
+ }
+
+ ///
+ /// Drop Selected Drawables
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void DropSelectedDrawables()
+ {
+ Interop.PenWave.DropSelectedDrawables();
+ }
+
+ ///
+ /// Zoom Selected Area
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Zoom lebel
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SelectedAreaZoom(float x, float y, float zoom)
+ {
+ Interop.PenWave.SelectedAreaZoom(x, y, zoom);
+ }
+
+ ///
+ /// Save canvas to file
+ ///
+ /// Canvas ID
+ /// file path
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool SaveCanvas(uint canvasID, string path)
+ {
+ return Interop.PenWave.SaveCanvas(canvasID, path);
+ }
+
+ ///
+ /// Load canvas from file
+ ///
+ /// Canvas ID
+ /// file path
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool LoadCanvas(uint canvasID, string path)
+ {
+ return Interop.PenWave.LoadCanvas(canvasID, path);
+ }
+
+ ///
+ /// Take screenshot of canvas to file with given dimensions and save callback function.
+ ///
+ /// Canvas ID
+ /// file path
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Width
+ /// Height
+ /// save callback function
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void TakeScreenshot(uint canvasID, string path, int x, int y, int width, int height, ThumbnailSavedCallback thumbSaved)
+ {
+ Interop.PenWave.TakeScreenshot(canvasID, path, x, y, width, height, thumbSaved);
+ }
+
+ ///
+ /// ToggleGrid
+ ///
+ /// The density type
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ToggleGrid(int densityType)
+ {
+ Interop.PenWave.ToggleGrid(densityType);
+ }
+
+ ///
+ /// Toggle Chart Grid
+ ///
+ /// The density type
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ToggleChartGrid(int densityType)
+ {
+ Interop.PenWave.ToggleChartGrid(densityType);
+ }
+
+ ///
+ /// Gets Chart Grid Density
+ ///
+ /// chart grid density
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int GetChartGridDensity()
+ {
+ return Interop.PenWave.GetChartGridDensity();
+ }
+
+ ///
+ /// Copy shape
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool Copy()
+ {
+ return Interop.PenWave.Copy();
+ }
+
+ ///
+ /// Paste shape in position
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public int Paste(float x, float y)
+ {
+ return Interop.PenWave.Paste(x, y);
+ }
+
+ ///
+ /// Cut shape
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool Cut()
+ {
+ return Interop.PenWave.Cut();
+ }
+
+ ///
+ /// Remove shape
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool Remove()
+ {
+ return Interop.PenWave.Remove();
+ }
+
+ ///
+ /// Add chart
+ ///
+ /// chart type
+ /// path to chart
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddChart(int chartType, string path)
+ {
+ Interop.PenWave.AddChart(chartType, path);
+ }
+
+ ///
+ /// Change mode
+ ///
+ /// mode
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ChangeMode(int mode)
+ {
+ Interop.PenWave.ChangeMode(mode);
+ }
+
+ ///
+ /// Chart Position
+ ///
+ /// current chart x position
+ /// current chart y position
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ChartPosition(ref float x, ref float y)
+ {
+ Interop.PenWave.ChartPosition(ref x, ref y);
+ }
+
+ ///
+ /// Add Picture to canvas with original size and at 0;0 position
+ ///
+ /// file path
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Width
+ /// Height
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddPicture(string path, float x, float y, float width, float height)
+ {
+ Interop.PenWave.AddPicture(path, x, y, width, height);
+ }
+
+ ///
+ /// Sets Canvas Background
+ ///
+ /// file path
+ /// file path
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Width
+ /// Height
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetCanvasBackground(string path, float x, float y, float width, float height)
+ {
+ Interop.PenWave.SetCanvasBackground(path, x, y, width, height);
+ }
+
+ ///
+ /// Add Text to canvas
+ ///
+ /// The text
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Text size
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddText(string text, float x, float y, float size)
+ {
+ Interop.PenWave.AddText(text, x, y, size);
+ }
+
+ ///
+ /// Add Note.
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Width
+ /// Height
+ /// The note ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public uint AddNote(float x, float y, float width, float height)
+ {
+ return Interop.PenWave.AddNote(x, y, width, height);
+ }
+
+ ///
+ /// Remove Note.
+ ///
+ /// The note ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void RemoveNote(uint noteID)
+ {
+ Interop.PenWave.RemoveNote(noteID);
+ }
+
+ ///
+ /// Clear Note.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ClearNote()
+ {
+ Interop.PenWave.ClearNote();
+ }
+
+ ///
+ /// Drag the active note.
+ ///
+ /// Point X coordinate
+ /// Point Y coordinate
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool DragNote(float x, float y)
+ {
+ return Interop.PenWave.DragNote(x, y);
+ }
+
+ ///
+ /// End dragging of the active note.
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool EndNoteDragging()
+ {
+ return Interop.PenWave.EndNoteDragging();
+ }
+
+ ///
+ /// Sets color of the active note.
+ ///
+ /// hex code of the color
+ /// alpha value
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetNoteColor(string hexColor, float a)
+ {
+ Interop.PenWave.SetNoteColor(hexColor, a);
+ }
+
+ ///
+ /// Sets active note.
+ ///
+ /// The note ID
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetActiveNote(uint noteID)
+ {
+ Interop.PenWave.SetActiveNote(noteID);
+ }
+
+ ///
+ /// Undo
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool Undo()
+ {
+ return Interop.PenWave.Undo();
+ }
+
+ ///
+ /// Redo
+ ///
+ /// Returns true if successful. otherwise false
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool Redo()
+ {
+ return Interop.PenWave.Redo();
+ }
+
+ ///
+ /// CanUndo
+ ///
+ /// whether there is an operation to be undone or not
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanUndo()
+ {
+ return Interop.PenWave.CanUndo();
+ }
+
+ ///
+ /// CanRedo
+ ///
+ /// whether there is an operation to be redone or not
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanRedo()
+ {
+ return Interop.PenWave.CanRedo();
+ }
+
+ ///
+ /// Reset Undo
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ResetUndo()
+ {
+ Interop.PenWave.ResetUndo();
+ }
+
+ ///
+ /// Reset Redo
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ResetRedo()
+ {
+ Interop.PenWave.ResetRedo();
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Canvas/PenWaveCanvas.cs b/src/Tizen.NUI.PenWave/src/public/Canvas/PenWaveCanvas.cs
new file mode 100644
index 00000000000..58ba690a7b5
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Canvas/PenWaveCanvas.cs
@@ -0,0 +1,301 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// PenWaveCanvas is a view that allows drawing on it using various tools.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class PenWaveCanvas : DirectRenderingGLView
+ {
+ ///
+ /// The delegate for the thumbnail saved callback.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ private event EventHandler screenShotFinished;
+
+ ///
+ /// Events that are triggered when the tool starts an action.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler ActionStarted;
+
+ ///
+ /// Events that are triggered when the tool finishes an action.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler ActionFinished;
+
+ private UnRedoManager unredoManager;
+ private CanvasRenderer renderer;
+ private PropertyNotification propertyNotification;
+ private ToolBase currentTool;
+
+ ///
+ /// Creates a new instance of a PenWaveCanvas.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public PenWaveCanvas() : base(DirectRenderingGLView.ColorFormat.RGBA8888, DirectRenderingGLView.BackendMode.UnsafeDirectRendering)
+ {
+ renderer = new CanvasRenderer(PenWave.Instance.CreateCanvas(-1, -1));
+ InitializeCanvas();
+ }
+
+ ///
+ /// Creates a new instance of a PenWaveCanvas with a background image.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public PenWaveCanvas(string backgroundPath) : base(DirectRenderingGLView.ColorFormat.RGBA8888, DirectRenderingGLView.BackendMode.UnsafeDirectRendering)
+ {
+ renderer = new CanvasRenderer(PenWave.Instance.CreateCanvasWithBackgroundImage(backgroundPath));
+ InitializeCanvas();
+ }
+
+ // Initialize canvas
+ private void InitializeCanvas()
+ {
+ unredoManager = new UnRedoManager();
+ this.WidthResizePolicy = ResizePolicyType.FillToParent;
+ this.HeightResizePolicy = ResizePolicyType.FillToParent;
+
+ this.RenderingMode = GLRenderingMode.Continuous;
+ this.RegisterGLCallbacks(renderer.InitializeGL, renderer.RenderFrame, renderer.TerminateGL);
+ this.SetGraphicsConfig(false, false, 0, GLESVersion.Version20);
+
+ propertyNotification = this.AddPropertyNotification("size", PropertyCondition.Step(1.0f));
+ propertyNotification.Notified += (object source, PropertyNotification.NotifyEventArgs args) =>
+ {
+ Tizen.NUI.BaseComponents.View target = args.PropertyNotification.GetTarget() as Tizen.NUI.BaseComponents.View;
+ if (target != null)
+ {
+ renderer.Resize((int)target.SizeWidth, (int)target.SizeHeight);
+ }
+ };
+ }
+
+ ///
+ /// The tool used to draw on the canvas. If the tool is changed, the previous tool will be deactivated and the new tool will be activated.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public ToolBase CurrentTool
+ {
+ get => currentTool;
+ set
+ {
+ if (value == currentTool) return;
+ if (currentTool!= null)
+ {
+ currentTool.Deactivate();
+ currentTool.ActionStarted -= OnStarted;
+ currentTool.ActionFinished -= OnFinished;;
+ }
+
+ currentTool = value;
+
+ if (currentTool != null)
+ {
+ currentTool.Activate();
+ currentTool.ActionStarted += OnStarted;
+ currentTool.ActionFinished += OnFinished;
+ }
+ }
+ }
+
+ ///
+ /// Notifies that the canvas has started an action.
+ ///
+ private void NotifyActionStarted(object sender, EventArgs e)
+ {
+ ActionStarted?.Invoke(this, EventArgs.Empty);
+ }
+
+ ///
+ /// Notifies that the canvas has finished an action.
+ ///
+ private void NotifyActionFinished(object sender, EventArgs e)
+ {
+ ActionFinished?.Invoke(this, EventArgs.Empty);
+ }
+
+
+ // Event handlers for action started.
+ private void OnStarted(object sender, EventArgs e)
+ {
+ NotifyActionStarted(sender, e);
+ }
+
+ // Event handlers for action finished.
+ private void OnFinished(object sender, EventArgs e)
+ {
+ RegisterUndo();
+ NotifyActionFinished(sender, e);
+ }
+
+ private void RegisterUndo()
+ {
+ unredoManager.RegisterUndo();
+ }
+
+ ///
+ /// Clears the canvas.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ClearCanvas()
+ {
+ renderer.ClearCanvas();
+ RegisterUndo();
+ NotifyActionFinished(this, EventArgs.Empty);
+ }
+
+ ///
+ /// Returns true if there are any actions that can be undone. Otherwise returns false.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanUndo => unredoManager.CanUndo;
+
+ ///
+ /// Returns true if there are any actions that can be redone. Otherwise returns false.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool CanRedo => unredoManager.CanRedo;
+
+ ///
+ /// Undoes the last action. If there are no actions to undo, nothing happens.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void Undo()
+ {
+ unredoManager.Undo();
+ }
+
+ ///
+ /// Redoes the last action. If there are no actions to redo, nothing happens.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void Redo()
+ {
+ unredoManager.Redo();
+ }
+
+ ///
+ /// Sets the color of the canvas.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SetCanvasColor(Color color)
+ {
+ renderer.SetCanvasColor(color);
+ }
+
+ ///
+ /// Toggles the visibility of the grid.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ToggleGrid(GridDensityType gridType)
+ {
+ renderer.ToggleGrid(gridType);
+ }
+
+ ///
+ /// Adds a picture to the canvas.
+ ///
+ ///
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddPicture(string path, Size2D size, Position2D position)
+ {
+ renderer.AddPicture(path, size, position);
+ RegisterUndo();
+ NotifyActionFinished(this, EventArgs.Empty);
+ }
+
+ ///
+ /// Handles touch events. This touch event is delivered to the current tool.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void HandleInput(Touch touch)
+ {
+ currentTool?.HandleInput(touch);
+ }
+
+ ///
+ /// Saves the canvas to a file.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void SaveCanvas(string path)
+ {
+ renderer.SaveCanvas(path);
+ }
+
+ ///
+ /// Loads the canvas from a file.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void LoadCanvas(string path)
+ {
+ renderer.LoadCanvas(path);
+ }
+
+
+ ///
+ /// Takes a screen shot of the canvas and saves it to a file.
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void TakeScreenShot(string path, int x, int y, int width, int height, EventHandler callback)
+ {
+ renderer.TakeScreenShot(path, x, y, width, height, OnTakeScreenShot);
+ screenShotFinished = callback;
+ }
+
+ private void OnTakeScreenShot()
+ {
+ screenShotFinished?.Invoke(this, EventArgs.Empty);
+ }
+
+ ///
+ /// Disposes the PenWaveCanvas.
+ ///
+ ///
+ protected override void Dispose(DisposeTypes type)
+ {
+ if(disposed) return;
+ currentTool.ActionStarted -= OnStarted;
+ currentTool.ActionFinished -= OnFinished;;
+ renderer.TerminateGL();
+ base.Dispose(type);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Common/PWConstants.cs b/src/Tizen.NUI.PenWave/src/public/Common/PWConstants.cs
new file mode 100644
index 00000000000..96ffb0b259a
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Common/PWConstants.cs
@@ -0,0 +1,37 @@
+ // Copyright (c) 2019 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+using System;
+using System.ComponentModel;
+using System.Diagnostics.CodeAnalysis;
+
+namespace Tizen.NUI.PenWave
+{
+ internal struct FrameworkInformation
+ {
+ public readonly static string ResourcePath = "/usr/share/dotnet.tizen/framework/res/";
+ }
+
+ ///
+ /// Enumeration for the grid density type.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public enum GridDensityType
+ {
+ None = 0,
+ Small = 1,
+ Medium = 2,
+ Large = 4
+ }
+}
\ No newline at end of file
diff --git a/src/Tizen.NUI.PenWave/src/public/Picker/PenWaveToolPicker.cs b/src/Tizen.NUI.PenWave/src/public/Picker/PenWaveToolPicker.cs
new file mode 100644
index 00000000000..522e4f08693
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Picker/PenWaveToolPicker.cs
@@ -0,0 +1,642 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// PenWaveToolPicker class provides a user interface for selecting and configuring various drawing tools in the PenWave application.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class PenWaveToolPicker : View
+ {
+ private static readonly string ResourcePath = FrameworkInformation.ResourcePath + "images/light/";
+
+ // the icons for different brush types
+ private static readonly Dictionary BrushIconMap = new Dictionary
+ {
+ { PencilTool.BrushType.Stroke, "icon_pencil.png" },
+ { PencilTool.BrushType.VarStroke, "icon_varstroke_dec.png" },
+ { PencilTool.BrushType.VarStrokeInc, "icon_varstroke_inc.png" },
+ { PencilTool.BrushType.SprayBrush, "icon_spray.png" },
+ { PencilTool.BrushType.DotBrush, "icon_dot.png" },
+ { PencilTool.BrushType.DashedLine, "icon_dashed_line.png" },
+ { PencilTool.BrushType.Highlighter, "icon_highlighter.png" },
+ { PencilTool.BrushType.SoftBrush, "icon_soft_brush.png" },
+ { PencilTool.BrushType.SharpBrush, "icon_sharp_brush.png" },
+ };
+
+ // the color palette for brushes
+ private static readonly List BrushColorMap = new List
+ {
+ new Color("#F7B32C"), new Color("#FD5703"), new Color("#DA1727"),
+ new Color("#FF00A8"), new Color("#74BFB8"), new Color("#4087C5"),
+ new Color("#070044"), new Color("#0E0E0E")
+ };
+
+ // the icons for different eraser types
+ private static readonly Dictionary EraserIconMap = new Dictionary
+ {
+ { EraserTool.EraserType.Partial, "icon_eraser.png" },
+ { EraserTool.EraserType.Full, "icon_full_eraser.png" },
+ };
+
+ // the color palette for canvas background color
+ private static readonly List CanvasColor = new List
+ {
+ new Color("#F0F0F0"), new Color("#B7B7B7"), new Color("#E3F2FF"),
+ new Color("#202022"), new Color("#515151"), new Color("#17234D"),
+ };
+
+ // the icons for different grid density types
+ private static readonly Dictionary GridIconMap = new Dictionary
+ {
+ { GridDensityType.Small, "icon_small_grid_density.png" },
+ { GridDensityType.Medium, "icon_medium_grid_density.png" },
+ { GridDensityType.Large, "icon_large_grid_density.png" },
+ };
+
+ private readonly PenWaveCanvas canvasView;
+ private readonly Dictionary tools;
+
+ private ImageView selectedButton;
+ private ImageView undoButton;
+ private ImageView redoButton;
+
+
+ private const string IconStateNormalColor = "#17234d";
+ private const string IconStateSelectedColor = "#FF6200";
+ private const string IconStateDisabledColor = "#CACACA";
+
+
+ ///
+ /// The PickerView property. It contains the view that holds the tool buttons.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public View PickerView { get; private set; }
+
+ ///
+ /// The PopupView property. It contains the view that holds the tool settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public View PopupView { get; private set; }
+
+ ///
+ /// The ToolChanged event. It is triggered when the selected tool changes.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler ToolChanged;
+
+ ///
+ /// Creates a new instance of PenWaveToolPicker.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public PenWaveToolPicker(PenWaveCanvas canvasView)
+ {
+ this.canvasView = canvasView;
+ tools = new Dictionary();
+
+ canvasView.ActionFinished += OnFinished;
+ Initialize();
+ }
+
+ // Update UI when action finished. This method is called when the current action is finished.
+ private void OnFinished(object sender, EventArgs e)
+ {
+ UpdateUI();
+ }
+
+ // Initialize the tool picker and its components.
+ private void Initialize()
+ {
+ InitializeUI();
+ InitializeCanvasTools();
+ InitializeTools();
+ UpdateUI();
+ }
+
+ // Initialize the UI components of the tool picker.
+ private void InitializeUI()
+ {
+ WidthResizePolicy = ResizePolicyType.FillToParent;
+ HeightResizePolicy = ResizePolicyType.FillToParent;
+ Layout = new LinearLayout
+ {
+ HorizontalAlignment = HorizontalAlignment.Center,
+ VerticalAlignment = VerticalAlignment.Top,
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ };
+
+ // Picker View 구성
+ PickerView = new View
+ {
+ CornerRadius = new Vector4(10, 10, 10, 10),
+ WidthSpecification = LayoutParamPolicies.WrapContent,
+ HeightSpecification = LayoutParamPolicies.WrapContent,
+ Layout = new LinearLayout
+ {
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center
+ },
+ BackgroundImage = ResourcePath + "menu_bg.png",
+ };
+ PickerView.TouchEvent += (s, e) => { return true; }; // Prevent touch events from propagating to the canvas view
+
+ // Popup View 구성
+ PopupView = new View
+ {
+ WidthSpecification = LayoutParamPolicies.WrapContent,
+ HeightSpecification = LayoutParamPolicies.WrapContent,
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ },
+ BackgroundImage = ResourcePath + "canvas_popup_bg.png",
+ Padding = new Extents(20, 20, 20, 20),
+ };
+ PopupView.Hide();
+ PopupView.TouchEvent += (s, e) => { return true; }; // Prevent touch events from propagating to the canvas view
+ canvasView.TouchEvent += (s, e) => { ClearPopupView(); return false; }; // Hide popup when touching outside it
+
+ Add(PickerView);
+ Add(PopupView);
+ canvasView.Add(this);
+ }
+
+ // Initialize the canvas tools and their corresponding buttons.
+ private void InitializeCanvasTools()
+ {
+ var backgroundColorButton = CreateToolButton(ResourcePath + "icon_color_palette.png", () =>
+ {
+ ShowPaletteSetting();
+ });
+ PickerView.Add(backgroundColorButton);
+
+ var gridButton = CreateToolButton(ResourcePath + "icon_medium_grid_density.png", () =>
+ {
+ ShowGridSetting();
+ });
+ PickerView.Add(gridButton);
+
+ undoButton = CreateToolButton(ResourcePath + "icon_undo.png", () =>
+ {
+ canvasView.Undo();
+ UpdateUI();
+ });
+ PickerView.Add(undoButton);
+
+ redoButton = CreateToolButton(ResourcePath + "icon_redo.png", () =>
+ {
+ canvasView.Redo();
+ UpdateUI();
+ });
+ PickerView.Add(redoButton);
+
+ var clearButton = CreateToolButton(ResourcePath + "icon_clear.png", () =>
+ {
+ canvasView.ClearCanvas();
+ UpdateUI();
+ });
+ PickerView.Add(clearButton);
+ }
+
+ // Show the color palette setting for the canvas background color.
+ private void ShowPaletteSetting()
+ {
+ ClearPopupView();
+
+ PopupView.Show();
+
+ var colorPicker = new View
+ {
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ }
+ };
+
+ foreach (var color in CanvasColor)
+ {
+ var button = new ImageView
+ {
+ Size2D = new Size2D(48, 48),
+ Color = color,
+ ResourceUrl = ResourcePath + "/color_icon_base.png",
+ };
+ button.TouchEvent += (s, e) =>
+ {
+ if (e.Touch.GetState(0) == PointStateType.Down)
+ {
+ canvasView.SetCanvasColor(color);
+ }
+ return true;
+ };
+
+ colorPicker.Add(button);
+ }
+
+ PopupView.Add(colorPicker);
+ }
+
+ // Show the grid density setting for the canvas grid.
+ private void ShowGridSetting()
+ {
+ ClearPopupView();
+
+ PopupView.Show();
+
+ var gridPicker = new View
+ {
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ }
+ };
+
+ foreach (var icon in GridIconMap)
+ {
+ var button = CreateToolButton(ResourcePath + icon.Value, () =>
+ {
+ canvasView.ToggleGrid(icon.Key);
+ });
+ gridPicker.Add(button);
+ }
+
+ PopupView.Add(gridPicker);
+ }
+
+ // Initialize the tools and add them to the tool picker. Each tool has its own settings and behavior.
+ private void InitializeTools()
+ {
+ var pencilTool = new PencilTool(PencilTool.BrushType.Stroke, Color.Black, 3.0f);
+ var eraserTool = new EraserTool(EraserTool.EraserType.Partial, 48.0f);
+ var selectionTool = new SelectionTool(SelectionTool.SelectionType.Move);
+ AddTool(pencilTool, "icon_pencil.png");
+ AddTool(eraserTool, "icon_eraser.png");
+ AddTool(selectionTool, "icon_select.png");
+
+ canvasView.CurrentTool = pencilTool;
+ }
+
+ // Add a tool to the tool picker and create a button for it. The button will be used to select the tool and show its settings.
+ private void AddTool(ToolBase tool, string icon)
+ {
+ tools[tool.GetType()] = tool;
+
+ var toolButton = CreateToolButton(ResourcePath + icon, () =>
+ {
+ SetTool(tool);
+ });
+ PickerView.Add(toolButton);
+
+ }
+
+ // Set the current tool of the canvas view and show its settings.
+ private void SetTool(ToolBase tool)
+ {
+ if (tools.ContainsKey(tool.GetType()))
+ {
+ canvasView.CurrentTool = tool;
+ ShowToolSettings(tool);
+ ToolChanged?.Invoke(this, EventArgs.Empty);
+ }
+ }
+
+ // Show the settings for the given tool in the popup view. Each tool has its own settings and behavior.
+ private void ShowToolSettings(ToolBase tool)
+ {
+ ClearPopupView();
+
+ if (tool is PencilTool pencilTool)
+ ShowPencilToolSettings(pencilTool);
+ else if (tool is EraserTool eraserTool)
+ ShowEraserToolSettings(eraserTool);
+ else if (tool is SelectionTool selectionTool)
+ ShowSelectionToolSettings(selectionTool);
+
+ PopupView.Show();
+ }
+
+ // Show the settings for the pencil tool in the popup view. The pencil tool has brush type, color, and size settings.
+ private void ShowPencilToolSettings(PencilTool pencilTool)
+ {
+ AddBrushPicker(pencilTool);
+ AddColorPicker(pencilTool);
+ AddSizeSlider(pencilTool);
+ }
+
+ // Show the settings for the eraser tool in the popup view. The eraser tool has eraser type and size settings.
+ private void ShowEraserToolSettings(EraserTool eraserTool)
+ {
+ AddEraserTypePicker(eraserTool);
+ AddSizeSlider(eraserTool);
+ }
+
+ // Show the settings for the selection tool in the popup view. The selection tool has selection type settings.
+ private void ShowSelectionToolSettings(SelectionTool selectionTool)
+ {
+ AddSelectionTypePicker(selectionTool);
+ }
+
+ // Create a button for the given tool and add it to the popup view.
+ private void AddBrushPicker(PencilTool pencilTool)
+ {
+ var brushPicker = new View
+ {
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ }
+ };
+
+ foreach (var icon in BrushIconMap)
+ {
+ var button = CreateToolButton(ResourcePath + icon.Value, () =>
+ {
+ pencilTool.Brush = icon.Key;
+ pencilTool.Activate();
+ });
+ brushPicker.Add(button);
+ }
+
+ PopupView.Add(brushPicker);
+ }
+
+ // Create a button for the given color and add it to the popup view.
+ private void AddColorPicker(PencilTool pencilTool)
+ {
+ var colorPicker = new View
+ {
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ }
+ };
+
+ foreach (var color in BrushColorMap)
+ {
+ var button = new ImageView
+ {
+ Size2D = new Size2D(48, 48),
+ Color = color,
+ ResourceUrl = ResourcePath + "/color_icon_base.png",
+ };
+ button.TouchEvent += (s, e) =>
+ {
+ if (e.Touch.GetState(0) == PointStateType.Down)
+ {
+ pencilTool.BrushColor = color;
+ pencilTool.Activate();
+ }
+ return true;
+ };
+
+ colorPicker.Add(button);
+ }
+
+ PopupView.Add(colorPicker);
+ }
+
+ // Create a slider for the given tool and add it to the popup view. The slider controls the size of the tool.
+ private void AddSizeSlider(ToolBase tool)
+ {
+
+ var slider = new Slider
+ {
+ WidthSpecification = 300
+ };
+ if (tool is PencilTool pencilTool)
+ {
+ slider.MinValue = 1;
+ slider.MaxValue = 20;
+ slider.CurrentValue = pencilTool.BrushSize;
+ }
+ else if (tool is EraserTool eraserTool)
+ {
+ slider.MinValue = 10;
+ slider.MaxValue = 100;
+ slider.CurrentValue = eraserTool.EraserRadius;
+ }
+
+ slider.ValueChanged += (s, e) =>
+ {
+ if (tool is PencilTool pencilTool)
+ {
+ pencilTool.BrushSize = e.CurrentValue;
+ }
+ else if (tool is EraserTool eraserTool)
+ {
+ eraserTool.EraserRadius = e.CurrentValue;
+ }
+
+ tool.Activate();
+ };
+
+ PopupView.Add(slider);
+ }
+
+ // Create a button for the given eraser type and add it to the popup view. The button toggles between partial and full eraser modes.
+ private void AddEraserTypePicker(EraserTool eraserTool)
+ {
+ var eraserPicker = new View
+ {
+ Layout = new LinearLayout
+ {
+ VerticalAlignment = VerticalAlignment.Center,
+ HorizontalAlignment = HorizontalAlignment.Center,
+ LinearOrientation = LinearLayout.Orientation.Horizontal,
+ }
+ };
+
+ foreach (var icon in EraserIconMap)
+ {
+ var button = CreateToolButton(ResourcePath + icon.Value, () =>
+ {
+ eraserTool.Eraser = eraserTool.Eraser == EraserTool.EraserType.Partial
+ ? EraserTool.EraserType.Full
+ : EraserTool.EraserType.Partial;
+ eraserTool.Activate();
+ });
+ eraserPicker.Add(button);
+ }
+ PopupView.Add(eraserPicker);
+ }
+
+ // Create a button for the given selection type and add it to the popup view. The button toggles between move, resize, and rotate modes.
+ private void AddSelectionTypePicker(SelectionTool selectionTool)
+ {
+ var picker = new View
+ {
+ Layout = new LinearLayout
+ {
+ LinearOrientation = LinearLayout.Orientation.Horizontal
+ }
+ };
+
+ var types = Enum.GetValues(typeof(SelectionTool.SelectionType));
+ foreach (SelectionTool.SelectionType type in types)
+ {
+ var button = CreateToolButton(ResourcePath + $"icon_{type.ToString().ToLower()}.png", () =>
+ {
+ selectionTool.Selection = type;
+ });
+ picker.Add(button);
+ }
+
+ PopupView.Add(picker);
+ }
+
+ ///
+ /// Add a button to the picker view with the given icon path and click action.
+ ///
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddButtonToPickerView(string iconPath, Action OnClick)
+ {
+ var button = CreateToolButton(iconPath, OnClick);
+ PickerView.Add(button);
+ }
+
+ ///
+ /// Add a button to the picker view with the given view.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddViewToPickerView(View view)
+ {
+ PickerView.Add(view);
+ }
+
+ ///
+ /// Add a button to the popup view with the given icon path and click action.
+ ///
+ ///
+ ///
+ public void AddButtonToPopupView(string iconPath, Action OnClick)
+ {
+ var button = CreateToolButton(iconPath, OnClick);
+ PopupView.Add(button);
+ }
+
+ ///
+ /// Add a button to the popup view with the given icon path and click action.
+ ///
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void AddViewToPopupView(View view)
+ {
+ PopupView.Add(view);
+ }
+
+ ///
+ /// Create a tool button with the given icon path and click action.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ private ImageView CreateToolButton(string iconPath, Action OnClick)
+ {
+ var button = new ImageView
+ {
+ Size2D = new Size2D(48, 48),
+ ResourceUrl = iconPath,
+ Color = new Color(IconStateNormalColor),
+ };
+
+ button.TouchEvent += (s, e) =>
+ {
+ if (e.Touch.GetState(0) == PointStateType.Down)
+ {
+ if (selectedButton != null)
+ {
+ selectedButton.Color = new Color(IconStateNormalColor);
+ }
+ selectedButton = button;
+ button.Color = new Color(IconStateSelectedColor);
+ OnClick?.Invoke();
+ }
+ return true;
+ };
+
+ return button;
+ }
+
+ // Update the UI based on the current state of the canvas view. This includes updating the selected tool, the undo/redo buttons, and the tool settings.
+ private void UpdateUI()
+ {
+ ClearPopupView();
+ // Update undo/redo buttons state and colors
+ if (undoButton != null)
+ {
+ undoButton.Color = canvasView.CanUndo ? new Color(IconStateNormalColor) : new Color(IconStateDisabledColor);
+ }
+
+ if (redoButton != null)
+ {
+ redoButton.Color = canvasView.CanRedo ? new Color(IconStateNormalColor) : new Color(IconStateDisabledColor);
+ }
+
+ }
+
+ ///
+ /// Clear the popup view and hide it.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ClearPopupView()
+ {
+ int childNum = (int)PopupView.ChildCount;
+ for (int i = childNum - 1; i >= 0; i--)
+ {
+ PopupView.Remove(PopupView.GetChildAt((uint)i));
+ }
+ PopupView.Hide();
+ }
+
+ ///
+ /// Show the popup view.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ShowPopupView()
+ {
+ PopupView.Show();
+ }
+
+ // Dispose the tool picker and its components.
+ protected override void Dispose(DisposeTypes type)
+ {
+ if(disposed) return;
+ canvasView.ActionFinished -= OnFinished;;
+ base.Dispose(type);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Eraser/EraserTool.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Eraser/EraserTool.cs
new file mode 100644
index 00000000000..356a17c1542
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Eraser/EraserTool.cs
@@ -0,0 +1,143 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The EraserTool class provides functionality to erase shapes from the canvas.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class EraserTool : ToolBase
+ {
+ /// The current state of the tool.
+ private bool isActive = false;
+
+ ///
+ /// The type of eraser tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public enum EraserType
+ {
+ Partial = 0,
+ Full,
+ }
+
+ ///
+ /// Constructor
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public EraserTool(EraserType eraserType, float radius)
+ {
+ Eraser = eraserType;
+ EraserRadius = radius;
+ }
+
+ ///
+ /// The type of eraser tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public EraserType Eraser { get; set; }
+
+ ///
+ /// The radius of the eraser tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public float EraserRadius { get; set; }
+
+ ///
+ /// Activate the tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Activate()
+ {
+ }
+
+ ///
+ /// Deactivate the tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Deactivate()
+ {
+ EndDrawing();
+ }
+
+ ///
+ /// Handle input events.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void HandleInput(Touch touch)
+ {
+ if (touch == null || touch.GetPointCount() == 0) return;
+
+ uint pointStateIndex = 0;
+ uint touchTime = touch.GetTime();
+
+ List touchPositionList = new List();
+ for (uint i = 0; i < touch.GetPointCount(); ++i)
+ {
+ touchPositionList.Add(touch.GetLocalPosition(i));
+ }
+
+ Vector2 position = touchPositionList[(int)pointStateIndex];
+ switch (touch.GetState(pointStateIndex))
+ {
+ case PointStateType.Down:
+ StartDrawing(position, touchTime);
+ break;
+ case PointStateType.Motion:
+ ContinueDrawing(position, touchTime);
+ break;
+ case PointStateType.Up:
+ case PointStateType.Leave:
+ EndDrawing();
+ break;
+ }
+ }
+
+ // Start drawing at the given position.
+ private void StartDrawing(Vector2 position, uint touchTime)
+ {
+ isActive = true;
+ PenWave.Instance.EraseShape((int)position.X, (int)position.Y, EraserRadius, (Eraser == EraserType.Partial));
+ NotifyActionStarted();
+ }
+
+ // Continue drawing at the given position.
+ private void ContinueDrawing(Vector2 position, uint touchTime)
+ {
+ PenWave.Instance.EraseShape((int)position.X, (int)position.Y, EraserRadius, (Eraser == EraserType.Partial));
+ }
+
+ // End drawing at the given position.
+ private void EndDrawing()
+ {
+ if (isActive)
+ {
+ PenWave.Instance.StopErasing();
+ NotifyActionFinished();
+ isActive = false;
+ }
+ }
+ }
+}
+
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/BrushStrategyFactory.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/BrushStrategyFactory.cs
new file mode 100644
index 00000000000..2ff0b2e85ac
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/BrushStrategyFactory.cs
@@ -0,0 +1,68 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The factory class that creates brush strategies.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public sealed class BrushStrategyFactory
+ {
+ private static readonly BrushStrategyFactory instance = new BrushStrategyFactory();
+ private Dictionary brushStrategies = new Dictionary();
+
+ ///
+ /// Gets the singleton instance of the BrushStrategyFactory.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public static BrushStrategyFactory Instance => instance;
+
+ ///
+ /// Gets the brush strategy for the specified brush type.
+ ///
+ /// The brush type.
+ public IBrushStrategy GetBrushStrategy(PencilTool.BrushType brushType)
+ {
+ if (!brushStrategies.ContainsKey(brushType))
+ {
+ brushStrategies[brushType] = brushType switch
+ {
+ PencilTool.BrushType.Stroke => new StrokeBrush(),
+ PencilTool.BrushType.VarStroke => new VarStrokeBrush(),
+ PencilTool.BrushType.VarStrokeInc => new VarStrokeIncBrush(),
+ PencilTool.BrushType.SprayBrush => new SprayBrush(),
+ PencilTool.BrushType.DotBrush => new DotBrush(),
+ PencilTool.BrushType.DashedLine => new DashedLineBrush(),
+ PencilTool.BrushType.Highlighter => new HighlighterBrush(),
+ PencilTool.BrushType.SoftBrush => new SoftBrush(),
+ PencilTool.BrushType.SharpBrush => new SharpBrush(),
+ _ => throw new ArgumentOutOfRangeException(nameof(brushType), brushType, null)
+ };
+ }
+
+ return brushStrategies[brushType];
+ }
+
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DashedLineBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DashedLineBrush.cs
new file mode 100644
index 00000000000..95a8a017bd5
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DashedLineBrush.cs
@@ -0,0 +1,41 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The dashed line brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class DashedLineBrush : IBrushStrategy
+ {
+ ///
+ /// Apply brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(5);
+ PenWave.Instance.SetDashArray("1 3");
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DotBrush .cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DotBrush .cs
new file mode 100644
index 00000000000..31bdccceac8
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/DotBrush .cs
@@ -0,0 +1,42 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The dot brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class DotBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(1);
+ PenWave.Instance.SetBrushTexture(1);
+ PenWave.Instance.SetBrushDistance(2.0f);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/HighlighterBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/HighlighterBrush.cs
new file mode 100644
index 00000000000..44c65643d70
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/HighlighterBrush.cs
@@ -0,0 +1,42 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The highlighter brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class HighlighterBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(1);
+ PenWave.Instance.SetBrushTexture(3);
+ PenWave.Instance.SetBrushDistance(0.25f);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/IBrushStrategy.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/IBrushStrategy.cs
new file mode 100644
index 00000000000..bdcf2b049ba
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/IBrushStrategy.cs
@@ -0,0 +1,38 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// Interface for brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public interface IBrushStrategy
+ {
+ ///
+ /// Apply brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings();
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SharpBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SharpBrush.cs
new file mode 100644
index 00000000000..e376d60ed68
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SharpBrush.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The sharp brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class SharpBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(8);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SoftBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SoftBrush.cs
new file mode 100644
index 00000000000..29c3e5ceb40
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SoftBrush.cs
@@ -0,0 +1,42 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The soft brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class SoftBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(1);
+ PenWave.Instance.SetBrushTexture(4);
+ PenWave.Instance.SetBrushDistance(1.0f);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SprayBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SprayBrush.cs
new file mode 100644
index 00000000000..bb976748a1d
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/SprayBrush.cs
@@ -0,0 +1,42 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The spray brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class SprayBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(1);
+ PenWave.Instance.SetBrushTexture(0);
+ PenWave.Instance.SetBrushDistance(3.0f);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/StrokeBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/StrokeBrush.cs
new file mode 100644
index 00000000000..e02682b10d1
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/StrokeBrush.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The stroke brush strategy.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class StrokeBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(0);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeBrush.cs
new file mode 100644
index 00000000000..b5c16e8707a
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeBrush.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// A brush strategy that applies a variable stroke type.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class VarStrokeBrush : IBrushStrategy
+ {
+ ///
+ /// Applies the settings for the brush.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(6);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeIncBrush.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeIncBrush.cs
new file mode 100644
index 00000000000..d082add6c83
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/Brush/VarStrokeIncBrush.cs
@@ -0,0 +1,40 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The brush strategy that increases the stroke size as the user draws longer strokes.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class VarStrokeIncBrush : IBrushStrategy
+ {
+ ///
+ /// Apply the brush settings to the PenWave instance.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public void ApplyBrushSettings()
+ {
+ PenWave.Instance.SetStrokeType(7);
+ }
+ }
+}
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/PencilTool.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/PencilTool.cs
new file mode 100644
index 00000000000..2d497f82b4a
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Pencil/PencilTool.cs
@@ -0,0 +1,207 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The pencil tool allows the user to draw shapes on the canvas using a stylus or finger.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class PencilTool : ToolBase
+ {
+ ///
+ /// The type of brush used to draw.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public enum BrushType
+ {
+ Stroke = 0,
+ VarStroke,
+ DotBrush,
+ SprayBrush,
+ DashedLine,
+ Highlighter,
+ VarStrokeInc,
+ SoftBrush,
+ SharpBrush
+ }
+
+ // The error codes returned from the native side when adding points to a shape.
+ private enum ErrorShapeAddPointsType
+ {
+ NoError,
+ OverflowShape,
+ NoCanvasSet,
+ NoShapesInCanvas,
+ BadIdShape,
+ DrawableIsNotAShape,
+ DrawableIsNotALine,
+ DrawingCanceled
+ }
+
+ // The id of the current shape being drawn.
+ private uint currentShapeId;
+
+ ///
+ /// Creates a new instance of a PencilTool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public PencilTool(BrushType brushType, Color color, float size)
+ {
+ Brush = brushType;
+ BrushColor = color;
+ BrushSize = size;
+ }
+
+ ///
+ /// The type of brush used to draw.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public BrushType Brush { get; set; }
+
+ ///
+ /// The color of the brush used to draw.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public Color BrushColor { get; set; }
+
+ ///
+ /// The size of the brush used to draw.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public float BrushSize { get; set; }
+
+ // Converts a color to a hex string. Used to pass colors to the native side.
+ private string ToHex(Color color)
+ {
+ var red = (uint)(color.R * 255);
+ var green = (uint)(color.G * 255);
+ var blue = (uint)(color.B * 255);
+ return $"#{red:X2}{green:X2}{blue:X2}";
+ }
+
+ // Sets the brush type and applies the settings for that brush.
+ private void SetBrushType(BrushType brushType)
+ {
+ var brushStragety = BrushStrategyFactory.Instance.GetBrushStrategy(brushType);
+ if (brushStragety!= null)
+ {
+ brushStragety.ApplyBrushSettings();
+ }
+ }
+
+ ///
+ /// Activates the tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Activate()
+ {
+ SetBrushType(Brush);
+ PenWave.Instance.SetStrokeColor(ToHex(BrushColor), 1.0f);
+ PenWave.Instance.SetStrokeSize(BrushSize);
+ }
+
+ ///
+ /// Deactivates the tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Deactivate()
+ {
+ EndDrawing();
+ }
+
+ ///
+ /// Handles input from the user.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void HandleInput(Touch touch)
+ {
+ if (touch == null || touch.GetPointCount() == 0) return;
+
+ uint pointStateIndex = 0;
+ uint touchTime = touch.GetTime();
+
+ List touchPositionList = new List();
+ for (uint i = 0; i < touch.GetPointCount(); ++i)
+ {
+ touchPositionList.Add(touch.GetLocalPosition(i));
+ }
+
+ Vector2 position = touchPositionList[(int)pointStateIndex];
+ switch (touch.GetState(pointStateIndex))
+ {
+ case PointStateType.Down:
+ StartDrawing(position, touchTime);
+ break;
+ case PointStateType.Motion:
+ ContinueDrawing(position, touchTime);
+ break;
+ case PointStateType.Up:
+ case PointStateType.Leave:
+ EndDrawing();
+ break;
+ }
+ }
+
+ // Starts drawing a new shape. This will create a new shape on the canvas.
+ private void StartDrawing(Vector2 position, uint touchTime)
+ {
+ currentShapeId = PenWave.Instance.BeginShapeDraw(position.X, position.Y, touchTime);
+ if (currentShapeId > 0)
+ {
+ NotifyActionStarted();
+ }
+ }
+
+ // Continues drawing the current shape.
+ private void ContinueDrawing(Vector2 position, uint touchTime)
+ {
+ if (currentShapeId > 0)
+ {
+ var result = (ErrorShapeAddPointsType)PenWave.Instance.DrawShape(currentShapeId, position.X, position.Y, touchTime);
+ if (result == ErrorShapeAddPointsType.OverflowShape)
+ {
+ EndDrawing();
+ StartDrawing(position, touchTime);
+ }
+ else if (result == ErrorShapeAddPointsType.DrawingCanceled)
+ {
+ EndDrawing();
+ }
+ }
+ }
+
+ // Ends drawing the current shape.
+ private void EndDrawing()
+ {
+ if (currentShapeId > 0)
+ {
+ PenWave.Instance.EndShapeDraw(currentShapeId, 0);
+ currentShapeId = 0;
+ NotifyActionFinished();
+ }
+ }
+
+ }
+}
+
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Selection/SelectionTool.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Selection/SelectionTool.cs
new file mode 100644
index 00000000000..120fd5880e3
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Selection/SelectionTool.cs
@@ -0,0 +1,259 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The selection tool allows the user to select
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class SelectionTool : ToolBase
+ {
+ ///
+ /// Enumeration for the type of selection operation
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public enum SelectionType
+ {
+ Move = 0,
+ Scale,
+ Rotate,
+ }
+
+ // Enumeration for the type of drawable object
+ private enum DrawableType
+ {
+ None, //nothing found/selected
+ Multi, //more than one drawable selected
+ Shape,
+ Chart,
+ Picture,
+ Text
+ }
+
+ // Enumeration for the current mode of operation
+ private enum Mode
+ {
+ None,
+ Move,
+ Resize,
+ Scale,
+ Rotate
+ }
+
+ // Flag to check if the touch is inside the selected area
+ private bool isTouchedInsideSelectedArea = false;
+
+ // Current mode of operation
+ private Mode currentMode = Mode.None;
+
+ // Type of drawable object being interacted with
+ private DrawableType drawableType = DrawableType.None;
+
+ // Initial touch position
+ private Vector2 initialTouch = new Vector2(0, 0);
+
+ // Variables used during scaling operations
+ private float startScaleX;
+ private float startScaleY;
+ private float anchorX;
+ private float anchorY;
+
+ ///
+ /// Constructor for the selection tool.
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public SelectionTool(SelectionType selectionType)
+ {
+ Selection = selectionType;
+ }
+
+ ///
+ /// The type of selection operation. Default is move.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public SelectionType Selection { get; set; }
+
+
+ ///
+ /// Activate the selection tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Activate()
+ {
+ }
+
+ ///
+ /// Deactivate the selection tool.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void Deactivate()
+ {
+ currentMode = Mode.None;
+ EndDrawing(new Vector2(), 0);
+ }
+
+ ///
+ /// Handle input events from the touch.
+ ///
+ ///
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public override void HandleInput(Touch touch)
+ {
+ if (touch == null || touch.GetPointCount() == 0) return;
+
+ uint pointStateIndex = 0;
+ uint touchTime = touch.GetTime();
+
+ List touchPositionList = new List();
+ for (uint i = 0; i < touch.GetPointCount(); ++i)
+ {
+ touchPositionList.Add(touch.GetLocalPosition(i));
+ }
+
+ Vector2 position = touchPositionList[(int)pointStateIndex];
+ switch (touch.GetState(pointStateIndex))
+ {
+ case PointStateType.Down:
+ StartDrawing(position, touchTime);
+ break;
+ case PointStateType.Motion:
+ ContinueDrawing(position, touchTime);
+ break;
+ case PointStateType.Up:
+ case PointStateType.Leave:
+ EndDrawing(position, touchTime);
+ break;
+ }
+ }
+
+ // Start drawing the selection area or interacting with the selected drawables.
+ private void StartDrawing(Vector2 position, uint touchTime)
+ {
+ initialTouch = new Vector2(position.X, position.Y);
+ isTouchedInsideSelectedArea = PenWave.Instance.InsideSelectedArea(position.X, position.Y);
+ if (!isTouchedInsideSelectedArea)
+ {
+ PenWave.Instance.DropSelectedDrawables();
+ drawableType = (DrawableType)PenWave.Instance.SelectDrawable(position.X, position.Y);
+ }
+ else
+ {
+ if (Selection == SelectionType.Rotate)
+ {
+ PenWave.Instance.StartRotating(position.X, position.Y);
+ }
+ else if (Selection == SelectionType.Scale)
+ {
+ float topLeftX = 0, topLeftY = 0, widthSelection = 0, heightSelection = 0;
+ PenWave.Instance.GetSelectionDimensions(ref topLeftX, ref topLeftY, ref widthSelection, ref heightSelection);
+ if (!Double.IsNaN(topLeftX))
+ {
+ PenWave.Instance.StartSelectionScale(
+ initialTouch.X >= topLeftX+widthSelection*0.5f,
+ initialTouch.X < topLeftX+widthSelection*0.5f,
+ initialTouch.Y >= topLeftY+heightSelection*0.5f,
+ initialTouch.Y < topLeftY+heightSelection*0.5f,
+ ref anchorX,
+ ref anchorY
+ );
+
+ currentMode = Mode.Scale;
+ }
+ startScaleX = initialTouch.X;
+ startScaleY = initialTouch.Y;
+ }
+ }
+ NotifyActionStarted();
+ }
+
+ // Continue drawing the selection area or interacting with the selected drawables.
+ private void ContinueDrawing(Vector2 position, uint touchTime)
+ {
+ if (drawableType == DrawableType.None)
+ {
+ if (currentMode == Mode.None)
+ {
+ PenWave.Instance.StartSelectingArea(position.X, position.Y);
+ }
+ PenWave.Instance.ResizeSelectedArea(position.X, position.Y);
+ currentMode = Mode.Resize;
+ }
+ else if (currentMode != Mode.Resize && drawableType != DrawableType.None)
+ {
+ if (Selection == SelectionType.Move)
+ {
+ PenWave.Instance.DragSelectedDrawables(position.X, position.Y);
+ currentMode = Mode.Move;
+ }
+ else if (Selection == SelectionType.Rotate)
+ {
+ PenWave.Instance.RotateSelected(position.X, position.Y);
+ currentMode = Mode.Rotate;
+ }
+ else if (Selection == SelectionType.Scale)
+ {
+ PenWave.Instance.ScaleSelection(
+ (position.X-anchorX)/(startScaleX-anchorX),
+ (position.Y-anchorY)/(startScaleY-anchorY)
+ );
+ currentMode = Mode.Scale;
+ }
+ }
+ }
+
+ // End drawing the selection area or interacting with the selected drawables.
+ private void EndDrawing(Vector2 position, uint touchTime)
+ {
+ switch (currentMode)
+ {
+ case Mode.Move :
+ PenWave.Instance.EndDraging();
+ break;
+ case Mode.Resize :
+ drawableType = (DrawableType)PenWave.Instance.SelectDrawables();
+ break;
+ case Mode.Rotate :
+ PenWave.Instance.EndRotating(position.X, position.Y);
+ break;
+ case Mode.Scale :
+ PenWave.Instance.EndRotating(position.X, position.Y);
+ PenWave.Instance.EndSelectionScale(
+ (position.X-anchorX)/(startScaleX-anchorX),
+ (position.Y-anchorY)/(startScaleY-anchorY)
+ );
+ break;
+ default :
+ PenWave.Instance.DropSelectedDrawables();
+ break;
+ }
+ isTouchedInsideSelectedArea = false;
+ currentMode = Mode.None;
+ NotifyActionFinished();
+ }
+
+ }
+}
+
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/Toolbase.cs b/src/Tizen.NUI.PenWave/src/public/Tools/Toolbase.cs
new file mode 100644
index 00000000000..e6bca257bc8
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/Toolbase.cs
@@ -0,0 +1,78 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The base class for all tools in the PenWave.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract class ToolBase
+ {
+ ///
+ /// Events that are triggered when the tool starts an action.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler ActionStarted;
+
+ ///
+ /// Events that are triggered when the tool finishes an action.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler ActionFinished;
+
+ ///
+ /// Handles input events such as touch events and updates the state of the tool accordingly.
+ ///
+ /// The touch event data.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract void HandleInput(Touch touch);
+
+ ///
+ /// Activates the tool, making it ready to receive input and perform its functionality.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract void Activate();
+
+ ///
+ /// Deactivates the tool, stopping it from receiving input and performing its functionality.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public abstract void Deactivate();
+
+ ///
+ /// Notifies that the tool has started an action.
+ ///
+ protected void NotifyActionStarted()
+ {
+ ActionStarted?.Invoke(this, EventArgs.Empty);
+ }
+
+ ///
+ /// Notifies that the tool has finished an action.
+ ///
+ protected void NotifyActionFinished()
+ {
+ ActionFinished?.Invoke(this, EventArgs.Empty);
+ }
+
+ }
+}
+
diff --git a/src/Tizen.NUI.PenWave/src/public/Tools/UnRedoManager.cs b/src/Tizen.NUI.PenWave/src/public/Tools/UnRedoManager.cs
new file mode 100644
index 00000000000..02603d7c4bd
--- /dev/null
+++ b/src/Tizen.NUI.PenWave/src/public/Tools/UnRedoManager.cs
@@ -0,0 +1,85 @@
+/*
+ * Copyright(c) 2024 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+
+namespace Tizen.NUI.PenWave
+{
+ ///
+ /// The UnRedoManager class manages undo and redo operations for commands.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal class UnRedoManager
+ {
+ // Stacks to store undo and redo commands
+ private uint undoStack = 0;
+ private uint redoStack = 0;
+
+ ///
+ /// Executes a command and clears the redo stack.
+ ///
+ /// The command to be executed.
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal void RegisterUndo()
+ {
+ undoStack++; // Push command to undo stack
+ redoStack = 0; // Clear redo stack after executing a new command
+ }
+
+ ///
+ /// Undoes the last executed command and pushes it to the redo stack.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal void Undo()
+ {
+ if (undoStack > 0)
+ {
+ undoStack--; // Pop command from undo stack
+ PenWave.Instance.Undo();
+ redoStack++; // Push command to redo stack
+ }
+ }
+
+ ///
+ /// Redoes the last undone command and pushes it to the undo stack.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal void Redo()
+ {
+ if (redoStack > 0)
+ {
+ redoStack--; // Pop command from redo stack
+ PenWave.Instance.Redo();
+ undoStack++; // Push command to undo stack
+ }
+ }
+
+ ///
+ /// Determines whether an undo operation is possible.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal bool CanUndo => undoStack > 0;
+
+ ///
+ /// Determines whether a redo operation is possible.
+ ///
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal bool CanRedo => redoStack > 0;
+ }
+}
diff --git a/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.csproj b/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.csproj
new file mode 100644
index 00000000000..ed2cbf0e29f
--- /dev/null
+++ b/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.csproj
@@ -0,0 +1,42 @@
+
+
+ Exe
+ net6.0
+ PenWaveSample
+
+
+
+ portable
+
+
+ None
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+
+
diff --git a/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.sln b/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.sln
new file mode 100755
index 00000000000..fb060bf6767
--- /dev/null
+++ b/test/Tizen.NUI.PenWave.Sample/Tizen.NUI.PenWave.Sample.sln
@@ -0,0 +1,97 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.33214.272
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI.PenWave.Sample", "Tizen.NUI.PenWave.Sample.csproj", "{3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen", "..\..\src\Tizen\Tizen.csproj", "{F4ADAF15-01AA-477E-A85A-BEB297E6B07E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.Common", "..\..\src\Tizen.Applications.Common\Tizen.Applications.Common.csproj", "{0B96B17C-DACA-4745-88B1-6CFC1825A510}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.ComponentBased", "..\..\src\Tizen.Applications.ComponentBased\Tizen.Applications.ComponentBased.csproj", "{E117D074-C23D-41FD-A77D-2E9E6FF85676}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Applications.ThemeManager", "..\..\src\Tizen.Applications.ThemeManager\Tizen.Applications.ThemeManager.csproj", "{FB8B42D6-76CC-4836-8A80-58A816C6A17F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.System.SystemSettings", "..\..\src\Tizen.System.SystemSettings\Tizen.System.SystemSettings.csproj", "{EC28F259-C790-4FA3-A834-00795E2A7E2F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.System.Information", "..\..\src\Tizen.System.Information\Tizen.System.Information.csproj", "{02BEE3AD-99A6-44A5-89FC-D9F4132D9ECE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.System.Feedback", "..\..\src\Tizen.System.Feedback\Tizen.System.Feedback.csproj", "{D422D03E-7E32-4230-8306-B16DFE27E95A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Tracer", "..\..\src\Tizen.Tracer\Tizen.Tracer.csproj", "{A0AA9346-2025-4803-A168-3B39A367BB92}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.Log", "..\..\src\Tizen.Log\Tizen.Log.csproj", "{1E8250DB-92C3-44A5-8D57-3CFDE0C0021D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI", "..\..\src\Tizen.NUI\Tizen.NUI.csproj", "{29B426DA-FFDE-49D2-BD73-FE155F9502E8}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI.Components", "..\..\src\Tizen.NUI.Components\Tizen.NUI.Components.csproj", "{2A669CBF-DFA8-4EA3-852D-3137493DE884}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tizen.NUI.PenWave", "..\..\src\Tizen.NUI.PenWave\Tizen.NUI.PenWave.csproj", "{C5BFC65A-91D1-424E-BEC4-4A40329DA185}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3C6CE4CE-9D35-42C9-B23D-BBFFA96B3955}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4ADAF15-01AA-477E-A85A-BEB297E6B07E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4ADAF15-01AA-477E-A85A-BEB297E6B07E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4ADAF15-01AA-477E-A85A-BEB297E6B07E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4ADAF15-01AA-477E-A85A-BEB297E6B07E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0B96B17C-DACA-4745-88B1-6CFC1825A510}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0B96B17C-DACA-4745-88B1-6CFC1825A510}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0B96B17C-DACA-4745-88B1-6CFC1825A510}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0B96B17C-DACA-4745-88B1-6CFC1825A510}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E117D074-C23D-41FD-A77D-2E9E6FF85676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E117D074-C23D-41FD-A77D-2E9E6FF85676}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E117D074-C23D-41FD-A77D-2E9E6FF85676}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E117D074-C23D-41FD-A77D-2E9E6FF85676}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FB8B42D6-76CC-4836-8A80-58A816C6A17F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FB8B42D6-76CC-4836-8A80-58A816C6A17F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FB8B42D6-76CC-4836-8A80-58A816C6A17F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FB8B42D6-76CC-4836-8A80-58A816C6A17F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EC28F259-C790-4FA3-A834-00795E2A7E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {EC28F259-C790-4FA3-A834-00795E2A7E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EC28F259-C790-4FA3-A834-00795E2A7E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {EC28F259-C790-4FA3-A834-00795E2A7E2F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02BEE3AD-99A6-44A5-89FC-D9F4132D9ECE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {02BEE3AD-99A6-44A5-89FC-D9F4132D9ECE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02BEE3AD-99A6-44A5-89FC-D9F4132D9ECE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {02BEE3AD-99A6-44A5-89FC-D9F4132D9ECE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D422D03E-7E32-4230-8306-B16DFE27E95A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D422D03E-7E32-4230-8306-B16DFE27E95A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D422D03E-7E32-4230-8306-B16DFE27E95A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D422D03E-7E32-4230-8306-B16DFE27E95A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0AA9346-2025-4803-A168-3B39A367BB92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A0AA9346-2025-4803-A168-3B39A367BB92}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0AA9346-2025-4803-A168-3B39A367BB92}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A0AA9346-2025-4803-A168-3B39A367BB92}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E8250DB-92C3-44A5-8D57-3CFDE0C0021D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1E8250DB-92C3-44A5-8D57-3CFDE0C0021D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E8250DB-92C3-44A5-8D57-3CFDE0C0021D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1E8250DB-92C3-44A5-8D57-3CFDE0C0021D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {29B426DA-FFDE-49D2-BD73-FE155F9502E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {29B426DA-FFDE-49D2-BD73-FE155F9502E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {29B426DA-FFDE-49D2-BD73-FE155F9502E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {29B426DA-FFDE-49D2-BD73-FE155F9502E8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2A669CBF-DFA8-4EA3-852D-3137493DE884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2A669CBF-DFA8-4EA3-852D-3137493DE884}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2A669CBF-DFA8-4EA3-852D-3137493DE884}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2A669CBF-DFA8-4EA3-852D-3137493DE884}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C5BFC65A-91D1-424E-BEC4-4A40329DA185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C5BFC65A-91D1-424E-BEC4-4A40329DA185}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C5BFC65A-91D1-424E-BEC4-4A40329DA185}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C5BFC65A-91D1-424E-BEC4-4A40329DA185}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {355D568D-D02A-490A-A6AC-FD6C7D97457A}
+ EndGlobalSection
+EndGlobal
diff --git a/test/Tizen.NUI.PenWave.Sample/res/images/icon_picture.png b/test/Tizen.NUI.PenWave.Sample/res/images/icon_picture.png
new file mode 100644
index 00000000000..8f2e04299a6
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/res/images/icon_picture.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/res/images/pictures/venus.png b/test/Tizen.NUI.PenWave.Sample/res/images/pictures/venus.png
new file mode 100644
index 00000000000..6c668c8fb70
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/res/images/pictures/venus.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/shared/res/Tizen.NUI.PenWave.Sample.png b/test/Tizen.NUI.PenWave.Sample/shared/res/Tizen.NUI.PenWave.Sample.png
new file mode 100644
index 00000000000..ef30093cdca
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/shared/res/Tizen.NUI.PenWave.Sample.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/src/PenWaveSample.cs b/test/Tizen.NUI.PenWave.Sample/src/PenWaveSample.cs
new file mode 100644
index 00000000000..f47aec960e3
--- /dev/null
+++ b/test/Tizen.NUI.PenWave.Sample/src/PenWaveSample.cs
@@ -0,0 +1,233 @@
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Linq;
+using System.IO;
+
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Components;
+using Tizen.NUI.PenWave;
+
+namespace PenWaveSample
+{
+ class Program : NUIApplication
+ {
+ public static Program app;
+ private Window mWindow;
+ private PenWaveToolPicker mToolPickerView;
+ private PenWaveCanvas canvasView;
+ private ImageView thumbnailView;
+
+ public class TestTool : ToolBase
+ {
+ public override void Activate()
+ {
+ }
+
+ public override void Deactivate()
+ {
+ }
+
+ public override void HandleInput(Touch touch)
+ {
+ NotifyActionFinished();
+ }
+ }
+
+ public Program(ThemeOptions option, WindowData windowData) : base(option, windowData)
+ {
+
+ }
+
+ protected override void OnCreate()
+ {
+ base.OnCreate();
+ InitializeView();
+ }
+
+ private void ToolPicker()
+ {
+ mToolPickerView = new PenWaveToolPicker(canvasView);
+
+ mToolPickerView.AddButtonToPickerView(Tizen.Applications.Application.Current.DirectoryInfo.Resource + "images/icon_picture.png", () =>
+ {
+ var picker = new View
+ {
+ Layout = new LinearLayout
+ {
+ LinearOrientation = LinearLayout.Orientation.Horizontal
+ }
+ };
+ for (int i=0; i<2; i++)
+ {
+ var button = new Button()
+ {
+ Text = "test_"+i.ToString(),
+ };
+ button.Clicked += (o, e) =>
+ {
+ canvasView.AddPicture(Tizen.Applications.Application.Current.DirectoryInfo.Resource+"images/pictures/venus.png", new Size2D(500, 500), new Position2D(100, 200));
+ };
+ picker.Add(button);
+ }
+ mToolPickerView.AddViewToPopupView(picker);
+ mToolPickerView.ShowPopupView();
+ });
+
+ mToolPickerView.AddButtonToPickerView(Tizen.Applications.Application.Current.DirectoryInfo.Resource + "images/icon_picture.png", () =>
+ {
+ canvasView.TakeScreenShot("/home/puro/workspace/submit/TizenFX/test/Tizen.NUI.PenWave.Sample/screenshot.png", 0, 0, 1920, 1080, OnThumbnails);
+ });
+ }
+
+ private void OnThumbnails(object sender, EventArgs e)
+ {
+ Tizen.Log.Error("NUI", $"OnThumbnails\n");
+ string source = "/home/puro/workspace/submit/TizenFX/test/Tizen.NUI.PenWave.Sample/screenshot.png";
+ string destination = "/home/puro/workspace/submit/TizenFX/test/Tizen.NUI.PenWave.Sample/screenshot_copy.png";
+ File.Copy(source, destination, true);
+ thumbnailView.ResourceUrl = destination;
+ thumbnailView.Size2D = new Size2D(300, 300);
+ }
+
+ private void Buttons()
+ {
+
+ canvasView.AddPicture(Tizen.Applications.Application.Current.DirectoryInfo.Resource+"images/pictures/venus.png", new Size2D(500, 500), new Position2D(100, 100));
+ canvasView.CurrentTool = new PencilTool(PencilTool.BrushType.DashedLine, Color.Blue, 10);
+ var view = new View()
+ {
+ WidthResizePolicy = ResizePolicyType.FillToParent,
+ HeightResizePolicy = ResizePolicyType.FillToParent,
+ Layout = new LinearLayout()
+ {
+ LinearOrientation = LinearLayout.Orientation.Vertical,
+ },
+ };
+ canvasView.Add(view);
+ var button = new Button()
+ {
+ Text = "Eraser"
+ };
+ button.Clicked += (o, e) => {
+ canvasView.CurrentTool = new EraserTool(EraserTool.EraserType.Partial, 20);
+ };
+ view.Add(button);
+
+ var button2 = new Button()
+ {
+ Text = "Move"
+ };
+ button2.Clicked += (o, e) => {
+ canvasView.CurrentTool = new SelectionTool(SelectionTool.SelectionType.Move);
+ };
+ view.Add(button2);
+
+ var button3 = new Button()
+ {
+ Text = "Scale"
+ };
+ button3.Clicked += (o, e) => {
+ canvasView.CurrentTool = new SelectionTool(SelectionTool.SelectionType.Scale);
+ };
+ view.Add(button3);
+
+ var Undo = new Button()
+ {
+ Text = "Undo"
+ };
+
+ var Redo = new Button()
+ {
+ Text = "Redo"
+ };
+
+ Undo.IsEnabled = canvasView.CanUndo;
+ Undo.Clicked += (o, e) => {
+ canvasView.Undo();
+ Redo.IsEnabled = canvasView.CanRedo;
+ Undo.IsEnabled = canvasView.CanUndo;
+ };
+ view.Add(Undo);
+
+ Redo.IsEnabled = canvasView.CanRedo;
+ Redo.Clicked += (o, e) => {
+ canvasView.Redo();
+ Undo.IsEnabled = canvasView.CanUndo;
+ Redo.IsEnabled = canvasView.CanRedo;
+ };
+ view.Add(Redo);
+
+
+ var Save = new Button()
+ {
+ Text = "Save"
+ };
+ Save.Clicked += (o, e) => {
+ canvasView.SaveCanvas("/home/puro/workspace/submit/TizenFX/test/Tizen.NUI.PenWave.Sample/savecanvas.txt");
+ };
+ view.Add(Save);
+
+ var Load = new Button()
+ {
+ Text = "Load"
+ };
+ Load.Clicked += (o, e) => {
+ canvasView.LoadCanvas("/home/puro/workspace/submit/TizenFX/test/Tizen.NUI.PenWave.Sample/savecanvas.txt");
+ };
+ view.Add(Load);
+
+
+
+ var Clear = new Button()
+ {
+ Text = "Clear"
+ };
+ Clear.Clicked += (o, e) => {
+ canvasView.ClearCanvas();
+ };
+ view.Add(Clear);
+
+
+ canvasView.ToggleGrid(GridDensityType.Small);
+ canvasView.SetCanvasColor(Color.AquaMarine);
+ }
+
+ private void InitializeView()
+ {
+ mWindow = GetDefaultWindow();
+ mWindow.BackgroundColor = Color.White;
+ canvasView = new PenWaveCanvas();
+ mWindow.Add(canvasView);
+
+
+ canvasView.TouchEvent += OnTouchEvent;
+ thumbnailView = new ImageView();
+ canvasView.Add(thumbnailView);
+
+ ToolPicker();
+
+ // Buttons();
+
+ }
+
+
+ private bool OnTouchEvent(object sender, View.TouchEventArgs args)
+ {
+ canvasView.HandleInput(args.Touch);
+ return false;
+ }
+
+
+ static void Main(string[] args)
+ {
+ WindowData newWindowData = new WindowData();
+ newWindowData.FrontBufferRendering = true;
+ newWindowData.WindowMode = WindowMode.Opaque;
+ app = new Program(ThemeOptions.None, newWindowData);
+ app.Run(args);
+ app.Dispose();
+ }
+ }
+}
diff --git a/test/Tizen.NUI.PenWave.Sample/tizen-manifest.xml b/test/Tizen.NUI.PenWave.Sample/tizen-manifest.xml
new file mode 100755
index 00000000000..69311db5543
--- /dev/null
+++ b/test/Tizen.NUI.PenWave.Sample/tizen-manifest.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Tizen.NUI.PenWave.Sample.png
+
+
+
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/2f6b85a4-af3f-499f-b246-4977ffa9e82a.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/2f6b85a4-af3f-499f-b246-4977ffa9e82a.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/2f6b85a4-af3f-499f-b246-4977ffa9e82a.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/415a22d6-aaf8-41b0-9255-fb4ece7e2ae9.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/415a22d6-aaf8-41b0-9255-fb4ece7e2ae9.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/415a22d6-aaf8-41b0-9255-fb4ece7e2ae9.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7175d419-b55a-4f39-a366-fb1d21513816.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7175d419-b55a-4f39-a366-fb1d21513816.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7175d419-b55a-4f39-a366-fb1d21513816.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7463530e-1798-4c45-a6ea-4fbf296d6737.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7463530e-1798-4c45-a6ea-4fbf296d6737.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/7463530e-1798-4c45-a6ea-4fbf296d6737.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/965b17c3-5398-4315-8210-8d1300849050.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/965b17c3-5398-4315-8210-8d1300849050.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/965b17c3-5398-4315-8210-8d1300849050.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/9887a5e3-0e30-4562-b1e9-1b24e6df593c.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/9887a5e3-0e30-4562-b1e9-1b24e6df593c.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/9887a5e3-0e30-4562-b1e9-1b24e6df593c.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/a1192eb1-9e6d-4a3c-8018-bcfd903ee8ca.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/a1192eb1-9e6d-4a3c-8018-bcfd903ee8ca.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/a1192eb1-9e6d-4a3c-8018-bcfd903ee8ca.png differ
diff --git a/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/b053d936-b242-4096-9fa1-13020001a1c1.png b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/b053d936-b242-4096-9fa1-13020001a1c1.png
new file mode 100644
index 00000000000..6148b7b08cd
Binary files /dev/null and b/test/Tizen.NUI.PenWave.Sample/tmp/thumbnails/b053d936-b242-4096-9fa1-13020001a1c1.png differ