Przeglądaj źródła

ThePimp: make image loading more robust.

git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2926 92316355-f0b4-4df1-b90c-862c8a59935f
remotes/tiles
sam 16 lat temu
rodzic
commit
86b21a46ad
14 zmienionych plików z 294 dodań i 51 usunięć
  1. +33
    -0
      ThePimp/ErrorWindow.cs
  2. +3
    -0
      ThePimp/Main.cs
  3. +32
    -17
      ThePimp/MainWindow.cs
  4. +2
    -0
      ThePimp/Makefile.am
  5. +2
    -3
      ThePimp/NewFile.cs
  6. +4
    -4
      ThePimp/OpenFile.cs
  7. +12
    -4
      ThePimp/ThePimp.csproj
  8. +2
    -1
      ThePimp/ThePimp.mdp
  9. +89
    -0
      ThePimp/gtk-gui/ThePimp.ErrorWindow.cs
  10. +79
    -0
      ThePimp/gtk-gui/gui.stetic
  11. +13
    -13
      libpipi.sln
  12. +21
    -7
      pipi-sharp/Picture.cs
  13. +1
    -1
      pipi-sharp/pipi-sharp.csproj
  14. +1
    -1
      pipi-sharp/test.cs

+ 33
- 0
ThePimp/ErrorWindow.cs Wyświetl plik

@@ -0,0 +1,33 @@
//
// The Pimp The Pathetic Image Manipulation Program
// Copyright (c) 2004-2008 Sam Hocevar <sam@zoy.org>
// All Rights Reserved
//
// $Id$
//
// This library is free software. It comes without any warranty, to
// the extent permitted by applicable law. You can redistribute it
// and/or modify it under the terms of the Do What The Fuck You Want
// To Public License, Version 2, as published by Sam Hocevar. See
// http://sam.zoy.org/wtfpl/COPYING for more details.
//

using System;

namespace ThePimp
{
public partial class ErrorWindow : Gtk.Dialog
{
public ErrorWindow(string message)
{
this.Build();
this.message.Text = message;
this.Run();
}

protected virtual void OnButtonOkClicked (object sender, System.EventArgs e)
{
this.Destroy();
}
}
}

+ 3
- 0
ThePimp/Main.cs Wyświetl plik

@@ -14,6 +14,7 @@

using System;
using Gtk;
using Pipi;

namespace ThePimp
{
@@ -21,6 +22,8 @@ namespace ThePimp
{
public static void Main (string[] args)
{
Libpipi.getVersion();

Application.Init ();
MainWindow win = new MainWindow ();
win.Show ();


+ 32
- 17
ThePimp/MainWindow.cs Wyświetl plik

@@ -24,7 +24,6 @@ namespace ThePimp
public MainWindow (): base (Gtk.WindowType.Toplevel)
{
Build ();
Title += " v" + Libpipi.getVersion();
vpaned1.Add1(new ToolBox());
}

@@ -36,32 +35,48 @@ namespace ThePimp

protected virtual void OnOpenActionActivated (object sender, System.EventArgs e)
{
OpenFile open = new OpenFile();
Pipi.Picture p = open.Load();
open.Destroy();
if(p != null)
OpenFile dialog = new OpenFile();

string s = dialog.GetChoice();
dialog.Destroy();
if(s == null)
return;

Pipi.Picture p = Pipi.Picture.Load(s);
if(p == null)
{
while(notebook1.NPages > 0)
notebook1.RemovePage(0);
int n = notebook1.AppendPage(new PictureView(p),
new Label(p.FileName));
notebook1.Page = n;
new ErrorWindow("Could not open \"" + s + "\". Check the file format.");
return;
}

while(notebook1.NPages > 0)
notebook1.RemovePage(0);
int n = notebook1.AppendPage(new PictureView(p),
new Label(p.FileName));
notebook1.Page = n;
}

protected virtual void OnNewActionActivated (object sender, System.EventArgs e)
{
NewFile dialog = new NewFile();
Pipi.Picture p = dialog.New();

string s = dialog.GetChoice();
dialog.Destroy();
if(p != null)
if(s == null)
return;

Pipi.Picture p = Pipi.Picture.Load(s);
if(p == null)
{
while(notebook1.NPages > 0)
notebook1.RemovePage(0);
int n = notebook1.AppendPage(new PictureView(p),
new Label(p.FileName));
notebook1.Page = n;
new ErrorWindow("Could not create image.");
return;
}

while(notebook1.NPages > 0)
notebook1.RemovePage(0);
int n = notebook1.AppendPage(new PictureView(p),
new Label(p.FileName));
notebook1.Page = n;
}

protected virtual void OnQuitActionActivated (object sender, System.EventArgs e)


+ 2
- 0
ThePimp/Makefile.am Wyświetl plik

@@ -4,6 +4,7 @@ pimp_sources = \
AssemblyInfo.cs \
Main.cs \
AboutWindow.cs \
ErrorWindow.cs \
MainWindow.cs \
OpenFile.cs \
NewFile.cs \
@@ -12,6 +13,7 @@ pimp_sources = \
ToolBox.cs \
gtk-gui/generated.cs \
gtk-gui/ThePimp.AboutWindow.cs \
gtk-gui/ThePimp.ErrorWindow.cs \
gtk-gui/ThePimp.MainWindow.cs \
gtk-gui/ThePimp.OpenFile.cs \
gtk-gui/ThePimp.NewFile.cs \


+ 2
- 3
ThePimp/NewFile.cs Wyświetl plik

@@ -24,7 +24,7 @@ namespace ThePimp
this.Build();
}

public Pipi.Picture New()
public string GetChoice()
{
ResponseType rsp = (ResponseType)Run();
Hide();
@@ -42,8 +42,7 @@ namespace ThePimp
break;
}

Pipi.Picture p = new Pipi.Picture(type + ":" + entry1.Text + "x" + entry2.Text);
return p;
return type + ":" + entry1.Text + "x" + entry2.Text;
}
}
}

