127 lines
4.4 KiB
C#
127 lines
4.4 KiB
C#
/*
|
|
* libcaca .NET bindings for libcaca
|
|
* Copyright (c) 2006 Jean-Yves Lamoureux <jylam@lnxscene.org>
|
|
* 2007 Sam Hocevar <sam@hocevar.net>
|
|
* All Rights Reserved
|
|
*
|
|
* 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://www.wtfpl.net/ for more details.
|
|
*/
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Security;
|
|
using System.Drawing;
|
|
|
|
namespace Caca
|
|
{
|
|
public class Font : IDisposable
|
|
{
|
|
private IntPtr _font;
|
|
private GCHandle _gch;
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern IntPtr caca_load_font(IntPtr data, uint len);
|
|
public Font(string s)
|
|
{
|
|
IntPtr name = Marshal.StringToHGlobalAnsi(s);
|
|
_font = caca_load_font(name, 0);
|
|
Marshal.FreeHGlobal(name);
|
|
}
|
|
|
|
public Font(byte[] buf)
|
|
{
|
|
GCHandle _gch = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
|
_font = caca_load_font(_gch.AddrOfPinnedObject(),
|
|
(uint)buf.Length);
|
|
}
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern int caca_free_font(IntPtr d);
|
|
public void Dispose()
|
|
{
|
|
caca_free_font(_font);
|
|
_gch.Free();
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern IntPtr caca_get_font_list();
|
|
public static string[] getList()
|
|
{
|
|
IntPtr l = caca_get_font_list();
|
|
|
|
int size;
|
|
for(size = 0; true; size++)
|
|
if(Marshal.ReadIntPtr(l, IntPtr.Size * size) == IntPtr.Zero)
|
|
break;
|
|
|
|
string[] ret = new string[size];
|
|
for(int i = 0; i < size; i++)
|
|
{
|
|
IntPtr s = Marshal.ReadIntPtr(l, IntPtr.Size * i);
|
|
ret[i] = Marshal.PtrToStringAnsi(s);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern int caca_get_font_width(IntPtr font);
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern int caca_get_font_height(IntPtr font);
|
|
public Size Size
|
|
{
|
|
get { return new Size(caca_get_font_width(_font),
|
|
caca_get_font_height(_font)); }
|
|
}
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern IntPtr caca_get_font_blocks(IntPtr font);
|
|
public int[,] getBlocks()
|
|
{
|
|
IntPtr l = caca_get_font_blocks(_font);
|
|
|
|
int size;
|
|
for(size = 1; true; size += 2)
|
|
if(Marshal.ReadIntPtr(l, IntPtr.Size * size) == IntPtr.Zero)
|
|
break;
|
|
|
|
int[,] ret = new int[size,2];
|
|
for(int i = 0; i < size; i++)
|
|
{
|
|
ret[i,0] = (int)Marshal.ReadIntPtr(l, IntPtr.Size * i * 2);
|
|
ret[i,1] = (int)Marshal.ReadIntPtr(l, IntPtr.Size * i * 2 + 1);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
[DllImport("libcaca.dll", CallingConvention=CallingConvention.Cdecl),
|
|
SuppressUnmanagedCodeSecurity]
|
|
private static extern int caca_render_canvas(IntPtr cv, IntPtr f,
|
|
IntPtr buf, int w, int h,
|
|
int pitch);
|
|
public int Render(Canvas cv, uint[,] buf, int pitch)
|
|
{
|
|
GCHandle gch = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
|
int ret = caca_render_canvas(cv._c_cv, _font,
|
|
gch.AddrOfPinnedObject(),
|
|
buf.GetLength(0), buf.GetLength(1),
|
|
pitch);
|
|
gch.Free();
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
|