From ff409cf798f7b2cbba5d45b235850cf2ff3da1e6 Mon Sep 17 00:00:00 2001
From: hanwen <hanwen>
Date: Mon, 2 May 2005 22:27:25 +0000
Subject: [PATCH] (LY_DEFINE): new function ly:otf-font-table-data.

---
 ChangeLog                      |  5 +++++
 lily/include/open-type-font.hh |  1 +
 lily/open-type-font-scheme.cc  | 25 +++++++++++++++++++++++++
 lily/open-type-font.cc         |  9 +++++++++
 4 files changed, 40 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 916b06837c..3d4dac1046 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-03  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+	* lily/open-type-font-scheme.cc (LY_DEFINE):
+	new function ly:otf-font-table-data.
+
 2005-05-02  Han-Wen Nienhuys  <hanwen@xs4all.nl>
 
 	* mf/GNUmakefile ($(outdir)/lilypond.map): remove rule.
diff --git a/lily/include/open-type-font.hh b/lily/include/open-type-font.hh
index eea6204527..918a2cc5cb 100644
--- a/lily/include/open-type-font.hh
+++ b/lily/include/open-type-font.hh
@@ -32,6 +32,7 @@ public:
   SCM get_global_table () const;
   SCM get_char_table () const;
 
+  String get_otf_table (String tag) const;
   static SCM make_otf (String);
   virtual String font_name () const;
   virtual ~Open_type_font ();
diff --git a/lily/open-type-font-scheme.cc b/lily/open-type-font-scheme.cc
index 4430d14438..1473205210 100644
--- a/lily/open-type-font-scheme.cc
+++ b/lily/open-type-font-scheme.cc
@@ -34,3 +34,28 @@ LY_DEFINE (ly_otf_font_glyph_info, "ly:otf-font-glyph-info", 2, 0, 0,
   SCM sym = scm_string_to_symbol (glyph);
   return scm_hashq_ref (otf->get_char_table (), sym, SCM_EOL);
 }
+
+
+LY_DEFINE(ly_otf_font_table_data, "ly:otf-font-table-data", 2, 0, 0,
+	  (SCM font, SCM tag),
+	  "Extract a table @var{tag} from @var{font}.")
+{
+  Modified_font_metric *fm
+    = dynamic_cast<Modified_font_metric *> (unsmob_metrics (font));
+  
+  Open_type_font *otf = fm ? dynamic_cast<Open_type_font *> (fm->original_font ())
+    : dynamic_cast<Open_type_font *> (unsmob_metrics (font));
+
+
+  SCM_ASSERT_TYPE (otf, font, SCM_ARG1,  __FUNCTION__, "Open type font");
+  SCM_ASSERT_TYPE (scm_is_string (tag), tag, SCM_ARG1,  __FUNCTION__, "Open type font");
+
+  char ctag [5] = "    ";
+
+  String tag_string = ly_scm2string (tag);
+  strncpy (ctag, tag_string.to_str0 (), tag_string.length());
+
+  String tab = otf->get_otf_table (String (ctag));
+
+  return scm_from_locale_stringn ((char const*) tab.to_bytes (), tab.length ());
+}
diff --git a/lily/open-type-font.cc b/lily/open-type-font.cc
index ddde7dcfab..df0a23e7d5 100644
--- a/lily/open-type-font.cc
+++ b/lily/open-type-font.cc
@@ -37,6 +37,15 @@ load_table (char const *tag_str, FT_Face face, FT_ULong *length)
   return 0;
 }
 
+String
+Open_type_font::get_otf_table (String tag) const
+{
+  FT_ULong len;
+  FT_Byte *tab = load_table (tag.to_str0 (), face_,  &len);
+  
+  return String (tab, len);
+}
+
 SCM
 load_scheme_table (char const *tag_str, FT_Face face)
 {
-- 
2.39.5