Bladeren bron

ThePimp: we can now open and display files.

git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2873 92316355-f0b4-4df1-b90c-862c8a59935f
remotes/tiles
sam 16 jaren geleden
bovenliggende
commit
d28c213149
3 gewijzigde bestanden met toevoegingen van 66 en 15 verwijderingen
  1. +5
    -6
      ThePimp/MainWindow.cs
  2. +17
    -9
      ThePimp/PictureView.cs
  3. +44
    -0
      pipi-sharp/Picture.cs

+ 5
- 6
ThePimp/MainWindow.cs Bestand weergeven

@@ -23,9 +23,6 @@ public partial class MainWindow: Gtk.Window
{
Build ();
Title += " v" + Libpipi.getVersion();

notebook1.Add(new PictureView(new Pipi.Picture("random:1024x1024")));
//scrolledwindow1.Add(new PictureView(new Pipi.Picture("random:1024x1024")));
}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
@@ -41,9 +38,11 @@ public partial class MainWindow: Gtk.Window
open.Destroy();
if(p != null)
{
Title += " image " + p.Width + "x" + p.Height;
notebook1.RemovePage(0);
notebook1.AppendPage(new PictureView(p), null);
while(notebook1.NPages > 0)
notebook1.RemovePage(0);
int n = notebook1.AppendPage(new PictureView(p),
new Label(p.FileName));
notebook1.Page = n;
}
}



+ 17
- 9
ThePimp/PictureView.cs Bestand weergeven

@@ -37,20 +37,28 @@ namespace ThePimp
protected override bool OnExposeEvent(Gdk.EventExpose e)
{
bool ret = base.OnExposeEvent(e);
//Console.WriteLine("expose {0}x{1}+{2}+{3}", e.Area.Width, e.Area.Height, e.Area.X, e.Area.Y);
GdkWindow.DrawLayout(Style.TextGC(StateType.Normal), 40 - (int)_hadj.Value, 40 - (int)_vadj.Value, _l);
GdkWindow.DrawLayout(Style.TextGC(StateType.Normal), 560 - (int)_hadj.Value, 40 - (int)_vadj.Value, _l);
GdkWindow.DrawLayout(Style.TextGC(StateType.Normal), 40 - (int)_hadj.Value, 560 - (int)_vadj.Value, _l);
GdkWindow.DrawLayout(Style.TextGC(StateType.Normal), 560 - (int)_hadj.Value, 560 - (int)_vadj.Value, _l);

using (Gdk.GC gc = new Gdk.GC(GdkWindow))
{
int w = e.Area.Width;
int h = e.Area.Height;
int x = (int)_hadj.Value + e.Area.X;
int y = (int)_vadj.Value + e.Area.Y;
if(x + w > _p.Width)
w = _p.Width - x < 0 ? 0 : _p.Width - x;
if(y + h > _p.Height)
h = _p.Height - y < 0 ? 0 : _p.Height - y;

byte[] a = _p.GetPixels(w, h, x, y);
GdkWindow.DrawRgb32Image(gc, e.Area.X, e.Area.Y, w, h,
0 /* no dithering */, a, w * 4);
}

return ret;
}

protected override void OnRealized()
{
_l = new Pango.Layout(PangoContext);
_l.Wrap = Pango.WrapMode.Word;
_l.FontDescription = Pango.FontDescription.FromString("Tahoma 64");
_l.SetMarkup("WHAT THE\nFUCK IS\nTHIS SHIT\nLOL ♥ ♥");
base.OnRealized();
}



+ 44
- 0
pipi-sharp/Picture.cs Bestand weergeven

@@ -22,12 +22,15 @@ namespace Pipi
{
private IntPtr _picture;

public readonly string FileName;

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

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
@@ -61,5 +64,46 @@ namespace Pipi
{
get { return pipi_get_image_height(_picture); }
}

[StructLayout(LayoutKind.Sequential)]
public struct PixelsStruct
{
public IntPtr pixels;
public Int32 w, h, pitch, bpp;
public Int64 bytes;
}

[DllImport("libpipi.dll", CallingConvention=CallingConvention.Cdecl),
SuppressUnmanagedCodeSecurity]
private static extern IntPtr pipi_getpixels(IntPtr img, int type);
public byte[] GetPixels(int w, int h, int x, int y)
{
byte[] array = new byte[w * h * 4];
IntPtr pixels = pipi_getpixels(_picture, 0);
PixelsStruct p;
Int64 address;

p = (PixelsStruct)Marshal.PtrToStructure(pixels,
typeof(PixelsStruct));
address = p.pixels.ToInt64();

unsafe
{
for(int j = 0; j < h; j++)
{
Marshal.Copy((IntPtr)(address + ((j + y) * p.w + x) * 4),
array, j * w * 4, w * 4);
for(int i = 0; i < w; i++)
{
byte c = array[j * w * 4 + i * 4];
array[j * w * 4 + i * 4] = array[j * w * 4 + i * 4 + 2];
array[j * w * 4 + i * 4 + 2] = c;
}
}
}

return array;
}
}
}


Laden…
Annuleren
Opslaan