[pango] coretext: implement obtaining coverage of supplementary planes



commit 7e6fe2c381c307619215a1f7661dd5c609b22c39
Author: Kristian Rietveld <kris loopnest org>
Date:   Sat Sep 5 23:13:18 2015 +0200

    coretext: implement obtaining coverage of supplementary planes

 pango/pangocoretext.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/pango/pangocoretext.c b/pango/pangocoretext.c
index b8f79ae..a8c0b5d 100644
--- a/pango/pangocoretext.c
+++ b/pango/pangocoretext.c
@@ -84,7 +84,8 @@ ct_font_descriptor_get_coverage (CTFontDescriptorRef desc)
   CFCharacterSetRef charset;
   CFIndex i, length;
   CFDataRef bitmap;
-  const UInt8 *ptr;
+  const UInt8 *ptr, *plane_ptr;
+  const UInt32 plane_size = 8192;
   PangoCoverage *coverage;
 
   coverage = pango_coverage_new ();
@@ -96,11 +97,11 @@ ct_font_descriptor_get_coverage (CTFontDescriptorRef desc)
 
   bitmap = CFCharacterSetCreateBitmapRepresentation (kCFAllocatorDefault,
                                                      charset);
-
-  /* We only handle the BMP plane */
-  length = MIN (CFDataGetLength (bitmap), 8192);
   ptr = CFDataGetBytePtr (bitmap);
 
+  /* First handle the BMP plane. */
+  length = MIN (CFDataGetLength (bitmap), plane_size);
+
   /* FIXME: can and should this be done more efficiently? */
   for (i = 0; i < length; i++)
     {
@@ -111,6 +112,29 @@ ct_font_descriptor_get_coverage (CTFontDescriptorRef desc)
           pango_coverage_set (coverage, i * 8 + j, PANGO_COVERAGE_EXACT);
     }
 
+  /* Next, handle the other planes. The plane number is encoded first as
+   * a single byte. In the following 8192 bytes that plane's coverage bitmap
+   * is stored.
+   */
+  plane_ptr = ptr + plane_size;
+  while (plane_ptr - ptr < CFDataGetLength (bitmap))
+    {
+      const UInt8 plane_number = *plane_ptr;
+      plane_ptr++;
+
+      for (i = 0; i < plane_size; i++)
+        {
+          int j;
+
+          for (j = 0; j < 8; j++)
+            if ((plane_ptr[i] & (1 << j)) == (1 << j))
+              pango_coverage_set (coverage, (plane_number * plane_size + i) * 8 + j,
+                                  PANGO_COVERAGE_EXACT);
+        }
+
+      plane_ptr += plane_size;
+    }
+
   CFRelease (bitmap);
   CFRelease (charset);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]