+ 4
- 4
ThePimp/OpenFile.cs Wyświetl plik

@@ -23,15 +23,15 @@ namespace ThePimp
{
this.Build();
}
public Pipi.Picture Load()
public string GetChoice()
{
ResponseType rsp = (ResponseType)Run();
Hide();
if(rsp != ResponseType.Ok)
return null;
Pipi.Picture p = new Pipi.Picture(filechooserwidget1.Filename);
return p;
return filechooserwidget1.Filename;
}
}
}

+ 12
- 4
ThePimp/ThePimp.csproj Wyświetl plik

@@ -14,7 +14,7 @@
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>.\bin</OutputPath>
<OutputPath>bin\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@@ -27,7 +27,7 @@
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>.\bin</OutputPath>
<OutputPath>bin\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
@@ -92,6 +92,8 @@
<Compile Include="gtk-gui\ThePimp.PictureView.cs" />
<Compile Include="gtk-gui\ThePimp.SaveFile.cs" />
<Compile Include="gtk-gui\ThePimp.ToolBox.cs" />
<Compile Include="ErrorWindow.cs" />
<Compile Include="gtk-gui\ThePimp.ErrorWindow.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\pipi-sharp\pipi-sharp.csproj">
@@ -100,9 +102,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="gtk-gui\gui.stetic" />
<EmbeddedResource Include="images\about.png" />
<EmbeddedResource Include="gtk-gui\objects.xml" />
<EmbeddedResource Include="gtk-gui\gui.stetic" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
@@ -116,4 +118,10 @@
</Target>
<Target Name="AfterBuild">
</Target>
</Project>
<GtkDesignInfo gtkVersion="2.12.1">
<ExportedWidgets>
<Widget>ThePimp.PictureView</Widget>
<Widget>ThePimp.ToolBox</Widget>
</ExportedWidgets>
</GtkDesignInfo>
</Project>

+ 2
- 1
ThePimp/ThePimp.mdp Wyświetl plik

@@ -43,6 +43,7 @@
<File name="gtk-gui/ThePimp.AboutWindow.cs" subtype="Code" buildaction="Compile" />
<File name="NewFile.cs" subtype="Code" buildaction="Compile" />
<File name="gtk-gui/ThePimp.NewFile.cs" subtype="Code" buildaction="Compile" />
<File name="gtk-gui/ThePimp.ErrorWindow.cs" subtype="Code" buildaction="Compile" />
</Contents>
<References>
<ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
@@ -61,4 +62,4 @@
<Widget>ThePimp.ToolBox</Widget>
</ExportedWidgets>
</GtkDesignInfo>
</Project>
</Project>

+ 89
- 0
ThePimp/gtk-gui/ThePimp.ErrorWindow.cs Wyświetl plik

@@ -0,0 +1,89 @@
// ------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Mono Runtime Version: 2.0.50727.42
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
// ------------------------------------------------------------------------------

