summaryrefslogtreecommitdiffstats
path: root/src/libnrtype
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-07-24 18:50:50 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-07-24 18:50:50 +0000
commit93cbf2b74b58f8e327bf179cba8e778a4339a3a8 (patch)
treebdf4fd04d479bdcc5705579056372a1c8da2ff21 /src/libnrtype
parentupdate to trunk (diff)
parentFix a bug continuing a bezier path whith a LPE one like spiro or bspline on a... (diff)
downloadinkscape-93cbf2b74b58f8e327bf179cba8e778a4339a3a8.tar.gz
inkscape-93cbf2b74b58f8e327bf179cba8e778a4339a3a8.zip
update to trunk
(bzr r13682.1.27)
Diffstat (limited to 'src/libnrtype')
-rw-r--r--src/libnrtype/FontFactory.cpp88
-rw-r--r--src/libnrtype/FontFactory.h2
-rw-r--r--src/libnrtype/Layout-TNG-Compute.cpp16
-rw-r--r--src/libnrtype/Layout-TNG-OutIter.cpp4
-rw-r--r--src/libnrtype/Layout-TNG.h6
-rw-r--r--src/libnrtype/font-instance.h5
-rw-r--r--src/libnrtype/font-lister.cpp2
7 files changed, 118 insertions, 5 deletions
diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp
index c8f5e1fef..65eb62dda 100644
--- a/src/libnrtype/FontFactory.cpp
+++ b/src/libnrtype/FontFactory.cpp
@@ -18,9 +18,11 @@
#include <glibmm/i18n.h>
#include <pango/pangoft2.h>
+#include <pango/pango-ot.h>
#include "libnrtype/FontFactory.h"
#include "libnrtype/font-instance.h"
#include "util/unordered-containers.h"
+#include <map>
typedef INK_UNORDERED_MAP<PangoFontDescription*, font_instance*, font_descr_hash, font_descr_equal> FaceMapType;
@@ -591,7 +593,23 @@ font_instance* font_factory::FaceFromFontSpecification(char const *fontSpecifica
return font;
}
+void dump_tag( guint32 *tag, Glib::ustring prefix = "" ) {
+ std::cout << prefix
+ << ((char)((*tag & 0xff000000)>>24))
+ << ((char)((*tag & 0x00ff0000)>>16))
+ << ((char)((*tag & 0x0000ff00)>>8))
+ << ((char)((*tag & 0x000000ff)>>0))
+ << std::endl;
+}
+Glib::ustring extract_tag( guint32 *tag ) {
+ Glib::ustring tag_name;
+ tag_name += ((char)((*tag & 0xff000000)>>24));
+ tag_name += ((char)((*tag & 0x00ff0000)>>16));
+ tag_name += ((char)((*tag & 0x0000ff00)>>8));
+ tag_name += ((char)((*tag & 0x000000ff)>>0));
+ return tag_name;
+}
font_instance *font_factory::Face(PangoFontDescription *descr, bool canFail)
{
@@ -657,6 +675,76 @@ font_instance *font_factory::Face(PangoFontDescription *descr, bool canFail)
pango_font_description_free(descr);
}
}
+
+ // Extract which OpenType tables are in the font. We'll make a list of all tables
+ // regardless of which script and langauge they are in. These functions are deprecated but
+ // will eventually be replaced by newer functions (according to Behdad).
+ PangoOTInfo* info = pango_ot_info_get( res->theFace );
+
+ PangoOTTag* scripts = pango_ot_info_list_scripts( info, PANGO_OT_TABLE_GSUB );
+ // std::cout << " scripts: " << std::endl;
+ for( unsigned i = 0; scripts[i] != 0; ++i ) {
+ // dump_tag( &scripts[i], " " );
+
+ guint script_index = -1;
+ if( pango_ot_info_find_script( info, PANGO_OT_TABLE_GSUB, scripts[i], &script_index )) {
+
+ PangoOTTag* languages =
+ pango_ot_info_list_languages( info, PANGO_OT_TABLE_GSUB, script_index, NULL);
+ // if( languages[0] != 0 )
+ // std::cout << " languages: " << std::endl;
+
+ for( unsigned j = 0; languages[j] != 0; ++j ) {
+ // dump_tag( &languages[j], " lang: ");
+
+ guint language_index = -1;
+ if( pango_ot_info_find_language(info, PANGO_OT_TABLE_GSUB, script_index, languages[j], &language_index, NULL)) {
+
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, i, j );
+ if( features[0] != 0 )
+ // std::cout << " features: " << std::endl;
+
+ for( unsigned k = 0; features[k] != 0; ++k ) {
+ // dump_tag( &features[k], " feature: ");
+ ++(res->openTypeTables[ extract_tag(&features[k])]);
+ }
+ g_free( features );
+ } else {
+ // std::cout << " No languages defined" << std::endl;
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, i, PANGO_OT_DEFAULT_LANGUAGE );
+ // if( features[0] != 0 )
+ // std::cout << " default features: " << std::endl;
+
+ for( unsigned k = 0; features[k] != 0; ++k ) {
+ // dump_tag( &features[k], " feature: " );
+ ++(res->openTypeTables[ extract_tag(&features[k])]);
+ }
+ g_free( features );
+ }
+ }
+ g_free( languages );
+ } else {
+ // std::cout << " No scripts defined! " << std::endl;
+ }
+ }
+ g_free( scripts );
+
+ PangoOTTag* features =
+ pango_ot_info_list_features( info, PANGO_OT_TABLE_GSUB, 0, 0, PANGO_OT_DEFAULT_LANGUAGE );
+ // if( features[0] != 0 )
+ // std::cout << " DFTL DFTL features: " << std::endl;
+ for( unsigned i = 0; features[i] != 0; ++i ) {
+ // dump_tag( &features[i], " feature: " );
+ ++(res->openTypeTables[ extract_tag(&features[i])]);
+ }
+ // std::map<Glib::ustring,int>::iterator it;
+ // for( it = res->openTypeTables.begin(); it != res->openTypeTables.end(); ++it) {
+ // std::cout << "Table: " << it->first << " Occurances: " << it->second << std::endl;
+ // }
+ g_free( features );
+
} else {
// already here
res = loadedFaces[descr];
diff --git a/src/libnrtype/FontFactory.h b/src/libnrtype/FontFactory.h
index bd5a4460c..4c8c2cb29 100644
--- a/src/libnrtype/FontFactory.h
+++ b/src/libnrtype/FontFactory.h
@@ -68,7 +68,7 @@ public:
};
// Map type for gathering UI family and style names
-typedef std::map<Glib::ustring, std::list<StyleNames> > FamilyToStylesMap;
+// typedef std::map<Glib::ustring, std::list<StyleNames> > FamilyToStylesMap;
class font_factory {
public:
diff --git a/src/libnrtype/Layout-TNG-Compute.cpp b/src/libnrtype/Layout-TNG-Compute.cpp
index beff3734b..d81e1b6b4 100644
--- a/src/libnrtype/Layout-TNG-Compute.cpp
+++ b/src/libnrtype/Layout-TNG-Compute.cpp
@@ -958,6 +958,10 @@ void Layout::Calculator::ParagraphInfo::free()
*/
void Layout::Calculator::_buildPangoItemizationForPara(ParagraphInfo *para) const
{
+ TRACE(("pango version string: %s\n", pango_version_string() ));
+#if PANGO_VERSION_CHECK(1,37,1)
+ TRACE((" ... compiled for font features\n"));
+#endif
Glib::ustring para_text;
PangoAttrList *attributes_list;
unsigned input_index;
@@ -986,9 +990,21 @@ void Layout::Calculator::_buildPangoItemizationForPara(ParagraphInfo *para) con
PangoAttribute *attribute_font_description = pango_attr_font_desc_new(font->descr);
attribute_font_description->start_index = para_text.bytes();
+
+#if PANGO_VERSION_CHECK(1,37,1)
+ PangoAttribute *attribute_font_features =
+ pango_attr_font_features_new( text_source->style->getFontFeatureString().c_str());
+ attribute_font_features->start_index = para_text.bytes();
+#endif
para_text.append(&*text_source->text_begin.base(), text_source->text_length); // build the combined text
attribute_font_description->end_index = para_text.bytes();
pango_attr_list_insert(attributes_list, attribute_font_description);
+
+#if PANGO_VERSION_CHECK(1,37,1)
+ attribute_font_features->end_index = para_text.bytes();
+ pango_attr_list_insert(attributes_list, attribute_font_features);
+#endif
+
// ownership of attribute is assumed by the list
font->Unref();
}
diff --git a/src/libnrtype/Layout-TNG-OutIter.cpp b/src/libnrtype/Layout-TNG-OutIter.cpp
index c9c318960..707897f50 100644
--- a/src/libnrtype/Layout-TNG-OutIter.cpp
+++ b/src/libnrtype/Layout-TNG-OutIter.cpp
@@ -788,12 +788,12 @@ bool Layout::iterator::prevLineCursor(int n)
{
if (!_cursor_moving_vertically)
beginCursorUpDown();
- unsigned line_index;
+ int line_index;
if (_char_index == _parent_layout->_characters.size())
line_index = _parent_layout->_lines.size() - 1;
else
line_index = _parent_layout->_characters[_char_index].chunk(_parent_layout).in_line;
- if (line_index == 0)
+ if (line_index <= 0)
return false; // nowhere to go
else
n = MIN (n, static_cast<int>(line_index));
diff --git a/src/libnrtype/Layout-TNG.h b/src/libnrtype/Layout-TNG.h
index e91c32ebe..26db1fad9 100644
--- a/src/libnrtype/Layout-TNG.h
+++ b/src/libnrtype/Layout-TNG.h
@@ -701,7 +701,11 @@ private:
/** The overall block-progression of the whole flow. */
inline Direction _blockProgression() const
- {return static_cast<InputStreamTextSource*>(_input_stream.front())->styleGetBlockProgression();}
+ {
+ if(!_input_stream.empty())
+ return static_cast<InputStreamTextSource*>(_input_stream.front())->styleGetBlockProgression();
+ return TOP_TO_BOTTOM;
+ }
/** so that LEFT_TO_RIGHT == RIGHT_TO_LEFT but != TOP_TO_BOTTOM */
static bool _directions_are_orthogonal(Direction d1, Direction d2);
diff --git a/src/libnrtype/font-instance.h b/src/libnrtype/font-instance.h
index 2c7d1ce46..5a71e353b 100644
--- a/src/libnrtype/font-instance.h
+++ b/src/libnrtype/font-instance.h
@@ -36,6 +36,9 @@ public:
int nbGlyph, maxGlyph;
font_glyph* glyphs;
+ // Map of OpenType tables found in font (convert to std::set?)
+ std::map<Glib::ustring, int> openTypeTables;
+
font_instance(void);
virtual ~font_instance(void);
@@ -68,6 +71,8 @@ public:
private:
void FreeTheFace();
+ // Temp: make public
+public:
#ifdef USE_PANGO_WIN32
HFONT theFace;
#else
diff --git a/src/libnrtype/font-lister.cpp b/src/libnrtype/font-lister.cpp
index a6ab3b239..70374864a 100644
--- a/src/libnrtype/font-lister.cpp
+++ b/src/libnrtype/font-lister.cpp
@@ -335,7 +335,7 @@ Glib::ustring FontLister::system_fontspec(Glib::ustring fontspec)
PangoFontDescription *descr = pango_font_description_from_string(fontspec.c_str());
font_instance *res = (font_factory::Default())->Face(descr);
- if (res->pFont) {
+ if (res && res->pFont) {
PangoFontDescription *nFaceDesc = pango_font_describe(res->pFont);
out = sp_font_description_get_family(nFaceDesc);
}