cairo: Fix text API calls
The native functions require a NULL-terminated string of text encoded in UTF-8. This change is merged from Mono.Cairo in mono 3.2.
This commit is contained in:
parent
21ce761271
commit
796cd1e8a1
2 changed files with 44 additions and 7 deletions
|
@ -36,6 +36,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Text;
|
||||||
using Cairo;
|
using Cairo;
|
||||||
|
|
||||||
namespace Cairo {
|
namespace Cairo {
|
||||||
|
@ -833,20 +834,56 @@ namespace Cairo {
|
||||||
NativeMethods.cairo_show_page (handle);
|
NativeMethods.cairo_show_page (handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static byte[] TerminateUtf8(byte[] utf8)
|
||||||
|
{
|
||||||
|
if (utf8.Length > 0 && utf8[utf8.Length - 1] == 0)
|
||||||
|
return utf8;
|
||||||
|
var termedArray = new byte[utf8.Length + 1];
|
||||||
|
Array.Copy(utf8, termedArray, utf8.Length);
|
||||||
|
termedArray[utf8.Length] = 0;
|
||||||
|
return termedArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] TerminateUtf8(string s)
|
||||||
|
{
|
||||||
|
// compute the byte count including the trailing \0
|
||||||
|
var byteCount = Encoding.UTF8.GetMaxByteCount(s.Length + 1);
|
||||||
|
var bytes = new byte[byteCount];
|
||||||
|
Encoding.UTF8.GetBytes(s, 0, s.Length, bytes, 0);
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
public void ShowText (string str)
|
public void ShowText (string str)
|
||||||
{
|
{
|
||||||
NativeMethods.cairo_show_text (handle, str);
|
NativeMethods.cairo_show_text (handle, TerminateUtf8 (str));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowText (byte[] utf8)
|
||||||
|
{
|
||||||
|
NativeMethods.cairo_show_text (handle, TerminateUtf8 (utf8));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void TextPath (string str)
|
public void TextPath (string str)
|
||||||
{
|
{
|
||||||
NativeMethods.cairo_text_path (handle, str);
|
NativeMethods.cairo_text_path (handle, TerminateUtf8 (str));
|
||||||
}
|
}
|
||||||
|
|
||||||
public TextExtents TextExtents (string utf8)
|
public void TextPath (byte[] utf8)
|
||||||
|
{
|
||||||
|
NativeMethods.cairo_text_path (handle, TerminateUtf8 (utf8));
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextExtents TextExtents (string s)
|
||||||
{
|
{
|
||||||
TextExtents extents;
|
TextExtents extents;
|
||||||
NativeMethods.cairo_text_extents (handle, utf8, out extents);
|
NativeMethods.cairo_text_extents (handle, TerminateUtf8 (s), out extents);
|
||||||
|
return extents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextExtents TextExtents(byte[] utf8)
|
||||||
|
{
|
||||||
|
TextExtents extents;
|
||||||
|
NativeMethods.cairo_text_extents (handle, TerminateUtf8 (utf8), out extents);
|
||||||
return extents;
|
return extents;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -821,7 +821,7 @@ namespace Cairo
|
||||||
internal static extern void cairo_show_page (IntPtr cr);
|
internal static extern void cairo_show_page (IntPtr cr);
|
||||||
|
|
||||||
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
||||||
internal static extern void cairo_show_text (IntPtr cr, string utf8);
|
internal static extern void cairo_show_text (IntPtr cr, byte[] utf8);
|
||||||
|
|
||||||
//[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
//[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
||||||
//internal static extern void cairo_show_text_glyphs (IntPtr cr, IntPtr utf8, int utf8_len, IntPtr glyphs, int num_glyphs, IntPtr clusters, int num_clusters, ClusterFlags cluster_flags);
|
//internal static extern void cairo_show_text_glyphs (IntPtr cr, IntPtr utf8, int utf8_len, IntPtr glyphs, int num_glyphs, IntPtr clusters, int num_clusters, ClusterFlags cluster_flags);
|
||||||
|
@ -944,10 +944,10 @@ namespace Cairo
|
||||||
//internal static extern void cairo_text_cluster_free (IntPtr clusters);
|
//internal static extern void cairo_text_cluster_free (IntPtr clusters);
|
||||||
|
|
||||||
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
||||||
internal static extern void cairo_text_extents (IntPtr cr, string utf8, out TextExtents extents);
|
internal static extern void cairo_text_extents (IntPtr cr, byte[] utf8, out TextExtents extents);
|
||||||
|
|
||||||
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
||||||
internal static extern void cairo_text_path (IntPtr ct, string utf8);
|
internal static extern void cairo_text_path (IntPtr ct, byte[] utf8);
|
||||||
|
|
||||||
//[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
//[DllImport (cairo, CallingConvention=CallingConvention.Cdecl)]
|
||||||
//internal static extern IntPtr cairo_toy_font_face_create (IntPtr face, FontSlant slant, FontWeight weight);
|
//internal static extern IntPtr cairo_toy_font_face_create (IntPtr face, FontSlant slant, FontWeight weight);
|
||||||
|
|
Loading…
Reference in a new issue