namespace ThePimp {
public partial class ErrorWindow {
private Gtk.HBox hbox1;
private Gtk.Image image1;
private Gtk.Label message;
private Gtk.Button buttonOk;
protected virtual void Build() {
Stetic.Gui.Initialize(this);
// Widget ThePimp.ErrorWindow
this.Name = "ThePimp.ErrorWindow";
this.Title = Mono.Unix.Catalog.GetString("Error");
this.Icon = Stetic.IconLoader.LoadIcon(this, "gtk-dialog-error", Gtk.IconSize.Menu, 16);
this.WindowPosition = ((Gtk.WindowPosition)(4));
this.HasSeparator = false;
// Internal child ThePimp.ErrorWindow.VBox
Gtk.VBox w1 = this.VBox;
w1.Name = "dialog1_VBox";
w1.BorderWidth = ((uint)(2));
// Container child dialog1_VBox.Gtk.Box+BoxChild
this.hbox1 = new Gtk.HBox();
this.hbox1.Name = "hbox1";
this.hbox1.Spacing = 20;
this.hbox1.BorderWidth = ((uint)(10));
// Container child hbox1.Gtk.Box+BoxChild
this.image1 = new Gtk.Image();
this.image1.Name = "image1";
this.image1.Pixbuf = Stetic.IconLoader.LoadIcon(this, "gtk-dialog-error", Gtk.IconSize.Dialog, 48);
this.hbox1.Add(this.image1);
Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(this.hbox1[this.image1]));
w2.Position = 0;
w2.Expand = false;
w2.Fill = false;
// Container child hbox1.Gtk.Box+BoxChild
this.message = new Gtk.Label();
this.message.Name = "message";
this.message.LabelProp = Mono.Unix.Catalog.GetString("Error!");
this.message.Wrap = true;
this.hbox1.Add(this.message);
Gtk.Box.BoxChild w3 = ((Gtk.Box.BoxChild)(this.hbox1[this.message]));
w3.Position = 1;
w3.Expand = false;
w1.Add(this.hbox1);
Gtk.Box.BoxChild w4 = ((Gtk.Box.BoxChild)(w1[this.hbox1]));
w4.Position = 0;
w4.Fill = false;
// Internal child ThePimp.ErrorWindow.ActionArea
Gtk.HButtonBox w5 = this.ActionArea;
w5.Name = "dialog1_ActionArea";
w5.Spacing = 6;
w5.BorderWidth = ((uint)(5));
w5.LayoutStyle = ((Gtk.ButtonBoxStyle)(4));
// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
this.buttonOk = new Gtk.Button();
this.buttonOk.CanDefault = true;
this.buttonOk.CanFocus = true;
this.buttonOk.Name = "buttonOk";
this.buttonOk.UseStock = true;
this.buttonOk.UseUnderline = true;
this.buttonOk.Label = "gtk-ok";
this.AddActionWidget(this.buttonOk, -5);
Gtk.ButtonBox.ButtonBoxChild w6 = ((Gtk.ButtonBox.ButtonBoxChild)(w5[this.buttonOk]));
w6.Expand = false;
w6.Fill = false;
if ((this.Child != null)) {
this.Child.ShowAll();
}
this.DefaultWidth = 229;
this.DefaultHeight = 133;
this.Show();
}
}
}

+ 79
- 0
ThePimp/gtk-gui/gui.stetic Wyświetl plik

@@ -797,6 +797,7 @@ Bayer Dithering Pattern</property>
<property name="Text" translatable="yes">1024</property>
<property name="IsEditable">True</property>
<property name="WidthChars">6</property>
<property name="InvisibleChar">●</property>
<property name="Xalign">1</property>
</widget>
<packing>
@@ -820,6 +821,7 @@ Bayer Dithering Pattern</property>
<property name="Text" translatable="yes">768</property>
<property name="IsEditable">True</property>
<property name="WidthChars">6</property>
<property name="InvisibleChar">●</property>
<property name="Xalign">1</property>
</widget>
<packing>
@@ -977,4 +979,81 @@ Bayer Dithering Pattern</property>
</widget>
</child>
</widget>
<widget class="Gtk.Dialog" id="ThePimp.ErrorWindow" design-size="229 133">
<property name="MemberName" />
<property name="Title" translatable="yes">Error</property>
<property name="Icon">stock:gtk-dialog-error Menu</property>
<property name="WindowPosition">CenterOnParent</property>
<property name="Buttons">1</property>
<property name="HelpButton">False</property>
<property name="HasSeparator">False</property>
<child internal-child="VBox">
<widget class="Gtk.VBox" id="dialog1_VBox">
<property name="MemberName" />
<property name="BorderWidth">2</property>
<child>
<widget class="Gtk.HBox" id="hbox1">
<property name="MemberName" />
<property name="Spacing">20</property>
<property name="BorderWidth">10</property>
<child>
<widget class="Gtk.Image" id="image1">
<property name="MemberName" />
<property name="Pixbuf">stock:gtk-dialog-error Dialog</property>
</widget>
<packing>
<property name="Position">0</property>
<property name="AutoSize">True</property>
<property name="Expand">False</property>
<property name="Fill">False</property>
</packing>
</child>
<child>
<widget class="Gtk.Label" id="message">
<property name="MemberName" />
<property name="LabelProp" translatable="yes">Error!</property>
<property name="Wrap">True</property>
</widget>
<packing>
<property name="Position">1</property>
<property name="AutoSize">False</property>
<property name="Expand">False</property>
</packing>
</child>
</widget>
<packing>
<property name="Position">0</property>
<property name="AutoSize">False</property>
<property name="Fill">False</property>
</packing>
</child>
</widget>
</child>
<child internal-child="ActionArea">
<widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
<property name="MemberName" />
<property name="Spacing">6</property>
<property name="BorderWidth">5</property>
<property name="Size">1</property>
<property name="LayoutStyle">End</property>
<child>
<widget class="Gtk.Button" id="buttonOk">
<property name="MemberName" />
<property name="CanDefault">True</property>
<property name="CanFocus">True</property>
<property name="UseStock">True</property>
<property name="Type">StockItem</property>
<property name="StockId">gtk-ok</property>
<property name="ResponseId">-5</property>
<property name="label">gtk-ok</property>
<signal name="Clicked" handler="OnButtonCloseClicked" />
</widget>
<packing>
<property name="Expand">False</property>
<property name="Fill">False</property>
</packing>
</child>
</widget>
</child>
</widget>
</stetic-interface>

