// // libpipi Pathetic image processing interface library // Copyright (c) 2004-2008 Sam Hocevar // 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; using System.Runtime.InteropServices; using System.Security; namespace Pipi { public class Picture { private IntPtr _picture; private string _filename; public string FileName { get { return _filename; } } private Picture(IntPtr p) { _picture = p; } [DllImport("libpipi-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern int pipi_free(IntPtr img); ~Picture() { pipi_free(_picture); } [DllImport("libpipi-0.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-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern int pipi_save(IntPtr p, string s); public int Save(string s) { return pipi_save(_picture, s); } [DllImport("libpipi-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern int pipi_get_image_width(IntPtr img); public int Width { get { return pipi_get_image_width(_picture); } } [DllImport("libpipi-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern int pipi_get_image_height(IntPtr img); public int Height { 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-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern IntPtr pipi_get_pixels(IntPtr img, int type); [DllImport("libpipi-0.dll", CallingConvention=CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity] private static extern void pipi_release_pixels(IntPtr img, IntPtr p); public byte[] GetPixels(int w, int h, int x, int y) { byte[] array = new byte[w * h * 4]; IntPtr pixels = pipi_get_pixels(_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; } } } pipi_release_pixels(_picture, pixels); return array; } } }