git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2873 92316355-f0b4-4df1-b90c-862c8a59935fremotes/tiles
@@ -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; | |||
} | |||
} | |||
@@ -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(); | |||
} | |||
@@ -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; | |||
} | |||
} | |||
} | |||