+ 13
- 13
libpipi.sln Wyświetl plik

@@ -13,14 +13,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pipi-sharp", "pipi-sharp\pi
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThePimp", "ThePimp\ThePimp.csproj", "{D681A55E-B8E2-4741-87E6-49500109D6E0}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpipi", "pipi\libpipi.vcproj", "{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|Win32 = Debug|Win32
Release|Any CPU = Release|Any CPU
Release|Mixed Platforms = Release|Mixed Platforms
Release|Win32 = Release|Win32
EndGlobalSection
@@ -35,16 +33,6 @@ Global
{2A062F77-ED16-4B74-B7B7-5ED93FAF300A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{2A062F77-ED16-4B74-B7B7-5ED93FAF300A}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{2A062F77-ED16-4B74-B7B7-5ED93FAF300A}.Release|Win32.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Win32.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Any CPU.Build.0 = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Win32.ActiveCfg = Release|Any CPU
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
@@ -55,6 +43,16 @@ Global
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{D681A55E-B8E2-4741-87E6-49500109D6E0}.Release|Win32.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Debug|Win32.ActiveCfg = Debug|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Any CPU.Build.0 = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{FD11AF71-DCBE-4861-9DC6-EE4C6FD951C0}.Release|Win32.ActiveCfg = Release|Any CPU
{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}.Debug|Any CPU.ActiveCfg = Debug|Win32
{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}.Debug|Mixed Platforms.Build.0 = Debug|Win32
@@ -66,6 +64,8 @@ Global
{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}.Release|Win32.ActiveCfg = Release|Win32
{48A34C3A-1E36-49B7-92C4-E982FDCB90C0}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection


+ 21
- 7
pipi-sharp/Picture.cs Wyświetl plik

@@ -21,16 +21,16 @@ namespace Pipi
public class Picture
{
private IntPtr _picture;
private string _filename;

public readonly string FileName;
public string FileName
{
get { return _filename; }
}

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
SuppressUnmanagedCodeSecurity]
private static extern IntPtr pipi_load(string s);
public Picture(string s)
private Picture(IntPtr p)
{
_picture = pipi_load(s);
FileName = s;
_picture = p;
}

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
@@ -41,6 +41,20 @@ namespace Pipi
pipi_free(_picture);
}

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
SuppressUnmanagedCodeSecurity]
private static extern IntPtr pipi_load(string s);
public static Picture Load(string s)
{
IntPtr p = pipi_load(s);
if(p == IntPtr.Zero)
return null;

Picture ret = new Picture(p);
ret._filename = s;
return ret;
}

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
SuppressUnmanagedCodeSecurity]
private static extern int pipi_save(IntPtr p, string s);


+ 1
- 1
pipi-sharp/pipi-sharp.csproj Wyświetl plik

@@ -55,4 +55,4 @@
</Target>
<Target Name="AfterBuild">
</Target>
</Project>
</Project>

+ 1
- 1
pipi-sharp/test.cs Wyświetl plik

@@ -24,7 +24,7 @@ class Test
Console.WriteLine("libpipi {0} .NET test", Libpipi.getVersion());
Console.WriteLine("(c) 2008 Sam Hocevar <sam@zoy.org>");

Pipi.Picture p = new Pipi.Picture("random:640x480");
Pipi.Picture p = Pipi.Picture.Load("random:640x480");
Console.WriteLine("Test picture size: {0}x{1}", p.Width, p.Height);
}
}


Ładowanie…
Anuluj
Zapisz