You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(20) |
Feb
(14) |
Mar
(17) |
Apr
(60) |
May
(15) |
Jun
(51) |
Jul
(88) |
Aug
(21) |
Sep
(24) |
Oct
(1) |
Nov
(33) |
Dec
(16) |
2004 |
Jan
(27) |
Feb
(5) |
Mar
(6) |
Apr
(50) |
May
(6) |
Jun
(12) |
Jul
(14) |
Aug
(12) |
Sep
(21) |
Oct
(46) |
Nov
(1) |
Dec
(4) |
2005 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
(8) |
Jun
(23) |
Jul
|
Aug
(23) |
Sep
(1) |
Oct
(3) |
Nov
|
Dec
|
From: <sil...@li...> - 2005-10-28 15:41:59
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13488/src/GrEngine Modified Files: GrPassActionCode.cpp GrSlotStream.h Log Message: Continuaton of insertion at segment boundary fix. Index: GrPassActionCode.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPassActionCode.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- GrPassActionCode.cpp 26 Oct 2005 21:49:51 -0000 1.16 +++ GrPassActionCode.cpp 28 Oct 2005 15:41:49 -0000 1.17 @@ -628,9 +628,9 @@ } if (fSegSegMin) - psstrmOut->SetSegMinToWritePos(); + psstrmOut->SetSegMinToWritePos(false); if (fSetSegLim) - psstrmOut->SetSegLimToWritePos(); + psstrmOut->SetSegLimToWritePos(false); psstrmOut->NextPut(pslotNew); } @@ -667,9 +667,9 @@ pengst->NewSlotCopy(pslotCopyFrom, m_ipass, &pslotNew); if (fSegSegMin) - psstrmOut->SetSegMinToWritePos(); + psstrmOut->SetSegMinToWritePos(false); if (fSetSegLim) - psstrmOut->SetSegLimToWritePos(); + psstrmOut->SetSegLimToWritePos(false); psstrmOut->NextPut(pslotNew); } @@ -730,9 +730,9 @@ } if (fSegSegMin) - psstrmOut->SetSegMinToWritePos(); + psstrmOut->SetSegMinToWritePos(false); if (fSetSegLim) - psstrmOut->SetSegLimToWritePos(); + psstrmOut->SetSegLimToWritePos(false); psstrmOut->NextPut(pslotNew); } Index: GrSlotStream.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotStream.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- GrSlotStream.h 24 Aug 2005 18:14:10 -0000 1.15 +++ GrSlotStream.h 28 Oct 2005 15:41:49 -0000 1.16 @@ -263,7 +263,7 @@ Assert(fAdjusting || m_islotSegMin == -1 || m_islotSegMin == islot); m_islotSegMin = islot; } - void SetSegMinToWritePos() + void SetSegMinToWritePos(bool fMod = true) { if (m_islotSegMin == -1) m_islotSegMin = m_islotWritePos; @@ -278,8 +278,13 @@ { m_islotSegLim = islot; } - void SetSegLimToWritePos() + void SetSegLimToWritePos(bool fMod = true) { + if (m_islotSegLim > -1 && !fMod) + { + Assert(m_islotSegLim <= m_islotWritePos); + return; + } m_islotSegLim = m_islotWritePos; } int SegLimIfKnown() |
From: <sil...@li...> - 2005-10-26 21:49:59
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8897 Modified Files: GrPassActionCode.cpp Log Message: Fixed bug related to insertions at segment boundaries (showed up in Burmese font). Index: GrPassActionCode.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPassActionCode.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- GrPassActionCode.cpp 6 Oct 2004 18:28:31 -0000 1.15 +++ GrPassActionCode.cpp 26 Oct 2005 21:49:51 -0000 1.16 @@ -597,8 +597,10 @@ EngineState * pengst = ptman->State(); // If we are exactly at the segment boundary, pass the information on to the output stream. + // Note that inserted items always go outside the segment, if they are at the boundary + // (you DON'T want them between the segment boundary and the LB slot!). bool fSegSegMin = psstrmIn->AtSegMin() && !fInserting; - bool fSetSegLim = psstrmIn->AtSegLim() && !fInserting; + bool fSetSegLim = psstrmIn->AtSegLim(); // Slot to copy features and text properties from: GrSlotState * pslotNextInput; @@ -648,8 +650,9 @@ EngineState * pengst = ptman->State(); // If we are exactly at the segment boundary, pass the information on to the output stream. + // Note that inserted items always go outside the segment, if they are at the boundary. bool fSegSegMin = psstrmIn->AtSegMin() && !fInserting; - bool fSetSegLim = psstrmIn->AtSegLim() && !fInserting; + bool fSetSegLim = psstrmIn->AtSegLim(); if (!fInserting) { @@ -690,8 +693,9 @@ EngineState * pengst = ptman->State(); // If we are exactly at the segment boundary, pass the information on to the output stream. + // Note that inserted items always go outside the segment, if they are at the boundary. bool fSegSegMin = psstrmIn->AtSegMin() && !fInserting; - bool fSetSegLim = psstrmIn->AtSegLim() && !fInserting; + bool fSetSegLim = psstrmIn->AtSegLim(); // Slot to copy features and text properties from: GrSlotState * pslotNextInput; |
From: <sil...@li...> - 2005-10-10 20:27:50
|
casts and remove unused variables for pangographite to compile with -Wall also #define kPosInfFloat instead of making it a static variable --This line, and those below, will be ignored-- M include/GrConstants.h M wrappers/pangographite/stressengine.cpp M wrappers/pangographite/PangoTextSrc.cpp M wrappers/pangographite/configure.ac M wrappers/pangographite/PangoGrFont.cpp M wrappers/pangographite/pangographite.cpp M wrappers/pangographite/silgraphite-break.c The diff for GrConstants (which ought to be reviewed as I don't know if having it as a static is better or worse, but it makes it an unused variable in client apps. Index: include/GrConstants.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- include/GrConstants.h (revision 80) +++ include/GrConstants.h (working copy) @@ -60,8 +60,8 @@ }; -static float kPosInfFloat =3D (float)kPosInfinity; -static float kNegInfFloat =3D (float)kNegInfinity; +#define kPosInfFloat (float)kPosInfinity +#define kNegInfFloat (float)kNegInfinity enum { |
From: <sil...@li...> - 2005-09-14 14:37:38
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3140 Modified Files: Makefile.am Added Files: silgraphite-break.c Log Message: add a breaking module for graphite This is necessary to fix the cursor problems Install the modules to a separate dir so pangorc can be used to give them priority --- NEW FILE: silgraphite-break.c --- /* Pango * silgraphite-fc.c: SILGraphite based shaper for FreeType-based backends * * Copyright (C) 2004-2005 SIL International * Author: Daniel Glassey <wd...@de...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include <gmodule.h> #include <pango/pango-engine.h> #include <pango/pango-utils.h> #include <pango/pangofc-font.h> #include <pango/pangoxft.h> #include "pangographite.h" static gboolean have_graphite = FALSE; static gboolean graphite_initialised = FALSE; //void graphite_PangoGlyphString(const char *text, int length, PangoFont *font, PangoGlyphString *glyphs); typedef void (*pgraphite_real_shape) (const char *text, int length, PangoFont *font, PangoGlyphString *glyphs); static pgraphite_real_shape graphite_real_shape; static GModule *graphitelibrary = NULL; /* No extra fields needed */ typedef PangoEngineLang GraphiteEngineBreak; typedef PangoEngineLangClass GraphiteEngineBreakClass; #define LANG_ENGINE_NAME "GraphiteScriptEngineBreak" #define RENDER_TYPE PANGO_RENDER_TYPE_NONE static PangoEngineScriptInfo graphite_scripts[] = { { PANGO_SCRIPT_COMMON, "*" }, /* Zyyy */ { PANGO_SCRIPT_INHERITED, "*" }, /* Qaai */ { PANGO_SCRIPT_ARABIC, "*" }, /* Arab */ { PANGO_SCRIPT_ARMENIAN, "*" }, /* Armn */ { PANGO_SCRIPT_BENGALI, "*" }, /* Beng */ { PANGO_SCRIPT_BOPOMOFO, "*" }, /* Bopo */ { PANGO_SCRIPT_CHEROKEE, "*" }, /* Cher */ { PANGO_SCRIPT_COPTIC, "*" }, /* Qaac */ { PANGO_SCRIPT_CYRILLIC, "*" }, /* Cyrl (Cyrs) */ { PANGO_SCRIPT_DESERET, "*" }, /* Dsrt */ { PANGO_SCRIPT_DEVANAGARI, "*" }, /* Deva */ { PANGO_SCRIPT_ETHIOPIC, "*" }, /* Ethi */ { PANGO_SCRIPT_GEORGIAN, "*" }, /* Geor (Geon, Geoa) */ { PANGO_SCRIPT_GOTHIC, "*" }, /* Goth */ { PANGO_SCRIPT_GREEK, "*" }, /* Grek */ { PANGO_SCRIPT_GUJARATI, "*" }, /* Gujr */ { PANGO_SCRIPT_GURMUKHI, "*" }, /* Guru */ { PANGO_SCRIPT_HAN, "*" }, /* Hani */ { PANGO_SCRIPT_HANGUL, "*" }, /* Hang */ { PANGO_SCRIPT_HEBREW, "*" }, /* Hebr */ { PANGO_SCRIPT_HIRAGANA, "*" }, /* Hira */ { PANGO_SCRIPT_KANNADA, "*" }, /* Knda */ { PANGO_SCRIPT_KATAKANA, "*" }, /* Kana */ { PANGO_SCRIPT_KHMER, "*" }, /* Khmr */ { PANGO_SCRIPT_LAO, "*" }, /* Laoo */ { PANGO_SCRIPT_LATIN, "*" }, /* Latn (Latf, Latg) */ { PANGO_SCRIPT_MALAYALAM, "*" }, /* Mlym */ { PANGO_SCRIPT_MONGOLIAN, "*" }, /* Mong */ { PANGO_SCRIPT_MYANMAR, "*" }, /* Mymr */ { PANGO_SCRIPT_OGHAM, "*" }, /* Ogam */ { PANGO_SCRIPT_OLD_ITALIC, "*" }, /* Ital */ { PANGO_SCRIPT_ORIYA, "*" }, /* Orya */ { PANGO_SCRIPT_RUNIC, "*" }, /* Runr */ { PANGO_SCRIPT_SINHALA, "*" }, /* Sinh */ { PANGO_SCRIPT_SYRIAC, "*" }, /* Syrc (Syrj, Syrn, Syre) */ { PANGO_SCRIPT_TAMIL, "*" }, /* Taml */ { PANGO_SCRIPT_TELUGU, "*" }, /* Telu */ { PANGO_SCRIPT_THAANA, "*" }, /* Thaa */ { PANGO_SCRIPT_THAI, "*" }, /* Thai */ { PANGO_SCRIPT_TIBETAN, "*" }, /* Tibt */ { PANGO_SCRIPT_CANADIAN_ABORIGINAL, "*" }, /* Cans */ { PANGO_SCRIPT_YI, "*" }, /* Yiii */ { PANGO_SCRIPT_TAGALOG, "*" }, /* Tglg */ { PANGO_SCRIPT_HANUNOO, "*" }, /* Hano */ { PANGO_SCRIPT_BUHID, "*" }, /* Buhd */ { PANGO_SCRIPT_TAGBANWA, "*" }, /* Tagb */ /* Unicode-4.0 additions */ { PANGO_SCRIPT_BRAILLE, "*" }, /* Brai */ { PANGO_SCRIPT_CYPRIOT, "*" }, /* Cprt */ { PANGO_SCRIPT_LIMBU, "*" }, /* Limb */ { PANGO_SCRIPT_OSMANYA, "*" }, /* Osma */ { PANGO_SCRIPT_SHAVIAN, "*" }, /* Shaw */ { PANGO_SCRIPT_LINEAR_B, "*" }, /* Linb */ { PANGO_SCRIPT_TAI_LE, "*" }, /* Tale */ { PANGO_SCRIPT_UGARITIC, "*" } /* Ugar */ #if 0 /* Unicode-4.1 additions (requires pango >= 1.9.1) */ ,{ PANGO_SCRIPT_NEW_TAI_LUE, "*" }, /* Talu */ { PANGO_SCRIPT_BUGINESE, "*" }, /* Bugi */ { PANGO_SCRIPT_GLAGOLITIC, "*" }, /* Glag */ { PANGO_SCRIPT_TIFINAGH, "*" }, /* Tfng */ { PANGO_SCRIPT_SYLOTI_NAGRI, "*" }, /* Sylo */ { PANGO_SCRIPT_OLD_PERSIAN, "*" }, /* Xpeo */ { PANGO_SCRIPT_KHAROSHTHI, "*" } /* Khar */ #endif }; static PangoEngineInfo script_engines[] = { { LANG_ENGINE_NAME, PANGO_ENGINE_TYPE_LANG, RENDER_TYPE, graphite_scripts, G_N_ELEMENTS(graphite_scripts) } }; void graphite_engine_break (PangoEngineLang *engine, const gchar *text, gint length, PangoAnalysis *analysis, PangoLogAttr *attrs, int attrs_len) { g_message("graphite_engine_break"); PangoFont *font = analysis->font; if (!PANGO_IS_FONT (font)) { g_message("graphite_engine_break: not a PangoFont"); } if (!PANGO_IS_FC_FONT (font)) { g_message("graphite_engine_break: not a PangoFcFont"); } if (!PANGO_XFT_IS_FONT (font)) { g_message("graphite_engine_break: not a PangoXftFont"); } PangoFcFont *fcfont = (PangoFcFont *) font; FcChar8 * fontcap; if (FcPatternGetString (fcfont->font_pattern, FC_CAPABILITY, 0, &fontcap) != FcResultMatch) { g_message("graphite_engine_break: not a complex font (%s:%d)", text, length); } else if (strstr((char*)fontcap, "ttable:Silf")) { g_message("graphite_engine_break: is a Graphite font"); } return pango_default_break(text, length, analysis, attrs, attrs_len); } #if 0 static void graphite_engine_shape (PangoEngineShape *engine, PangoFont *font, const char *text, gint length, PangoAnalysis *analysis, PangoGlyphString *glyphs) { g_return_if_fail (PANGO_XFT_IS_FONT (font)); g_return_if_fail (have_graphite); static GStaticMutex mutex = G_STATIC_MUTEX_INIT; g_static_mutex_lock (&mutex); // Do Graphite Shaping (*graphite_real_shape)(text, length, font, glyphs); g_static_mutex_unlock (&mutex); } static PangoCoverageLevel graphite_engine_covers (PangoEngineShape *engine, PangoFont *font, PangoLanguage *lang, gunichar wc) { PangoFcFont *fcfont; char * fontcap; if (!have_graphite) return PANGO_COVERAGE_NONE; // First check that the font covers the lang PangoCoverage *coverage = pango_font_get_coverage (font, lang); PangoCoverageLevel result = pango_coverage_get (coverage, wc); pango_coverage_unref (coverage); if (result != PANGO_COVERAGE_EXACT) { return PANGO_COVERAGE_NONE; } if (!PANGO_IS_FONT (font)) { g_message("not a PangoFont"); return PANGO_COVERAGE_NONE; } if (!PANGO_IS_FC_FONT (font)) { g_message("not a PangoFcFont"); return PANGO_COVERAGE_NONE; } if (!PANGO_XFT_IS_FONT (font)) { g_message("not a PangoXftFont"); return PANGO_COVERAGE_NONE; } fcfont = (PangoFcFont *)font; if (FcPatternGetString (fcfont->font_pattern, FC_CAPABILITY, 0, (FcChar8 **)&fontcap) != FcResultMatch) { return PANGO_COVERAGE_NONE; } if (strstr(fontcap, "ttable:Silf")) { return PANGO_COVERAGE_EXACT; } else return PANGO_COVERAGE_NONE; // fontconfig >= 2.3.0 has fontcap for font capabilities inc silgraphite tttables #if 0 //FcResult FcPatternGet (FcPattern *p, const char *object, int id, FcValue *v) /* Returns in `v' the `id'th value associated with the property `object'. The value returned is not a copy, but rather refers to the data stored within the pattern directly. Applications must not free this value. */ #endif } #endif static void init_graphite (void) { if (!graphite_initialised) { graphite_initialised = TRUE; g_message("opening libsilgraphitepango"); graphitelibrary = g_module_open("libsilgraphitepango", G_MODULE_BIND_LAZY); if (graphitelibrary) { g_message("looking for graphite_PangoGlyphString"); have_graphite = g_module_symbol(graphitelibrary, "graphite_PangoGlyphString", (gpointer *)&graphite_real_shape); if (!have_graphite) g_message("Failed to find graphite_PangoGlyphString"); else g_message("Found graphite_PangoGlyphString"); } } } static void graphite_engine_break_class_init (PangoEngineLangClass *class) { class->script_break = graphite_engine_break; } PANGO_ENGINE_LANG_DEFINE_TYPE (GraphiteEngineBreak, graphite_engine_break, graphite_engine_break_class_init, NULL); void PANGO_MODULE_ENTRY(init) (GTypeModule *module) { init_graphite(); graphite_engine_break_register_type (module); g_message("init pangographite-break"); } void PANGO_MODULE_ENTRY(exit) (void) { g_message("exit pangographite-break"); } void PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines, int *n_engines) { init_graphite(); *engines = script_engines; *n_engines = G_N_ELEMENTS (script_engines); } PangoEngine * PANGO_MODULE_ENTRY(create) (const char *id) { if (!strcmp (id, LANG_ENGINE_NAME)) return g_object_new (graphite_engine_break_type, NULL); else return NULL; } Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/Makefile.am,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- Makefile.am 19 Aug 2005 23:10:56 -0000 1.9 +++ Makefile.am 14 Sep 2005 14:37:26 -0000 1.10 @@ -18,25 +18,31 @@ #minor=$(shell echo ${PANGO_MODULE_VERSION} | sed -e 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$$/\1/') #moduledir = $(libdir)/silgraphite/pango/$(major).$(minor).0 -moduledir = $(libdir)/pango/${PANGO_MODULE_VERSION}/modules -module_LTLIBRARIES = pango-silgraphite-fc.la +moduledir = $(libdir)/pango/${PANGO_MODULE_VERSION}/modules/silgraphite +module_LTLIBRARIES = pango-silgraphite-fc.la pango-silgraphite-break.la lib_LTLIBRARIES = libsilgraphitepango.la silgraphite_fc_sources = silgraphite-fc.c +silgraphite_break_sources = silgraphite-break.c pangographite_sources = GrTextSrc.cpp \ GrGraphics.cpp pangographite.cpp -pango_silgraphite_fc_la_LDFLAGS = -export-dynamic -avoid-version -module +pango_silgraphite_fc_la_LDFLAGS = -module -export-dynamic -avoid-version -export-symbols-regex "^script_engine_.*" pango_silgraphite_fc_la_LIBADD = $(PANGO_LIBS) pango_silgraphite_fc_la_SOURCES = $(silgraphite_fc_sources) +pango_silgraphite_break_la_LDFLAGS = -module -export-dynamic -avoid-version -export-symbols-regex "^script_engine_.*" +pango_silgraphite_break_la_LIBADD = $(PANGO_LIBS) +pango_silgraphite_break_la_SOURCES = $(silgraphite_break_sources) + + libsilgraphitepango_la_LIBADD = $(PANGO_LIBS) $(GR_LIBS) libsilgraphitepango_la_SOURCES = $(pangographite_sources) -noinst_PROGRAMS = stressengine testtext +noinst_PROGRAMS = stressengine testtext testbuffer #bin_PROGRAMS = stressengine testtext stressengine_LDADD = $(PANGO_LIBS) $(GRLIBS) libsilgraphitepango.la @@ -48,4 +54,9 @@ testtext.c testtext_CFLAGS = $(GTK_CFLAGS) +testbuffer_LDADD = $(GTK_LIBS) +testbuffer_SOURCES = \ + testbuffer.c +testbuffer_CFLAGS = $(GTK_CFLAGS) + |
From: <sil...@li...> - 2005-08-24 18:14:19
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3005/src/GrEngine Modified Files: GrSlotState.cpp GrSlotState.h GrSlotStream.cpp GrSlotStream.h Log Message: Replaced bug fix of June 2005; replaced removal of unnecessary gr:: in UtilString.h Index: GrSlotState.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.cpp,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- GrSlotState.cpp 10 Jun 2005 16:36:56 -0000 1.18 +++ GrSlotState.cpp 24 Aug 2005 18:14:10 -0000 1.19 @@ -761,6 +761,7 @@ else { Assert(m_fShiftMod); + EnsureLocalAttachmentTree(ptman, psstrmIn, psstrmOut, islotThis); ZapMetricsAndPositionDownToBase(psstrmOut); ZapMetricsOfLeaves(psstrmOut); } @@ -777,6 +778,26 @@ } /*---------------------------------------------------------------------------------------------- + The shift attribute of a slot has been modified. Make sure any slots that are part of the + same attachment cluster are local to this stream. The reason for this is so that the + position calculations stay consistent within the stream. +----------------------------------------------------------------------------------------------*/ +void GrSlotState::EnsureLocalAttachmentTree(GrTableManager * ptman, + GrSlotStream * psstrmIn, GrSlotStream * psstrmOut, int islotThis) +{ + if (m_dislotRootFixed) + { + GrSlotState * pslotRoot = SlotAtOffset(psstrmOut, m_dislotRootFixed); + psstrmOut->EnsureLocalCopy(ptman, pslotRoot, psstrmIn); + } + for (size_t islot = 0; islot < m_vdislotAttLeaves.size(); islot++) + { + GrSlotState * pslotLeaf = SlotAtOffset(psstrmOut, m_vdislotAttLeaves[islot]); + psstrmOut->EnsureLocalCopy(ptman, pslotLeaf, psstrmIn); + } +} + +/*---------------------------------------------------------------------------------------------- The recipient slot is being attached to the argument slot. NOTE: the caller is responsible to zap the cached positions of following glyphs in the stream. Index: GrSlotState.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.h,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- GrSlotState.h 12 Aug 2005 11:25:44 -0000 1.17 +++ GrSlotState.h 24 Aug 2005 18:14:10 -0000 1.18 @@ -949,6 +949,9 @@ GrSlotState * SlotAtOffset(GrSlotStream * psstrm, int dislot); // ENHANCE SharonC: inline? + void EnsureLocalAttachmentTree(GrTableManager * ptman, + GrSlotStream * psstrmIn, GrSlotStream * psstrmOut, int islotThis); + void ZapCompositeMetrics() { m_nCompositeLevel = kNegInfinity; Index: GrSlotStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotStream.cpp,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- GrSlotStream.cpp 4 Aug 2005 10:31:45 -0000 1.21 +++ GrSlotStream.cpp 24 Aug 2005 18:14:10 -0000 1.22 @@ -1463,6 +1463,44 @@ } /*---------------------------------------------------------------------------------------------- + Make sure the stream contains a local instance of the given slot, not a copy used by + a previous pass. +----------------------------------------------------------------------------------------------*/ +void GrSlotStream::EnsureLocalCopy(GrTableManager * ptman, GrSlotState * pslot, + GrSlotStream * psstrmIn) +{ + //Assert(m_vpslot[islot + m_cslotPreSeg] == pslot); + Assert(pslot->PassModified() <= m_ipass); + + if (pslot->PassModified() < m_ipass) + { + int islot = pslot->PosPassIndex(); + Assert(SlotAtPosPassIndex(islot) == pslot); + GrSlotState * pslotNew; + ptman->State()->NewSlotCopy(pslot, m_ipass, &pslotNew); + m_vpslot[islot + m_cslotPreSeg] = pslotNew; + + psstrmIn->ReplaceSlotInReprocessBuffer(pslot, pslotNew); + } +} + +/*---------------------------------------------------------------------------------------------- + A slot has been replace within the coorsponding output stream. Make sure the reprocess + buffer of this stream constains the same slot. +----------------------------------------------------------------------------------------------*/ +void GrSlotStream::ReplaceSlotInReprocessBuffer(GrSlotState * pslotOld, GrSlotState * pslotNew) +{ + if (m_islotReprocPos > -1) + { + for (size_t islot = 0; islot < m_vpslotReproc.size(); islot++) + { + if (m_vpslotReproc[islot] == pslotOld) + m_vpslotReproc[islot] = pslotNew; + } + } +} + +/*---------------------------------------------------------------------------------------------- Inserting a line break can potentially alter the directionality of preceeding glyphs. Zap the information that has been calculated. Index: GrSlotStream.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotStream.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- GrSlotStream.h 10 Jun 2005 16:36:57 -0000 1.14 +++ GrSlotStream.h 24 Aug 2005 18:14:10 -0000 1.15 @@ -356,6 +356,9 @@ void AdjustPrevStreamNextChunkMap(GrTableManager * ptman, int islotMod, int nInc); void AdjustNextChunkMap(int islotMin, int islotMod, int nInc); + void EnsureLocalCopy(GrTableManager * ptman, GrSlotState * pslot, GrSlotStream * psstrmIn); + void ReplaceSlotInReprocessBuffer(GrSlotState * pslotOld, GrSlotState * pslotNew); + void ZapCalculatedDirLevels(int islotLB); int MaxClusterSlot(int islotChunkLim) |
From: <sil...@li...> - 2005-08-24 18:14:18
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3005/include Modified Files: UtilString.h Log Message: Replaced bug fix of June 2005; replaced removal of unnecessary gr:: in UtilString.h Index: UtilString.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/UtilString.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- UtilString.h 5 Aug 2005 09:40:30 -0000 1.10 +++ UtilString.h 24 Aug 2005 18:14:10 -0000 1.11 @@ -333,7 +333,7 @@ { for ( ; --cch >= 0; prgch1++, prgch2++) { - if (*prgch1 != *prgch2 && gr::ToLower(*prgch1) != gr::ToLower(*prgch2)) + if (*prgch1 != *prgch2 && /*gr::*/ToLower(*prgch1) != /*gr::*/ToLower(*prgch2)) return false; } @@ -1435,10 +1435,10 @@ int ich; int cch = Length(); - ch = gr::ToLower(ch); + ch = /*gr::*/ToLower(ch); for (ich = ichMin; ich < cch; ich++) { - if (gr::ToLower(m_pbuf->m_rgch[ich]) == ch) + if (/*gr::*/ToLower(m_pbuf->m_rgch[ich]) == ch) return ich; } @@ -1481,12 +1481,12 @@ if (ichLast >= Length()) ichLast = Length() - 1; - ch = gr::ToLower(ch); + ch = /*gr::*/ToLower(ch); int ich; for (ich = ichLast; ich >= 0; --ich) { - if (gr::ToLower(m_pbuf->m_rgch[ich]) == ch) + if (/*gr::*/ToLower(m_pbuf->m_rgch[ich]) == ch) return ich; } @@ -1603,11 +1603,11 @@ // Last position in m_rgch where prgch can be. int ichLast = Length() - cch; int ich; - XChar ch = gr::ToLower(prgch[0]); + XChar ch = /*gr::*/ToLower(prgch[0]); for (ich = ichMin; ich <= ichLast; ich++) { - if (gr::ToLower(m_pbuf->m_rgch[ich]) == ch && + if (/*gr::*/ToLower(m_pbuf->m_rgch[ich]) == ch && EqualsRgchCI(m_pbuf->m_rgch + ich, prgch, cch)) { return ich; @@ -1721,11 +1721,11 @@ if (ichLast > Length() - cch) ichLast = Length() - cch; - XChar ch = gr::ToLower(prgch[0]); + XChar ch = /*gr::*/ToLower(prgch[0]); int ich; for (ich = ichLast; ich >= 0; --ich) { - if (gr::ToLower(m_pbuf->m_rgch[ich]) == ch && + if (/*gr::*/ToLower(m_pbuf->m_rgch[ich]) == ch && EqualsRgchCI(m_pbuf->m_rgch + ich, prgch, cch)) { return ich; |
From: <sil...@li...> - 2005-08-22 20:31:28
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18489 Modified Files: pangographite.cpp Log Message: Sort glyphs into display order for the PangoGlyphString This fixes the cursor going way past the end of words issue still one more major cursor issue to go Index: pangographite.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/pangographite.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- pangographite.cpp 19 Aug 2005 23:10:56 -0000 1.13 +++ pangographite.cpp 22 Aug 2005 20:31:18 -0000 1.14 @@ -295,6 +295,15 @@ } #endif + +// Sort function for sorting glyphs into display order +int xpos_sort(gconstpointer a, gconstpointer b, gpointer user_data) +{ + int * x_pos = (int *)user_data; + return x_pos[*(gint *)a] - x_pos[*(gint *)b]; +} + + void graphite_PangoGlyphString(const char *text, int length, PangoFont *xftfont, PangoGlyphString *glyphs) { GrGraphics * pgrfx; @@ -384,19 +393,31 @@ Rect rs(0,0,100,100); Rect rd(0,0,100,100); - // Get the number of chars first + // Get the number of glyphs first pgrseg->GetGlyphsAndPositions(0, pgrfx, rs, rd, 0, &n_glyphs, NULL, NULL, NULL, NULL); prgchGlyphs = new utf16[n_glyphs]; - prgxd = new int[n_glyphs]; + prgxd = new int[n_glyphs+1]; prgyd = new int[n_glyphs]; prgdxdAdv = new int[n_glyphs]; // now get the list of glyphs, xoffsets, yoffsets and advances - pgrseg->GetUniscribeGlyphsAndPositions(0, pgrfx, + pgrseg->GetGlyphsAndPositions(0, pgrfx, rs, rd, n_glyphs, &n_glyphs, prgchGlyphs, prgxd, prgyd, prgdxdAdv); + + // get a sorted list of glyphs sorted into display order + GArray *sorted = g_array_sized_new(FALSE, FALSE, sizeof(gint), n_glyphs); + for (int i=0; i< n_glyphs; i++) { + g_array_append_val(sorted, i); + } + for (int i = 0; i < n_glyphs; i++) + if (g_array_index (sorted, gint, i) != i) + g_print ("ERROR: got %d instead of %d\n", + g_array_index (sorted, gint, i), i); + g_array_sort_with_data(sorted, &xpos_sort, prgxd); + int n_chars; int * prg1stOfCluster; bool * pfClusterStart; @@ -492,58 +513,74 @@ PangoRectangle logical_rect; int curr_offset = 0; + int curr_glyph; int i, j; - for (int i=0; i<n_glyphs; i++) + for (i=0; i<n_glyphs-1; i++) { - glyphs->glyphs[i].glyph = prgchGlyphs[i]; // which of these 2??? - glyphs->glyphs[i].geometry.y_offset = prgyd[i]*PANGO_SCALE; + curr_glyph = g_array_index (sorted, gint, i); + glyphs->glyphs[i].glyph = prgchGlyphs[curr_glyph]; + glyphs->glyphs[i].geometry.y_offset = prgyd[curr_glyph]*PANGO_SCALE; + + if (pfClusterStart[curr_glyph]) + { + if (prg1stCharInClust[curr_glyph]==-1) + g_warning("oops cluster wrong at %d", curr_glyph); + first_char_in_cluster = prg1stCharInClust[curr_glyph]; + } + glyphs->glyphs[i].geometry.x_offset = 0; + glyphs->glyphs[i].geometry.width = (prgxd[g_array_index (sorted, gint, i+1)] - prgxd[curr_glyph]) * PANGO_SCALE; + #ifdef WDGDEBUG + g_message("width between glyphs %d(%d) and %d(%d) is (%d - %d) * 1024 = %d", i+1, g_array_index (sorted, gint, i+1), + i, curr_glyph, prgxd[g_array_index (sorted, gint, i+1)], prgxd[curr_glyph], + glyphs->glyphs[i].geometry.width); + #endif + + glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; - pango_font_get_glyph_extents (xftfont, glyphs->glyphs[i].glyph, NULL, &logical_rect); - - - if (pfClusterStart[i]) - { - if (prg1stCharInClust[i]==-1) - g_warning("oops cluster wrong at %d", i); - first_char_in_cluster = prg1stCharInClust[i]; - } - #if 1 - glyphs->glyphs[i].geometry.width = logical_rect.width; - glyphs->glyphs[i].geometry.x_offset = (PANGO_SCALE * prgxd[i]); - #else - if (pfClusterStart[i]) - { - glyphs->glyphs[i].geometry.width = logical_rect.width; - glyphs->glyphs[i].geometry.x_offset = 0; - } - else - { - glyphs->glyphs[i].geometry.width = 0; - glyphs->glyphs[i].geometry.x_offset = curr_offset + (PANGO_SCALE * prgxd[i]) + logical_rect.width; - curr_offset += logical_rect.width; - } - #endif + #ifdef WDGDEBUG + //g_message("glyph %d(%d) has lh%d lw%d lx%d ly%d xoff%d yoff%d wid%d logcl%d", i, + g_message("glyph %d(%d) has xoff%d yoff%d (adv%d) wid%d logcl%d", i, + glyphs->glyphs[i].glyph, + glyphs->glyphs[i].geometry.x_offset, glyphs->glyphs[i].geometry.y_offset, + PANGO_SCALE * prgdxdAdv[i], + glyphs->glyphs[i].geometry.width, + glyphs->log_clusters[i]); + #endif + } - - //tmp[i] = first_char_in_cluster; - #if !NEW_LOG_CLUST - glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; - #endif - //g_message("log_cluster %d is %d of glyph %d", i, glyphs->log_clusters[i], glyphs->glyphs[i].glyph); - #ifdef WDGDEBUG - g_message("glyph %d(%d) has lh%d lw%d lx%d ly%d xoff%d yoff%d wid%d logcl%d", i, - glyphs->glyphs[i].glyph, - logical_rect.height, logical_rect.width, - logical_rect.x, logical_rect.y, - glyphs->glyphs[i].geometry.x_offset, glyphs->glyphs[i].geometry.y_offset, - glyphs->glyphs[i].geometry.width, - glyphs->log_clusters[i]); - #endif + + i = n_glyphs-1; + curr_glyph = g_array_index (sorted, gint, i); + glyphs->glyphs[i].glyph = prgchGlyphs[curr_glyph]; + glyphs->glyphs[i].geometry.y_offset = prgyd[curr_glyph]*PANGO_SCALE; + + if (pfClusterStart[curr_glyph]) + { + if (prg1stCharInClust[curr_glyph]==-1) + g_warning("oops cluster wrong at %d", curr_glyph); + first_char_in_cluster = prg1stCharInClust[curr_glyph]; } + glyphs->glyphs[i].geometry.x_offset = 0; + pango_font_get_glyph_extents (xftfont, prgchGlyphs[curr_glyph], NULL, &logical_rect); + glyphs->glyphs[i].geometry.width = logical_rect.width; + glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; + #ifdef WDGDEBUG + g_message("glyph %d(%d) has xoff%d yoff%d (adv%d) wid%d logcl%d", i, + glyphs->glyphs[i].glyph, + glyphs->glyphs[i].geometry.x_offset, glyphs->glyphs[i].geometry.y_offset, + PANGO_SCALE * prgdxdAdv[i], + glyphs->glyphs[i].geometry.width, + glyphs->log_clusters[i]); + #endif + + + + glyphs->num_glyphs = n_glyphs; + g_array_free(sorted, TRUE); delete[] prgchGlyphs; delete[] prgxd; delete[] prgyd; |
From: <sil...@li...> - 2005-08-19 23:11:06
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32295 Modified Files: Makefile.am autogen.sh configure.ac pangographite.cpp silgraphite-fc.c Log Message: experiment with dynamic loading another experiment with cursor stuff Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- Makefile.am 24 Dec 2004 23:36:42 -0000 1.8 +++ Makefile.am 19 Aug 2005 23:10:56 -0000 1.9 @@ -9,28 +9,37 @@ $(GR_CFLAGS) -EXTRA_DIST = module.diff script.diff \ - fontconfig.diff fontconfig-cvs.diff +#EXTRA_DIST = module.diff script.diff \ +# fontconfig.diff fontconfig-cvs.diff -EXTRA_DIST += $(top_srcdir)/*.h +EXTRA_DIST = $(top_srcdir)/*.h -major=$(shell echo ${PANGO_MODULE_VERSION} | sed -e 's/\(^[0-9]*\)\.[0-9]*\.[0-9]*$$/\1/') -minor=$(shell echo ${PANGO_MODULE_VERSION} | sed -e 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$$/\1/') +#major=$(shell echo ${PANGO_MODULE_VERSION} | sed -e 's/\(^[0-9]*\)\.[0-9]*\.[0-9]*$$/\1/') +#minor=$(shell echo ${PANGO_MODULE_VERSION} | sed -e 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$$/\1/') -moduledir = $(libdir)/silgraphite/pango/$(major).$(minor).0 +#moduledir = $(libdir)/silgraphite/pango/$(major).$(minor).0 +moduledir = $(libdir)/pango/${PANGO_MODULE_VERSION}/modules module_LTLIBRARIES = pango-silgraphite-fc.la -silgraphite_fc_sources = silgraphite-fc.c GrTextSrc.cpp \ +lib_LTLIBRARIES = libsilgraphitepango.la + +silgraphite_fc_sources = silgraphite-fc.c +pangographite_sources = GrTextSrc.cpp \ GrGraphics.cpp pangographite.cpp pango_silgraphite_fc_la_LDFLAGS = -export-dynamic -avoid-version -module -pango_silgraphite_fc_la_LIBADD = $(PANGO_LIBS) $(GR_LIBS) +pango_silgraphite_fc_la_LIBADD = $(PANGO_LIBS) pango_silgraphite_fc_la_SOURCES = $(silgraphite_fc_sources) +libsilgraphitepango_la_LIBADD = $(PANGO_LIBS) $(GR_LIBS) +libsilgraphitepango_la_SOURCES = $(pangographite_sources) + + + noinst_PROGRAMS = stressengine testtext #bin_PROGRAMS = stressengine testtext -stressengine_LDADD = $(PANGO_LIBS) $(GRLIBS) pango-silgraphite-fc.la +stressengine_LDADD = $(PANGO_LIBS) $(GRLIBS) libsilgraphitepango.la stressengine_SOURCES = stressengine.cpp testtext_LDADD = $(GTK_LIBS) Index: autogen.sh =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/autogen.sh,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- autogen.sh 29 Jul 2004 14:13:12 -0000 1.2 +++ autogen.sh 19 Aug 2005 23:10:56 -0000 1.3 @@ -1,4 +1,11 @@ #!/bin/sh +echo "*** Recreating libtool files" +if test -z $LTIZE; then +LTIZE="$AUTODIR""libtoolize" +fi +echo "$LTIZE" + $LTIZE -f -c; + ACLOCAL="$AUTODIR""aclocal" echo "*** Recreating aclocal.m4" echo "$ACLOCAL" Index: configure.ac =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/configure.ac,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- configure.ac 24 Dec 2004 23:35:05 -0000 1.6 +++ configure.ac 19 Aug 2005 23:10:56 -0000 1.7 @@ -118,7 +118,7 @@ fi -PANGO_MODULE_VERSION=`$PKG_CONFIG --modversion pango` +PANGO_MODULE_VERSION=`$PKG_CONFIG --variable=pango_module_version pango` AC_SUBST(PANGO_MODULE_VERSION) PKG_CHECK_MODULES(PANGO, glib-2.0 pango pangoft2 pangoxft freetype2 fontconfig) AC_SUBST(PANGO_CFLAGS) Index: pangographite.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/pangographite.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- pangographite.cpp 5 Aug 2005 09:43:40 -0000 1.12 +++ pangographite.cpp 19 Aug 2005 23:10:56 -0000 1.13 @@ -491,7 +491,7 @@ PangoGlyph index; PangoRectangle logical_rect; - int prev_offset = 0; + int curr_offset = 0; int i, j; for (int i=0; i<n_glyphs; i++) @@ -499,11 +499,8 @@ glyphs->glyphs[i].glyph = prgchGlyphs[i]; // which of these 2??? glyphs->glyphs[i].geometry.y_offset = prgyd[i]*PANGO_SCALE; - glyphs->glyphs[i].geometry.x_offset = PANGO_SCALE * prgxd[i]; - - pango_font_get_glyph_extents (xftfont, glyphs->glyphs[i].glyph, NULL, &logical_rect); - glyphs->glyphs[i].geometry.width = logical_rect.width; + if (pfClusterStart[i]) { @@ -511,26 +508,42 @@ g_warning("oops cluster wrong at %d", i); first_char_in_cluster = prg1stCharInClust[i]; } + #if 1 + glyphs->glyphs[i].geometry.width = logical_rect.width; + glyphs->glyphs[i].geometry.x_offset = (PANGO_SCALE * prgxd[i]); + #else + if (pfClusterStart[i]) + { + glyphs->glyphs[i].geometry.width = logical_rect.width; + glyphs->glyphs[i].geometry.x_offset = 0; + } + else + { + glyphs->glyphs[i].geometry.width = 0; + glyphs->glyphs[i].geometry.x_offset = curr_offset + (PANGO_SCALE * prgxd[i]) + logical_rect.width; + curr_offset += logical_rect.width; + } + #endif //tmp[i] = first_char_in_cluster; #if !NEW_LOG_CLUST glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; #endif + //g_message("log_cluster %d is %d of glyph %d", i, glyphs->log_clusters[i], glyphs->glyphs[i].glyph); + #ifdef WDGDEBUG + g_message("glyph %d(%d) has lh%d lw%d lx%d ly%d xoff%d yoff%d wid%d logcl%d", i, + glyphs->glyphs[i].glyph, + logical_rect.height, logical_rect.width, + logical_rect.x, logical_rect.y, + glyphs->glyphs[i].geometry.x_offset, glyphs->glyphs[i].geometry.y_offset, + glyphs->glyphs[i].geometry.width, + glyphs->log_clusters[i]); + #endif } glyphs->num_glyphs = n_glyphs; - // From pango_shape for debug - /* Set glyphs[i].attr.is_cluster_start based on log_clusters[] - */ - int last_cluster = -1; - for (int i = 0; i < glyphs->num_glyphs; i++) - { - if (glyphs->log_clusters[i] != last_cluster) - { - last_cluster = glyphs->log_clusters[i]; - } - } + delete[] prgchGlyphs; delete[] prgxd; delete[] prgyd; Index: silgraphite-fc.c =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/silgraphite-fc.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- silgraphite-fc.c 12 Aug 2005 15:40:09 -0000 1.6 +++ silgraphite-fc.c 19 Aug 2005 23:10:56 -0000 1.7 @@ -20,16 +20,21 @@ * Boston, MA 02111-1307, USA. */ -#include <string.h> - -#include <glib/gprintf.h> +#include <gmodule.h> #include <pango/pango-engine.h> #include <pango/pango-utils.h> #include <pango/pangofc-font.h> #include <pango/pangoxft.h> #include "pangographite.h" -#define DEBUGPATTERN 0 +static gboolean have_graphite = FALSE; +static gboolean graphite_initialised = FALSE; + +void graphite_PangoGlyphString(const char *text, int length, PangoFont *font, PangoGlyphString *glyphs); +typedef void (*pgraphite_real_shape) (const char *text, int length, PangoFont *font, PangoGlyphString *glyphs); + +static pgraphite_real_shape graphite_real_shape; +static GModule *graphitelibrary = NULL; /* No extra fields needed */ typedef PangoEngineShape GraphiteEngineFc; @@ -39,7 +44,6 @@ #define RENDER_TYPE PANGO_RENDER_TYPE_FC static PangoEngineScriptInfo graphite_scripts[] = { - //{ PANGO_SCRIPT_COMMON, "*" }, { PANGO_SCRIPT_COMMON, "*" }, /* Zyyy */ { PANGO_SCRIPT_INHERITED, "*" }, /* Qaai */ { PANGO_SCRIPT_ARABIC, "*" }, /* Arab */ @@ -95,18 +99,17 @@ { PANGO_SCRIPT_SHAVIAN, "*" }, /* Shaw */ { PANGO_SCRIPT_LINEAR_B, "*" }, /* Linb */ { PANGO_SCRIPT_TAI_LE, "*" }, /* Tale */ - { PANGO_SCRIPT_UGARITIC, "*" }, /* Ugar */ - - /* Unicode-4.1 additions */ - { PANGO_SCRIPT_NEW_TAI_LUE, "*" }, /* Talu */ + { PANGO_SCRIPT_UGARITIC, "*" } /* Ugar */ +#if 0 + /* Unicode-4.1 additions (requires pango >= 1.9.1) */ + ,{ PANGO_SCRIPT_NEW_TAI_LUE, "*" }, /* Talu */ { PANGO_SCRIPT_BUGINESE, "*" }, /* Bugi */ { PANGO_SCRIPT_GLAGOLITIC, "*" }, /* Glag */ { PANGO_SCRIPT_TIFINAGH, "*" }, /* Tfng */ { PANGO_SCRIPT_SYLOTI_NAGRI, "*" }, /* Sylo */ { PANGO_SCRIPT_OLD_PERSIAN, "*" }, /* Xpeo */ { PANGO_SCRIPT_KHAROSHTHI, "*" } /* Khar */ - - //{ PANGO_SCRIPT_PREFERRED, "*" } +#endif }; static PangoEngineInfo script_engines[] = { @@ -128,28 +131,14 @@ PangoGlyphString *glyphs) { g_return_if_fail (PANGO_XFT_IS_FONT (font)); - #ifdef WDGDEBUG - g_message("going for a graphite shaping!"); - #endif + g_return_if_fail (have_graphite); static GStaticMutex mutex = G_STATIC_MUTEX_INIT; - #ifdef WDGDEBUG - g_message("lock mutex"); - #endif g_static_mutex_lock (&mutex); // Do Graphite Shaping - #ifdef WDGDEBUG - g_message("locked"); - #endif - graphite_PangoGlyphString(text, length, font, glyphs); - #ifdef WDGDEBUG - g_message("got glyph string"); - #endif + (*graphite_real_shape)(text, length, font, glyphs); g_static_mutex_unlock (&mutex); - #ifdef WDGDEBUG - g_message("unlocked mutex"); - #endif } static PangoCoverageLevel @@ -160,10 +149,9 @@ { PangoFcFont *fcfont; char * fontcap; - - #ifdef WDGDEBUG - g_message("graphite_engine_covers %s", pango_language_to_string(lang)); - #endif + + if (!have_graphite) + return PANGO_COVERAGE_NONE; // First check that the font covers the lang PangoCoverage *coverage = pango_font_get_coverage (font, lang); @@ -172,9 +160,6 @@ if (result != PANGO_COVERAGE_EXACT) { - #ifdef WDGDEBUG - g_message("graphite engine does not cover %ld", wc); - #endif return PANGO_COVERAGE_NONE; } @@ -195,39 +180,18 @@ } - #ifdef WDGDEBUG - PangoFontDescription *desc; - char *fontdesc; - - desc = pango_font_describe(font); - fontdesc = pango_font_description_to_string (desc); - pango_font_description_free(desc); - g_message("fontdesc %s", fontdesc); - g_free(fontdesc); - #endif fcfont = (PangoFcFont *)font; - //patt = fcfont->font_pattern; - //FcPatternGet (patt, "fontcap", 0, val); if (FcPatternGetString (fcfont->font_pattern, FC_CAPABILITY, 0, (FcChar8 **)&fontcap) != FcResultMatch) { - #ifdef WDGDEBUG - g_message("no string fontcap"); - #endif return PANGO_COVERAGE_NONE; } - #ifdef WDGDEBUG - g_message("fontcap %s", fontcap); - #endif if (strstr(fontcap, "ttable:Silf")) { - #ifdef WDGDEBUG - g_message("got graphite engine coverage for %ld", wc); - #endif return PANGO_COVERAGE_EXACT; } else return PANGO_COVERAGE_NONE; - // the patch for fontconfig has fontcap for font capabilities inc silgraphite tttables + // fontconfig >= 2.3.0 has fontcap for font capabilities inc silgraphite tttables #if 0 //FcResult FcPatternGet (FcPattern *p, const char *object, int id, FcValue *v) @@ -281,6 +245,27 @@ #endif static void +init_graphite (void) +{ + if (!graphite_initialised) + { + graphite_initialised = TRUE; + g_message("opening libsilgraphitepango"); + graphitelibrary = g_module_open("libsilgraphitepango", G_MODULE_BIND_LAZY); + if (graphitelibrary) + { + g_message("looking for graphite_PangoGlyphString"); + have_graphite = g_module_symbol(graphitelibrary, + "graphite_PangoGlyphString", + &graphite_real_shape); + if (!have_graphite) g_message("Failed to find graphite_PangoGlyphString"); + else g_message("Found graphite_PangoGlyphString"); + } + } +} + + +static void graphite_engine_fc_class_init (PangoEngineShapeClass *class) { class->covers = graphite_engine_covers; @@ -297,6 +282,7 @@ void PANGO_MODULE_ENTRY(init) (GTypeModule *module) { + init_graphite(); graphite_engine_fc_register_type (module); g_message("init pangographite"); } @@ -311,6 +297,7 @@ PANGO_MODULE_ENTRY(list) (PangoEngineInfo **engines, int *n_engines) { + init_graphite(); *engines = script_engines; *n_engines = G_N_ELEMENTS (script_engines); } |
From: <sil...@li...> - 2005-08-13 08:25:12
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19534 Modified Files: GdlExpression.h Log Message: comment out the assignment operator it breaks compilation on gcc4 and isn't used anywhere anyway (i.e. it still compiles and links without it) Index: GdlExpression.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/GdlExpression.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- GdlExpression.h 16 Apr 2004 22:26:49 -0000 1.7 +++ GdlExpression.h 13 Aug 2005 08:25:04 -0000 1.8 @@ -134,7 +134,7 @@ virtual void PrettyPrint(GrcManager * pcman, std::ostream & strmOut) = 0; private: - void operator=(GdlExpression); // don't call the assignment operator + //void operator=(GdlExpression); // don't call the assignment operator protected: // Instance variables: |
From: <sil...@li...> - 2005-08-12 22:18:02
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22239 Modified Files: Makefile.am Log Message: get make distcheck to work Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/Makefile.am,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- Makefile.am 25 Oct 2004 19:31:54 -0000 1.16 +++ Makefile.am 12 Aug 2005 22:17:53 -0000 1.17 @@ -14,6 +14,7 @@ dist-hook: find $(distdir) -name CVS | xargs rm -rf cd $(distdir)/contrib && rm -rf fonts freetype pangomod wxHelloWorld XftHelloWorld + chmod +w $(top_srcdir)/contrib/Perl cd $(top_srcdir)/contrib/Perl && perl Makefile.PL cd $(top_srcdir)/contrib/Perl && make realclean |
From: <sil...@li...> - 2005-08-12 15:40:21
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20329 Modified Files: silgraphite-fc.c Log Message: add languages from unicode 4.1 (need an ifdef as this will be pango > 1.8) remove some unnecessary debug Index: silgraphite-fc.c =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/silgraphite-fc.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- silgraphite-fc.c 5 Aug 2005 09:43:40 -0000 1.5 +++ silgraphite-fc.c 12 Aug 2005 15:40:09 -0000 1.6 @@ -29,7 +29,6 @@ #include <pango/pangoxft.h> #include "pangographite.h" -#define GOFORIT 1 #define DEBUGPATTERN 0 /* No extra fields needed */ @@ -88,7 +87,7 @@ { PANGO_SCRIPT_BUHID, "*" }, /* Buhd */ { PANGO_SCRIPT_TAGBANWA, "*" }, /* Tagb */ - /* Unicode-4.0 additions */ + /* Unicode-4.0 additions */ { PANGO_SCRIPT_BRAILLE, "*" }, /* Brai */ { PANGO_SCRIPT_CYPRIOT, "*" }, /* Cprt */ { PANGO_SCRIPT_LIMBU, "*" }, /* Limb */ @@ -96,8 +95,17 @@ { PANGO_SCRIPT_SHAVIAN, "*" }, /* Shaw */ { PANGO_SCRIPT_LINEAR_B, "*" }, /* Linb */ { PANGO_SCRIPT_TAI_LE, "*" }, /* Tale */ - { PANGO_SCRIPT_UGARITIC, "*" } /* Ugar */ + { PANGO_SCRIPT_UGARITIC, "*" }, /* Ugar */ + /* Unicode-4.1 additions */ + { PANGO_SCRIPT_NEW_TAI_LUE, "*" }, /* Talu */ + { PANGO_SCRIPT_BUGINESE, "*" }, /* Bugi */ + { PANGO_SCRIPT_GLAGOLITIC, "*" }, /* Glag */ + { PANGO_SCRIPT_TIFINAGH, "*" }, /* Tfng */ + { PANGO_SCRIPT_SYLOTI_NAGRI, "*" }, /* Sylo */ + { PANGO_SCRIPT_OLD_PERSIAN, "*" }, /* Xpeo */ + { PANGO_SCRIPT_KHAROSHTHI, "*" } /* Khar */ + //{ PANGO_SCRIPT_PREFERRED, "*" } }; @@ -110,71 +118,6 @@ } }; -#if !GOFORIT -G_BEGIN_DECLS - -/* Zero Width characters: - * - * 200B ZERO WIDTH SPACE - * 200C ZERO WIDTH NON-JOINER - * 200D ZERO WIDTH JOINER - * 200E LEFT-TO-RIGHT MARK - * 200F RIGHT-TO-LEFT MARK - * 202A LEFT-TO-RIGHT EMBEDDING - * 202B RIGHT-TO-LEFT EMBEDDING - * 202C POP DIRECTIONAL FORMATTING - * 202D LEFT-TO-RIGHT OVERRIDE - * 202E RIGHT-TO-LEFT OVERRIDE - * FEFF ZERO WIDTH NO-BREAK SPACE - */ - -#define ZERO_WIDTH_CHAR(wc)\ -(((wc) >= 0x200B && (wc) <= 0x200F) || ((wc) >= 0x202A && (wc) <= 0x202E) || ((wc) == 0xFEFF)) - -G_END_DECLS - -static void -swap_range (PangoGlyphString *glyphs, - int start, - int end) -{ - int i, j; - - for (i = start, j = end - 1; i < j; i++, j--) - { - PangoGlyphInfo glyph_info; - gint log_cluster; - - glyph_info = glyphs->glyphs[i]; - glyphs->glyphs[i] = glyphs->glyphs[j]; - glyphs->glyphs[j] = glyph_info; - - log_cluster = glyphs->log_clusters[i]; - glyphs->log_clusters[i] = glyphs->log_clusters[j]; - glyphs->log_clusters[j] = log_cluster; - } -} - -static void -set_glyph (PangoFont *font, - PangoGlyphString *glyphs, - int i, - int offset, - PangoGlyph glyph) -{ - PangoRectangle logical_rect; - - glyphs->glyphs[i].glyph = glyph; - - glyphs->glyphs[i].geometry.x_offset = 0; - glyphs->glyphs[i].geometry.y_offset = 0; - - glyphs->log_clusters[i] = offset; - - pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, NULL, &logical_rect); - glyphs->glyphs[i].geometry.width = logical_rect.width; -} -#endif static void graphite_engine_shape (PangoEngineShape *engine, @@ -184,7 +127,6 @@ PangoAnalysis *analysis, PangoGlyphString *glyphs) { -#if GOFORIT g_return_if_fail (PANGO_XFT_IS_FONT (font)); #ifdef WDGDEBUG g_message("going for a graphite shaping!"); @@ -208,233 +150,8 @@ #ifdef WDGDEBUG g_message("unlocked mutex"); #endif -#else - #ifdef WDGDEBUG - g_message("graphite_engine_shape just doing basic shape"); - #endif - PangoFcFont *fc_font = PANGO_FC_FONT (font); - int n_chars; - int i; - const char *p; - - g_return_if_fail (font != NULL); - g_return_if_fail (text != NULL); - g_return_if_fail (length >= 0); - g_return_if_fail (analysis != NULL); - - //g_message("basic fc shape %s", text); - - - n_chars = g_utf8_strlen (text, length); - pango_glyph_string_set_size (glyphs, n_chars); - - pango_fc_font_lock_face (fc_font); - - p = text; - for (i = 0; i < n_chars; i++) - { - gunichar wc; - gunichar mirrored_ch; - PangoGlyph index; - - wc = g_utf8_get_char (p); - - if (analysis->level % 2) - if (pango_get_mirror_char (wc, &mirrored_ch)) - wc = mirrored_ch; - - if (wc == 0xa0) /* non-break-space */ - wc = 0x20; - - if (ZERO_WIDTH_CHAR (wc)) - { - set_glyph (font, glyphs, i, p - text, 0); - } - else - { - index = pango_fc_font_get_glyph (fc_font, wc); - - if (!index) - { - set_glyph (font, glyphs, i, p - text, - pango_fc_font_get_unknown_glyph (fc_font, wc)); - } - else - { - set_glyph (font, glyphs, i, p - text, index); - - if (g_unichar_type (wc) == G_UNICODE_NON_SPACING_MARK) - { - if (i > 0) - { - PangoRectangle logical_rect, ink_rect; - - glyphs->glyphs[i].geometry.width = MAX (glyphs->glyphs[i-1].geometry.width, - glyphs->glyphs[i].geometry.width); - glyphs->glyphs[i-1].geometry.width = 0; - glyphs->log_clusters[i] = glyphs->log_clusters[i-1]; - - /* Some heuristics to try to guess how overstrike glyphs are - * done and compensate - */ - pango_font_get_glyph_extents (font, glyphs->glyphs[i].glyph, &ink_rect, &logical_rect); - if (logical_rect.width == 0 && ink_rect.x == 0) - glyphs->glyphs[i].geometry.x_offset = (glyphs->glyphs[i].geometry.width - ink_rect.width) / 2; - } - } - } - } - - p = g_utf8_next_char (p); - } - - /* Simple bidi support; most bidi languages (Arabic, Hebrew, Syriac) - * are in fact handled in other modules. - */ - if (analysis->level % 2) - { - int start, end; - - /* Swap all glyphs */ - swap_range (glyphs, 0, n_chars); - - /* Now reorder glyphs within each cluster back to LTR */ - for (start = 0; start < n_chars;) - { - end = start; - while (end < n_chars && - glyphs->log_clusters[end] == glyphs->log_clusters[start]) - end++; - - swap_range (glyphs, start, end); - start = end; - } - } - - pango_fc_font_kern_glyphs (fc_font, glyphs); - - pango_fc_font_unlock_face (fc_font); -#endif -} -#if DEBUGPATTERN -typedef enum _FcValueBinding { - FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame -} FcValueBinding; - -typedef struct _FcValueList { - struct _FcValueList *next; - FcValue value; - FcValueBinding binding; -} FcValueList; - - -typedef struct _FcPatternElt { - const char *object; - FcValueList *values; -} FcPatternElt; - -struct _FcPattern { - int num; - int size; - FcPatternElt *elts; - int ref; -}; - -static int -wdgFcPatternPosition (const FcPattern *p, const char *object) -{ - int low, high, mid, c; - - low = 0; - high = p->num - 1; - c = 1; - mid = 0; - while (low <= high) - { - mid = (low + high) >> 1; - c = strcmp (p->elts[mid].object, object); - g_message("comparing %d %s to %s", mid, p->elts[mid].object, object); - if (c == 0) - return mid; - if (c < 0) - { - low = mid + 1; - g_message("going low %d", low); - } - else - { - high = mid - 1; - g_message("going high %d", high); - } - g_message("low %d high %d mid %d", low, mid, high); - } - if (c < 0) - mid++; - return -(mid + 1); } - -FcPatternElt * -wdgFcPatternFindElt (const FcPattern *p, const char *object) -{ - int i = wdgFcPatternPosition (p, object); - g_message("position of %s is %d", object, i); - if (i < 0) - return 0; - return &p->elts[i]; -} - - -FcResult -wdgFcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v) -{ - FcPatternElt *e; - FcValueList *l; - - e = wdgFcPatternFindElt (p, object); - if (!e) - { - g_message("no findelt"); - return FcResultNoMatch; - } - for (l = e->values; l; l = l->next) - { - if (!id) - { - *v = l->value; - return FcResultMatch; - } - id--; - } - g_message("no id"); - return FcResultNoId; -} - - - - -FcResult -wdgFcPatternGetString (const FcPattern *p, const char *object, int id, FcChar8 ** s) -{ - FcValue v; - FcResult r; - - r = wdgFcPatternGet (p, object, id, &v); - if (r != FcResultMatch) - { - g_message("failed to match"); - return r; - } - if (v.type != FcTypeString) - { - g_message("type mismatch"); - return FcResultTypeMismatch; - } - *s = (FcChar8 *) v.u.s; - return FcResultMatch; -} -#endif - static PangoCoverageLevel graphite_engine_covers (PangoEngineShape *engine, PangoFont *font, @@ -491,11 +208,7 @@ fcfont = (PangoFcFont *)font; //patt = fcfont->font_pattern; //FcPatternGet (patt, "fontcap", 0, val); - #if DEGBUGPATTERN - if (wdgFcPatternGetString (fcfont->font_pattern, FC_CAPABILITY, 0, (FcChar8 **)&fontcap) != FcResultMatch) - #else if (FcPatternGetString (fcfont->font_pattern, FC_CAPABILITY, 0, (FcChar8 **)&fontcap) != FcResultMatch) - #endif { #ifdef WDGDEBUG g_message("no string fontcap"); |
From: <sil...@li...> - 2005-08-12 11:25:52
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6239/src/GrEngine Modified Files: GrSlotState.h Log Message: need to declare GrSlotStream Index: GrSlotState.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- GrSlotState.h 10 Jun 2005 16:36:56 -0000 1.16 +++ GrSlotState.h 12 Aug 2005 11:25:44 -0000 1.17 @@ -25,6 +25,7 @@ class GrSlotAbstract; class GrSlotState; class GrSlotOutput; +class GrSlotStream; //:End Ignore |
From: <sil...@li...> - 2005-08-12 11:18:01
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4608 Modified Files: explicit_instantiations.cpp Log Message: gcc4 template fix Index: explicit_instantiations.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/explicit_instantiations.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- explicit_instantiations.cpp 22 Jul 2004 12:10:12 -0000 1.7 +++ explicit_instantiations.cpp 12 Aug 2005 11:17:53 -0000 1.8 @@ -23,58 +23,58 @@ // Types we use: -template Vector<bool>; -template Vector<int>; -template Vector<utf16>; -template Vector<byte>; -template Vector<long>; -template Vector<unsigned int>; +template class Vector<bool>; +template class Vector<int>; +template class Vector<utf16>; +template class Vector<byte>; +template class Vector<long>; +template class Vector<unsigned int>; -template Vector<StrAnsi>; -template Vector<StrUni>; +template class Vector<StrAnsi>; +template class Vector<StrUni>; -template Vector<ExpressionType>; -template Vector<Symbol>; +template class Vector<ExpressionType>; +template class Vector<Symbol>; -template Vector<GdlFeatureDefn*>; -template Vector<GdlFeatureSetting*>; -template Vector<GdlExtName>; +template class Vector<GdlFeatureDefn*>; +template class Vector<GdlFeatureSetting*>; +template class Vector<GdlExtName>; -template Vector<GdlGlyphClassDefn*>; -template Vector<GdlGlyphClassMember*>; -template Vector<GdlGlyphAttrSetting*>; +template class Vector<GdlGlyphClassDefn*>; +template class Vector<GdlGlyphClassMember*>; +template class Vector<GdlGlyphAttrSetting*>; -//template Vector<GdlIdentifierDefn*>; +//template class Vector<GdlIdentifierDefn*>; -template Vector<GdlRuleTable*>; -template Vector<GdlPass*>; -template Vector<GdlRule*>; -template Vector<GdlRuleItem*>; -template Vector<GdlAttrValueSpec*>; -template Vector<GdlAlias*>; +template class Vector<GdlRuleTable*>; +template class Vector<GdlPass*>; +template class Vector<GdlRule*>; +template class Vector<GdlRuleItem*>; +template class Vector<GdlAttrValueSpec*>; +template class Vector<GdlAlias*>; -template Vector<GdlExpression*>; -template Vector<GdlSlotRefExpression*>; +template class Vector<GdlExpression*>; +template class Vector<GdlSlotRefExpression*>; -template Vector<GrcErrorItem*>; -template Vector<GrcEnv>; +template class Vector<GrcErrorItem*>; +template class Vector<GrcEnv>; -template Vector<FsmMachineClass *>; -template Vector<FsmState *>; +template class Vector<FsmMachineClass *>; +template class Vector<FsmState *>; -template HashMap<utf16, int>; -template HashMap<utf16, utf16>; -template HashMap<Symbol, GdlAssignment*>; -template HashMap<Symbol, GrcMasterValueList*>; -template HashMap<Symbol, int>; -template HashMap<StrAnsi, Symbol, HashStrAnsi, EqlStrAnsi>; -template HashMap<int, GdlNameDefn*>; -template HashMap<int, Vector<FsmMachineClass *> *>; +template class HashMap<utf16, int>; +template class HashMap<utf16, utf16>; +template class HashMap<Symbol, GdlAssignment*>; +template class HashMap<Symbol, GrcMasterValueList*>; +template class HashMap<Symbol, int>; +template class HashMap<StrAnsi, Symbol, HashStrAnsi, EqlStrAnsi>; +template class HashMap<int, GdlNameDefn*>; +template class HashMap<int, Vector<FsmMachineClass *> *>; -template Set<int>; -template Set<utf16>; -template Set<unsigned int>; -template Set<GdlGlyphDefn *>; -template Set<GdlGlyphClassDefn *>; -template Set<FsmMachineClass *>; -template Set<Symbol>; +template class Set<int>; +template class Set<utf16>; +template class Set<unsigned int>; +template class Set<GdlGlyphDefn *>; +template class Set<GdlGlyphClassDefn *>; +template class Set<FsmMachineClass *>; +template class Set<Symbol>; |
From: <sil...@li...> - 2005-08-12 11:17:37
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4483 Modified Files: ParserTreeWalker.cpp Log Message: needs errno.h Index: ParserTreeWalker.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/ParserTreeWalker.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- ParserTreeWalker.cpp 27 May 2005 10:21:14 -0000 1.11 +++ ParserTreeWalker.cpp 12 Aug 2005 11:17:29 -0000 1.12 @@ -23,6 +23,7 @@ #else #include <unistd.h> #include <sys/wait.h> +#include <errno.h> #endif #pragma hdrstop |
From: <sil...@li...> - 2005-08-12 11:14:17
|
Update of /cvsroot/silgraphite/silgraphite/src/Generic In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3865 Modified Files: UtilString.cpp Log Message: found something that seems to work on gcc4 that doesn't break gcc3 Index: UtilString.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/UtilString.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- UtilString.cpp 10 Aug 2005 13:49:52 -0000 1.10 +++ UtilString.cpp 12 Aug 2005 11:14:08 -0000 1.11 @@ -39,12 +39,12 @@ //:>******************************************************************************************** //:Associate with StrBase<utf16>. +template <utf16> StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. template class StrBase<utf16>; // Instantiation for XChar = utf16. -StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. //:Associate with StrBase<schar>. +template <schar> StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. template class StrBase<schar>; // Instantiation for XChar = schar. -StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. /*---------------------------------------------------------------------------------------------- |
From: <sil...@li...> - 2005-08-10 13:50:04
|
Update of /cvsroot/silgraphite/silgraphite/src/Generic In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9064 Modified Files: UtilString.cpp Log Message: revert gcc4 change until consistently compiles and links on gcc3 and gcc4 Index: UtilString.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/UtilString.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- UtilString.cpp 5 Aug 2005 09:38:36 -0000 1.9 +++ UtilString.cpp 10 Aug 2005 13:49:52 -0000 1.10 @@ -39,12 +39,12 @@ //:>******************************************************************************************** //:Associate with StrBase<utf16>. -//template class StrBase<utf16>; // Instantiation for XChar = utf16. -template<> StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. +template class StrBase<utf16>; // Instantiation for XChar = utf16. +StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. //:Associate with StrBase<schar>. -//template class StrBase<schar>; // Instantiation for XChar = schar. -template<> StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. +template class StrBase<schar>; // Instantiation for XChar = schar. +StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. /*---------------------------------------------------------------------------------------------- |
From: <sil...@li...> - 2005-08-05 09:46:22
|
Update of /cvsroot/silgraphite/silgraphite/src/lib In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18876/src/lib Modified Files: Platform.cpp Log Message: fix strlen bugs in grcompiler Index: Platform.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/Platform.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- Platform.cpp 16 Sep 2004 15:36:58 -0000 1.13 +++ Platform.cpp 5 Aug 2005 09:46:13 -0000 1.14 @@ -138,7 +138,7 @@ utf16 *utf16ncpy(utf16 *dest, const utf16 *src, size_t n) { - memcpy(dest, src, sizeof(utf16) * std::max(utf16len(src), n)); + memcpy(dest, src, sizeof(utf16) * std::min(utf16len(src, n), n)); return dest; } @@ -157,6 +157,14 @@ return s - start; } +size_t utf16len(const utf16 *s, size_t n) +{ + const utf16 *start = s; + for (; *s && s - start <= n; ++s) ; + + return s - start; +} + size_t utf8len(const char *s) { static const int is_initial[] = {1, 1, 0, 1}; |
From: <sil...@li...> - 2005-08-05 09:46:21
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18876/src/GrCompiler Modified Files: Compiler.cpp GrcManager.cpp OutputToFont.cpp Log Message: fix strlen bugs in grcompiler Index: Compiler.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/Compiler.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- Compiler.cpp 9 Jun 2004 23:29:07 -0000 1.10 +++ Compiler.cpp 5 Aug 2005 09:46:13 -0000 1.11 @@ -133,7 +133,8 @@ { // Return -1. vbActions.Push(kopPushByte); - vbActions.Push(-1); +// vbActions.Push(-1); + vbActions.Push(0xFF); vbActions.Push(kopPopRet); } else Index: GrcManager.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/GrcManager.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- GrcManager.cpp 16 Apr 2004 22:26:50 -0000 1.6 +++ GrcManager.cpp 5 Aug 2005 09:46:13 -0000 1.7 @@ -117,7 +117,7 @@ int cRet = m_nMaxJLevel; if (cRet == -1) cRet = 1; // no levels specified - else if (cRet = -2) + else if (cRet == -2) cRet = 0; // no justification else cRet++; // to account for level 0 Index: OutputToFont.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrCompiler/OutputToFont.cpp,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- OutputToFont.cpp 16 Apr 2004 22:26:50 -0000 1.10 +++ OutputToFont.cpp 5 Aug 2005 09:46:13 -0000 1.11 @@ -511,7 +511,7 @@ if (pchwFamilyName) delete [] pchwFamilyName; - if (pchwFullName != pchwFamilyName) + if (pchwFullName != NULL && pchwFullName != pchwFamilyName) delete [] pchwFullName; return true; @@ -648,13 +648,14 @@ else { // other styles do include subfamily in the full font name cchwFullName = cchwFamilyName + cbSubFamily / sizeof(utf16) + 1; // 1 - room for space - pchwFullName = new uint16[cchwFullName]; + pchwFullName = new uint16[cchwFullName + 1]; if (!pchwFullName) return false; utf16ncpy(pchwFullName, pchwFamilyName, cchwFamilyName); - pchwFullName[cchwFamilyName] = (wchar_t)0x2000; // big endian Unicode space + pchwFullName[cchwFamilyName] = swapw(0x0020); // big endian Unicode space utf16ncpy(pchwFullName + cchwFamilyName + 1, (utf16 *)(pSubFamily), cbSubFamily / sizeof(utf16)); + pchwFullName[cchwFullName] = 0; } *ppchwFamilyName = pchwFamilyName; |
From: <sil...@li...> - 2005-08-05 09:46:21
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18876/include Modified Files: GrPlatform.h Log Message: fix strlen bugs in grcompiler Index: GrPlatform.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrPlatform.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- GrPlatform.h 3 Sep 2004 10:57:55 -0000 1.12 +++ GrPlatform.h 5 Aug 2005 09:46:12 -0000 1.13 @@ -170,6 +170,7 @@ #endif size_t utf16len(const utf16 *s); +size_t utf16len(const utf16 *s, size_t n); size_t utf8len(const char *s); |
From: <sil...@li...> - 2005-08-05 09:44:02
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18492 Modified Files: pangographite.cpp pangographite.h prop-editor.c silgraphite-fc.c stressengine.cpp Log Message: latest experimentation don't require pango patch cursor hack experiments and stuff with log clusters ifdefd out Index: pangographite.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/pangographite.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- pangographite.cpp 28 Feb 2005 16:08:30 -0000 1.11 +++ pangographite.cpp 5 Aug 2005 09:43:40 -0000 1.12 @@ -30,73 +30,351 @@ #include "pangographite.h" static GrGraphics *cached_grfx = NULL; + +#if CACHE_SEGMENTS +static GList *segment_cache = NULL; //static GrEngine *xftgreng; + +// How to implement caching? +// What exactly needs cached? + +class GrCache +{ +private: + const char * m_text; + int m_length; + GrSegment *m_grseg; + GrGraphics *m_grfx; + GrEngine *m_greng; + GrTextSrc *m_grtxt; + GrCharProps *m_grchp; + +public: + GrCache(const char *, int, GrSegment*, GrGraphics*, + GrEngine*,GrTextSrc*,GrCharProps*); + ~GrCache(); + + GrSegment* segment() {return m_grseg;}; + GrGraphics* graphics() {return m_grfx;}; + const char* text() {return m_text;}; + int length() {return m_length;} +}; + +GrCache::GrCache(const char *text, int length, GrSegment *pgrseg, + GrGraphics *pgrfx, GrEngine *pgreng, + GrTextSrc *pgrtxt, GrCharProps *pgrchp) : + m_length(length), m_grseg(pgrseg), m_grfx(pgrfx), + m_greng(pgreng), m_grtxt(pgrtxt), m_grchp(pgrchp) +{ + m_text = strdup(text); +} + +GrCache::~GrCache() +{ + delete m_grseg; + delete m_grfx; + delete m_greng; + delete m_grtxt; + delete m_grchp; + delete[] m_text; +} + +gint segment_compare (gconstpointer a, gconstpointer b) +{ + GrCache* acache = (GrCache*) a; + GrCache* bcache = (GrCache*) b; + if (acache->length() != bcache->length()) + { + if (acache->length() > bcache->length()) + return 1; + else + return -1; + } + return strcmp(acache->text(), bcache->text()); +} + +GrSegment *graphite_GetSegment(const char *text, int length, GrGraphics **pgrfx) +{ + GList *found; + GrSegment *pgrseg = NULL; + *pgrfx = NULL; + GrCache *cachecomp = new GrCache(text, length, 0, 0, 0, 0, 0); + found = g_list_find_custom(segment_cache, cachecomp, &segment_compare); + delete cachecomp; + if (found) + { + GrCache *foundcache = (GrCache*) found->data; + + pgrseg = foundcache->segment(); + *pgrfx = foundcache->graphics(); + } + return pgrseg; +} + +void graphite_CacheSegment(const char *text, int length, GrSegment *pgrseg, + GrGraphics *pgrfx, GrEngine *pgreng, + GrTextSrc *pgrtext, GrCharProps *pgrchp) +{ + GrCache *cache = new GrCache(text, length, pgrseg, pgrfx, + pgreng, pgrtext, pgrchp); + segment_cache = g_list_append(segment_cache, cache); +} + + +int byte_to_graphite_index(const char *text, int length, int index) +{ + //WARNING Quick and dirty implementation + glong graphite_index, bytesread; + utf16 *subby = g_utf8_to_utf16(text, index, &bytesread, &graphite_index, NULL); + g_free(subby); + return graphite_index; +} + +// How to implement this using grsegment? + +void graphite_glyph_string_x_to_index (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int x_pos, + int *index, + gboolean *trailing) +{ +} + +void graphite_glyph_string_index_to_x (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int index, + gboolean trailing, + int *x_pos) +{ + Rect rs(0,0,100,100); + Rect rd(0,0,100,100); + GrGraphics *pgrfx; + GrSegment *pgrseg; + RECT rPrimary, rSecondary; + bool bPrimary, bSecondary; + int insertion_point; + pgrseg = graphite_GetSegment(text, length, &pgrfx); + if (!pgrseg) + g_warning("unable to find cached segment for %s:%d", text, length); + + insertion_point = byte_to_graphite_index(text, length, index); + + pgrseg->PositionsOfIP(0, pgrfx, rs, rd, insertion_point, + trailing, kdmNormal, &rPrimary, &rSecondary, + &bPrimary, &bSecondary); + + if (bPrimary) { + *x_pos = PANGO_SCALE * rPrimary.left; + } + else if (bSecondary) { + g_message("using secondary"); + *x_pos = PANGO_SCALE * rSecondary.left; + } + else if (index == 0) { + x_pos = 0; + } + else { + g_warning("failed to find x_pos for index %d", index); + } +} + +#endif + + +/*---------------------------------------------------------------------------------------------- + Fill in bounding rectangles for the (possibly 2-part) IP, in destination device coordinates. + Return flags indicating which of the 2 parts where rendered here. + + @param rs,rd - source/destination coordinates, for scaling + @param ichwIP - insertion point + @param fAssocPrev - is the IP "leaning" backward? + @param dm - draw mode: + kdmNormal = draw complete insertion pt (I-beam or split cursor); + kdmPrimary = only draw primary half of split cursor; + kdmSecondary = only draw secondary half of split cursor + @param prdPrimary - return location of primary selection, in dest coords + @param prdSecondary - return location of secondary selection, in dest coords + @param pfPrimaryHere - true if we filled in prdPrimary + @param pfSecHere - true if we filled in prdSecondary +---------------------------------------------------------------------------------------------- +GrResult GrSegment::PositionsOfIP(int ichwBase, IGrGraphics * pgg, + RECT rs, RECT rd, int ichwIP, bool fAssocPrev, LgIPDrawMode dm, + RECT * prdPrimary, RECT * prdSecondary, + bool * pfPrimaryHere, bool * pfSecHere) +*/ + +#if NEW_LOG_CLUST +static void +set_up_pango_log_clusters (gboolean rtl, + int itemlen, + WORD *usp_log_clusters, + int nglyphs, + gint *pango_log_clusters, + int char_offset) +/* e.g. + itemlen = items[item+1].iCharPos - items[item].iCharPos; + set_up_pango_log_clusters (items[item].a.fRTL, itemlen, log_clusters, + nglyphs, glyphs->log_clusters + ng, + items[item].iCharPos); +*/ + + { + int j, k; + int first_char_in_cluster; + + if (rtl) + { + /* RTL. Walk Uniscribe log_clusters array backwards, build Pango + * log_clusters array forwards. + */ + int glyph0 = 0; + first_char_in_cluster = itemlen - 1; + for (j = itemlen - 1; j >= 0; j--) + { + if (j < itemlen - 1 && usp_log_clusters[j+1] != usp_log_clusters[j]) + { + /* Cluster starts */ + first_char_in_cluster = j; + } + if (j == 0) + { + /* First char, cluster ends */ + for (k = glyph0; k < nglyphs; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + } + else if (usp_log_clusters[j-1] == usp_log_clusters[j]) + { + /* Cluster continues */ + first_char_in_cluster = j-1; + } + else + { + /* Cluster ends */ + for (k = glyph0; k <= usp_log_clusters[j]; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + glyph0 = usp_log_clusters[j] + 1; + } + } + } + else + { + /* LTR. Walk Uniscribe log_clusters array forwards, build Pango + * log_clusters array also forwards. + */ + first_char_in_cluster = 0; + for (j = 0; j < itemlen; j++) + { + if (j > 0 && usp_log_clusters[j-1] != usp_log_clusters[j]) + { + /* Cluster starts */ + first_char_in_cluster = j; + } + if (j == itemlen - 1) + { + /* Last char, cluster ends */ + for (k = usp_log_clusters[j]; k < nglyphs; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + } + else if (usp_log_clusters[j] == usp_log_clusters[j+1]) + { + /* Cluster continues */ + } + else + { + /* Cluster ends */ + for (k = usp_log_clusters[j]; k < usp_log_clusters[j+1]; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + } + } + } +} +#endif + void graphite_PangoGlyphString(const char *text, int length, PangoFont *xftfont, PangoGlyphString *glyphs) { - GrEngine *xftgreng = new GrEngine(); GrGraphics * pgrfx; - if (cached_grfx) + GrSegment * pgrseg; + GrEngine *xftgreng; + GrTextSrc * pgrtext; + GrCharProps * pchrp; + #if CACHE_SEGMENTS + bool using_cache = true; + pgrseg = graphite_GetSegment(text, length, &pgrfx); + if (!pgrseg) { - if (cached_grfx->getFont()==xftfont) + using_cache = false; + #endif + xftgreng = new GrEngine(); + if (cached_grfx) { - pgrfx = cached_grfx; + if (cached_grfx->getFont()==xftfont) + { + pgrfx = cached_grfx; + } + else + { + delete cached_grfx; + pgrfx = new GrGraphics(xftfont); + cached_grfx = pgrfx; + } } else { - delete cached_grfx; pgrfx = new GrGraphics(xftfont); cached_grfx = pgrfx; } + int cchSeg; // how many characters fit in the segment + int dxWidth; // width of resulting segment + LgEndSegmentType est; // why the segment was ended + byte rgbNextSeg[256]; + int ciNextSeg; + OLECHAR errmsg[128]; + int dichContext; + + pchrp = new GrCharProps(); + memset(pchrp, '\0', sizeof(GrCharProps)); + //pchrp->dympHeight = size * 1000; // font size in millipoints + pgrtext = new GrTextSrc(text, length, *pchrp, "", 0); + xftgreng->InitRenderer(pgrfx, NULL, 0); + GrResult res = xftgreng->FindBreakPoint(pgrfx, pgrtext, + 0, // start at the beginning of the string + 10000, 10000, // try to handle entire string if possible + false, // need final break + true, // is this the first segment on the line? + 2560000, // width available + klbWordBreak, // preferred kind of line break + klbClipBreak, // worst-case line break + ktwshAll, // standard handling of trailing white space + false, // paragraph is left-to-right + &pgrseg, + &cchSeg, &dxWidth, &est, + 0, NULL, // no preceding segment to handle + 256, rgbNextSeg, &ciNextSeg, // info for following segment, exception thrown if this missing + &dichContext, // index of first char of interest to following seg + errmsg, 128); // for returning an error message + + if (res != kresOk) + { + g_warning("Could not create Graphite segment."); + delete pchrp; + delete pgrtext; + //delete pgrfx; + delete xftgreng; + return; + } + #if CACHE_SEGMENTS + graphite_CacheSegment(text, length, pgrseg, pgrfx, xftgreng, pgrtext, pchrp); + // WARNING no-one is managing this grseg at the moment - might be ok in cache + // also, there is only a single global grfx at the moment + // of the greng, txtsrc, chrp what else needs held? } - else - { - pgrfx = new GrGraphics(xftfont); - cached_grfx = pgrfx; - } - int cchSeg; // how many characters fit in the segment - int dxWidth; // width of resulting segment - LgEndSegmentType est; // why the segment was ended - byte rgbNextSeg[256]; - int ciNextSeg; - OLECHAR errmsg[128]; - int dichContext; - GrSegment * pgrseg; - - GrCharProps * pchrp = new GrCharProps(); - memset(pchrp, '\0', sizeof(GrCharProps)); - //pchrp->dympHeight = size * 1000; // font size in millipoints - GrTextSrc * pgrtext; - pgrtext = new GrTextSrc(text, length, *pchrp, "", 0); - - xftgreng->InitRenderer(pgrfx, NULL, 0); - GrResult res = xftgreng->FindBreakPoint(pgrfx, pgrtext, - 0, // start at the beginning of the string - 10000, 10000, // try to handle entire string if possible - false, // need final break - true, // is this the first segment on the line? - 2560000, // width available - klbWordBreak, // preferred kind of line break - klbClipBreak, // worst-case line break - ktwshAll, // standard handling of trailing white space - false, // paragraph is left-to-right - &pgrseg, - &cchSeg, &dxWidth, &est, - 0, NULL, // no preceding segment to handle - 256, rgbNextSeg, &ciNextSeg, // info for following segment, exception thrown if this missing - &dichContext, // index of first char of interest to following seg - errmsg, 128); // for returning an error message - - if (res != kresOk) - { - g_warning("Could not create Graphite segment."); - delete pchrp; - delete pgrtext; - //delete pgrfx; - delete xftgreng; - return; - } - + #endif + // now need to get a PangoGlyphString from pgrseg utf16 * prgchGlyphs; int * prgxd; @@ -119,7 +397,6 @@ pgrseg->GetUniscribeGlyphsAndPositions(0, pgrfx, rs, rd, n_glyphs, &n_glyphs, prgchGlyphs, prgxd, prgyd, prgdxdAdv); - int n_chars; int * prg1stOfCluster; bool * pfClusterStart; @@ -127,27 +404,48 @@ int first_char_in_cluster, last_cluster_start = 0; int cluster_width = 0; int cch, cf; - //int * tmp; // find the length (in utf8 chars) of textsource - pgrtext->get_Length(&n_chars); + n_chars = g_utf8_strlen (text, length); + //for each char in the utf8 string the first glyph that is in that cluster prg1stOfCluster = new int[n_chars]; // for each glyph whether or not it is the first in a cluster pfClusterStart = new bool[n_glyphs]; // for each glyph the first char that is in that cluster prg1stCharInClust = new int[n_glyphs]; - //tmp = new int[n_glyphs]; - #ifdef WDGDEBUG - g_message("%d chars, %d glyphs: %s", n_chars, n_glyphs, text); - #endif - - pgrseg->GetUniscribeClusters(0, pgrfx, prg1stOfCluster, n_chars, &cch, pfClusterStart, n_glyphs, &cf); - + + #if NEW_LOG_CLUST + int first_char_in_cluster = 0; + for (int j = 0; j < itemlen; j++) + { + if (j > 0 && usp_log_clusters[j-1] != usp_log_clusters[j]) + { + /* Cluster starts */ + first_char_in_cluster = j; + } + if (j == itemlen - 1) + { + /* Last char, cluster ends */ + for (k = usp_log_clusters[j]; k < nglyphs; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + } + else if (usp_log_clusters[j] == usp_log_clusters[j+1]) + { + /* Cluster continues */ + } + else + { + /* Cluster ends */ + for (k = usp_log_clusters[j]; k < usp_log_clusters[j+1]; k++) + pango_log_clusters[k] = first_char_in_cluster + char_offset; + } + } + #else // BUG? single character strings prg1stOfCluster[0] = -1 // This isn't right though because it isn't guaranteed to be 0 prg1stOfCluster[0] = 0; @@ -155,27 +453,9 @@ { prg1stCharInClust[i] = -1; } - #ifdef WDGDEBUG - for (int i=0; i < n_chars; i++) - { - if ((prg1stOfCluster[i] < 0) || (prg1stOfCluster[i] >= n_glyphs)) - { - g_warning("char %d has a bad 1stof cluster %d", i, prg1stOfCluster[i]); - } - - } - #endif prg1stCharInClust[0] = 0; for (int i=n_chars-1; i>=0; i--) { - #ifdef WDGDEBUG - g_message("prg1stCharInClust[%d] = %d", prg1stOfCluster[i], i); - if (prg1stOfCluster[i]<0) - { - g_warning("prg1stOfCluster[%d]=%d < 0 => not good", i, prg1stOfCluster[i]); - } - else - #endif prg1stCharInClust[prg1stOfCluster[i]] = i; } for (int i=1; i < n_glyphs; i++) @@ -201,16 +481,13 @@ } if (j < 0 || j >= n_glyphs) { - g_message("char %d out of range --%d", j, n_glyphs); + g_warning("char %d out of range --%d", j, n_glyphs); } prg1stCharInClust[i] = prg1stCharInClust[j]; } - #ifdef WDGDEBUG - g_message("1charin of glyph %d is %d(%d)", i, prg1stCharInClust[i], pfClusterStart[i]); - #endif } - - pango_glyph_string_set_size (glyphs, n_glyphs); + #endif + pango_glyph_string_set_size(glyphs, n_glyphs); PangoGlyph index; PangoRectangle logical_rect; @@ -219,8 +496,6 @@ for (int i=0; i<n_glyphs; i++) { - //g_message("char %d", i); - //glyphs->glyphs[i].glyph = pango_fc_font_get_glyph ((PangoFcFont *) xftfont, prgchGlyphs[i]); glyphs->glyphs[i].glyph = prgchGlyphs[i]; // which of these 2??? glyphs->glyphs[i].geometry.y_offset = prgyd[i]*PANGO_SCALE; @@ -228,9 +503,7 @@ pango_font_get_glyph_extents (xftfont, glyphs->glyphs[i].glyph, NULL, &logical_rect); - glyphs->glyphs[i].geometry.width = logical_rect.width; // !!WRONG - glyphs can overlap - // what I think I want to get is the forward width (advance?) for each glyph in a cluster - // then divide it by the number of glyphs in the cluster + glyphs->glyphs[i].geometry.width = logical_rect.width; if (pfClusterStart[i]) { @@ -241,22 +514,23 @@ //tmp[i] = first_char_in_cluster; + #if !NEW_LOG_CLUST glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; - - #ifdef WDGDEBUG - g_message("glyph %d has lh%d lw%d lx%d ly%d xoff%d yoff%d wid%d logcl%d", i, - logical_rect.height, logical_rect.width, - logical_rect.x, logical_rect.y, - glyphs->glyphs[i].geometry.x_offset, glyphs->glyphs[i].geometry.y_offset, - glyphs->glyphs[i].geometry.width, - glyphs->log_clusters[i]); #endif - - } glyphs->num_glyphs = n_glyphs; - + // From pango_shape for debug + /* Set glyphs[i].attr.is_cluster_start based on log_clusters[] + */ + int last_cluster = -1; + for (int i = 0; i < glyphs->num_glyphs; i++) + { + if (glyphs->log_clusters[i] != last_cluster) + { + last_cluster = glyphs->log_clusters[i]; + } + } delete[] prgchGlyphs; delete[] prgxd; delete[] prgyd; @@ -265,15 +539,12 @@ delete[] pfClusterStart; delete[] prg1stCharInClust; //delete[] tmp; + #if !CACHE_SEGMENTS delete pgrseg; delete pgrtext; delete pchrp; - //delete pgrseg; //delete pgrfx; //dtor cleans up font delete xftgreng; - #ifdef WDGDEBUG - g_message("%d glyphs:%d:%s", glyphs->num_glyphs, length, text ); #endif - } Index: pangographite.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/pangographite.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- pangographite.h 20 Aug 2004 23:42:26 -0000 1.2 +++ pangographite.h 5 Aug 2005 09:43:40 -0000 1.3 @@ -21,11 +21,33 @@ */ +#define CURSORHACK 0 +#define NEW_LOG_CLUST 0 +#define CACHE_SEGMENTS 1 + #ifdef __cplusplus extern "C" { #endif void graphite_PangoGlyphString(const char *text, int length, PangoFont *font, PangoGlyphString *glyphs); +#if CURSORHACK +void graphite_glyph_string_x_to_index (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int x_pos, + int *index, + gboolean *trailing); + + +void graphite_glyph_string_index_to_x (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int index, + gboolean trailing, + int *x_pos); +#endif #ifdef __cplusplus } Index: prop-editor.c =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/prop-editor.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- prop-editor.c 27 Aug 2004 11:23:19 -0000 1.1 +++ prop-editor.c 5 Aug 2005 09:43:40 -0000 1.2 @@ -692,7 +692,7 @@ GtkWidget *vbox; GtkWidget *table; GParamSpec **specs; - gint n_specs; + guint n_specs; int i; if (G_TYPE_IS_INTERFACE (type)) Index: silgraphite-fc.c =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/silgraphite-fc.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- silgraphite-fc.c 16 Sep 2004 14:44:31 -0000 1.4 +++ silgraphite-fc.c 5 Aug 2005 09:43:40 -0000 1.5 @@ -1,7 +1,7 @@ /* Pango * silgraphite-fc.c: SILGraphite based shaper for FreeType-based backends * - * Copyright (C) 2004 SIL International + * Copyright (C) 2004-2005 SIL International * Author: Daniel Glassey <wd...@de...> * * This library is free software; you can redistribute it and/or @@ -40,8 +40,65 @@ #define RENDER_TYPE PANGO_RENDER_TYPE_FC static PangoEngineScriptInfo graphite_scripts[] = { - //{ PANGO_SCRIPT_COMMON, "*" } - { PANGO_SCRIPT_PREFERRED, "*" } + //{ PANGO_SCRIPT_COMMON, "*" }, + { PANGO_SCRIPT_COMMON, "*" }, /* Zyyy */ + { PANGO_SCRIPT_INHERITED, "*" }, /* Qaai */ + { PANGO_SCRIPT_ARABIC, "*" }, /* Arab */ + { PANGO_SCRIPT_ARMENIAN, "*" }, /* Armn */ + { PANGO_SCRIPT_BENGALI, "*" }, /* Beng */ + { PANGO_SCRIPT_BOPOMOFO, "*" }, /* Bopo */ + { PANGO_SCRIPT_CHEROKEE, "*" }, /* Cher */ + { PANGO_SCRIPT_COPTIC, "*" }, /* Qaac */ + { PANGO_SCRIPT_CYRILLIC, "*" }, /* Cyrl (Cyrs) */ + { PANGO_SCRIPT_DESERET, "*" }, /* Dsrt */ + { PANGO_SCRIPT_DEVANAGARI, "*" }, /* Deva */ + { PANGO_SCRIPT_ETHIOPIC, "*" }, /* Ethi */ + { PANGO_SCRIPT_GEORGIAN, "*" }, /* Geor (Geon, Geoa) */ + { PANGO_SCRIPT_GOTHIC, "*" }, /* Goth */ + { PANGO_SCRIPT_GREEK, "*" }, /* Grek */ + { PANGO_SCRIPT_GUJARATI, "*" }, /* Gujr */ + { PANGO_SCRIPT_GURMUKHI, "*" }, /* Guru */ + { PANGO_SCRIPT_HAN, "*" }, /* Hani */ + { PANGO_SCRIPT_HANGUL, "*" }, /* Hang */ + { PANGO_SCRIPT_HEBREW, "*" }, /* Hebr */ + { PANGO_SCRIPT_HIRAGANA, "*" }, /* Hira */ + { PANGO_SCRIPT_KANNADA, "*" }, /* Knda */ + { PANGO_SCRIPT_KATAKANA, "*" }, /* Kana */ + { PANGO_SCRIPT_KHMER, "*" }, /* Khmr */ + { PANGO_SCRIPT_LAO, "*" }, /* Laoo */ + { PANGO_SCRIPT_LATIN, "*" }, /* Latn (Latf, Latg) */ + { PANGO_SCRIPT_MALAYALAM, "*" }, /* Mlym */ + { PANGO_SCRIPT_MONGOLIAN, "*" }, /* Mong */ + { PANGO_SCRIPT_MYANMAR, "*" }, /* Mymr */ + { PANGO_SCRIPT_OGHAM, "*" }, /* Ogam */ + { PANGO_SCRIPT_OLD_ITALIC, "*" }, /* Ital */ + { PANGO_SCRIPT_ORIYA, "*" }, /* Orya */ + { PANGO_SCRIPT_RUNIC, "*" }, /* Runr */ + { PANGO_SCRIPT_SINHALA, "*" }, /* Sinh */ + { PANGO_SCRIPT_SYRIAC, "*" }, /* Syrc (Syrj, Syrn, Syre) */ + { PANGO_SCRIPT_TAMIL, "*" }, /* Taml */ + { PANGO_SCRIPT_TELUGU, "*" }, /* Telu */ + { PANGO_SCRIPT_THAANA, "*" }, /* Thaa */ + { PANGO_SCRIPT_THAI, "*" }, /* Thai */ + { PANGO_SCRIPT_TIBETAN, "*" }, /* Tibt */ + { PANGO_SCRIPT_CANADIAN_ABORIGINAL, "*" }, /* Cans */ + { PANGO_SCRIPT_YI, "*" }, /* Yiii */ + { PANGO_SCRIPT_TAGALOG, "*" }, /* Tglg */ + { PANGO_SCRIPT_HANUNOO, "*" }, /* Hano */ + { PANGO_SCRIPT_BUHID, "*" }, /* Buhd */ + { PANGO_SCRIPT_TAGBANWA, "*" }, /* Tagb */ + + /* Unicode-4.0 additions */ + { PANGO_SCRIPT_BRAILLE, "*" }, /* Brai */ + { PANGO_SCRIPT_CYPRIOT, "*" }, /* Cprt */ + { PANGO_SCRIPT_LIMBU, "*" }, /* Limb */ + { PANGO_SCRIPT_OSMANYA, "*" }, /* Osma */ + { PANGO_SCRIPT_SHAVIAN, "*" }, /* Shaw */ + { PANGO_SCRIPT_LINEAR_B, "*" }, /* Linb */ + { PANGO_SCRIPT_TAI_LE, "*" }, /* Tale */ + { PANGO_SCRIPT_UGARITIC, "*" } /* Ugar */ + + //{ PANGO_SCRIPT_PREFERRED, "*" } }; static PangoEngineInfo script_engines[] = { @@ -129,14 +186,28 @@ { #if GOFORIT g_return_if_fail (PANGO_XFT_IS_FONT (font)); - //g_message("going for a graphite shaping!"); + #ifdef WDGDEBUG + g_message("going for a graphite shaping!"); + #endif static GStaticMutex mutex = G_STATIC_MUTEX_INIT; + #ifdef WDGDEBUG + g_message("lock mutex"); + #endif g_static_mutex_lock (&mutex); // Do Graphite Shaping + #ifdef WDGDEBUG + g_message("locked"); + #endif graphite_PangoGlyphString(text, length, font, glyphs); + #ifdef WDGDEBUG + g_message("got glyph string"); + #endif g_static_mutex_unlock (&mutex); + #ifdef WDGDEBUG + g_message("unlocked mutex"); + #endif #else #ifdef WDGDEBUG g_message("graphite_engine_shape just doing basic shape"); @@ -455,11 +526,56 @@ #endif } +#if CURSORHACK +void +graphite_engine_glyph_string_x_to_index (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int x_pos, + int *index, + gboolean *trailing) +{ + //g_message("graphite_glyph_string_x_to_index"); + pango_glyph_string_x_to_index (glyphs, + text, + length, + analysis, + x_pos, + index, + trailing); +} + +void +graphite_engine_glyph_string_index_to_x (PangoGlyphString *glyphs, + const char *text, + int length, + PangoAnalysis *analysis, + int index, + gboolean trailing, + int *x_pos) +{ + //g_message("graphite_glyph_string_index_to_x"); + graphite_glyph_string_index_to_x (glyphs, + text, + length, + analysis, + index, + trailing, + x_pos); +} + +#endif + static void graphite_engine_fc_class_init (PangoEngineShapeClass *class) { class->covers = graphite_engine_covers; class->script_shape = graphite_engine_shape; + #if CURSORHACK + class->glyph_string_index_to_x = graphite_engine_glyph_string_index_to_x; + class->glyph_string_x_to_index = graphite_engine_glyph_string_x_to_index; + #endif } PANGO_ENGINE_SHAPE_DEFINE_TYPE (GraphiteEngineFc, graphite_engine_fc, Index: stressengine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/stressengine.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- stressengine.cpp 20 Aug 2004 23:42:26 -0000 1.2 +++ stressengine.cpp 5 Aug 2005 09:43:40 -0000 1.3 @@ -4,14 +4,12 @@ #include "pangographite.h" - -const char text[15] = "Hello World!!!"; Display * display; int screen_num; static PangoCoverageLevel graphite_engine_covers (PangoFont *font) -{ +{ PangoFontDescription *desc; PangoFcFont *fcfont; char * fontcap; @@ -69,8 +67,19 @@ } -int main() +int main(int argc, char *argv[]) +{ +gchar *text; +gsize len; + +//if (!g_file_get_contents("burmese4.txt", &text, &len, NULL)) +if (!g_file_get_contents("ipa_test.txt", &text, &len, NULL)) { +printf("failed to read burmese file\n"); +exit(-1); +} + + PangoGlyphString *glyphs; PangoFont *font; //XftFont *xftfont; @@ -91,7 +100,8 @@ XFT_SIZE, XftTypeInteger, 12, 0); #endif PangoFontMap *fmap = pango_xft_get_font_map(display, screen_num); - PangoFontDescription *fdesc = pango_font_description_from_string("Std SILDoulos"); + PangoFontDescription *fdesc = pango_font_description_from_string("Doulos SIL"); + //PangoFontDescription *fdesc = pango_font_description_from_string("Padauk"); pango_font_description_set_size(fdesc, 12*PANGO_SCALE); //PangoContext *context; font = pango_font_map_load_font (fmap, NULL, fdesc); |
From: <sil...@li...> - 2005-08-05 09:40:41
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18206 Modified Files: UtilString.h Log Message: ifdef out more stuff that is FW only Index: UtilString.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/UtilString.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- UtilString.h 10 Jun 2005 16:36:53 -0000 1.9 +++ UtilString.h 5 Aug 2005 09:40:30 -0000 1.10 @@ -248,6 +248,7 @@ #endif + /*---------------------------------------------------------------------------------------------- Get a pointer and cch (count of characters) for a string with id stid defined in a resource header file. @@ -321,6 +322,7 @@ return cch1 - cch2; } +#ifdef GR_FW /*---------------------------------------------------------------------------------------------- Case insensitive equality. This function can be used for either ansi (8 bit) or unicode @@ -338,7 +340,7 @@ return true; } - +#endif //:>******************************************************************************************** //:> Text conversion functions for converting between unicode and ansi. //:>******************************************************************************************** @@ -1186,6 +1188,7 @@ return Compare(psz, StrLen(psz)) >= 0; } +#ifdef GR_FW //:> Case insensitive compare. /*------------------------------------------------------------------------------------------ @@ -1226,7 +1229,7 @@ return false; return EqualsRgchCI(m_pbuf->m_rgch, prgch, m_pbuf->Cch()); } - +#endif //:>**************************************************************************************** //:> Extraction. @@ -1417,6 +1420,7 @@ return -1; } +#ifdef GR_FW /*------------------------------------------------------------------------------------------ Return the zero-based index, no less than ichMin, of the first character in this @@ -1440,7 +1444,7 @@ return -1; } - +#endif /*------------------------------------------------------------------------------------------ Return the zero-based index, no greater than ichLast, of the last character in this StrBase<> that matches the requested character, ch. Return -1 if the character, ch, is @@ -1463,6 +1467,7 @@ return -1; } +#ifdef GR_FW /*------------------------------------------------------------------------------------------ Return the zero-based index, no greater than ichLast, of the last character in this @@ -1487,7 +1492,7 @@ return -1; } - +#endif /*------------------------------------------------------------------------------------------ Return the zero-based index, no less than ichMin, of the first character of the first substring in this StrBase<> that matches the substring, stb, passed as a parameter. @@ -1548,6 +1553,7 @@ return -1; } +#ifdef GR_FW /*------------------------------------------------------------------------------------------ Return the zero-based index, no less than ichMin, of the first character of the first @@ -1610,7 +1616,7 @@ return -1; } - +#endif /*------------------------------------------------------------------------------------------ Return the zero-based index, no greater than ichLast, of the first character of the last substring in this StrBase<> that matches the substring, stb, passed as a parameter. @@ -1668,6 +1674,7 @@ return -1; } +#ifdef GR_FW /*------------------------------------------------------------------------------------------ Return the zero-based index, no greater than ichLast, of the first character of the @@ -1727,7 +1734,7 @@ return -1; } - +#endif protected: friend class StrBase<YChar>; |
From: <sil...@li...> - 2005-08-05 09:38:46
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17551/GrEngine Modified Files: explicit_instantiations.cpp Log Message: fixes to compile and link on gcc4 works fine on gcc3.3 so if it breaks msvc please don't revert but discuss on list Index: explicit_instantiations.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/explicit_instantiations.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- explicit_instantiations.cpp 29 May 2004 19:16:44 -0000 1.8 +++ explicit_instantiations.cpp 5 Aug 2005 09:38:36 -0000 1.9 @@ -24,15 +24,15 @@ { // Types we use: -template std::vector<int>; -template std::vector<bool>; -template std::vector<GrSlotState *>; -template std::vector<GrGlyphSubTable *>; -template std::vector<int *>; +template class std::vector<int>; +template class std::vector<bool>; +template class std::vector<GrSlotState *>; +template class std::vector<GrGlyphSubTable *>; +template class std::vector<int *>; /////template std::vector<std::wstring>; // remove -template std::vector<OLECHAR>; -template std::vector<byte>; -template std::vector<DirCode>; +template class std::vector<OLECHAR>; +template class std::vector<byte>; +template class std::vector<DirCode>; // VS6.0 doesn't like these: //template std::vector<RECT>; |
From: <sil...@li...> - 2005-08-05 09:38:46
|
Update of /cvsroot/silgraphite/silgraphite/src/Generic In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17551/Generic Modified Files: UtilString.cpp Log Message: fixes to compile and link on gcc4 works fine on gcc3.3 so if it breaks msvc please don't revert but discuss on list Index: UtilString.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/UtilString.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- UtilString.cpp 10 Jun 2005 16:36:53 -0000 1.8 +++ UtilString.cpp 5 Aug 2005 09:38:36 -0000 1.9 @@ -39,12 +39,12 @@ //:>******************************************************************************************** //:Associate with StrBase<utf16>. -template class StrBase<utf16>; // Instantiation for XChar = utf16. -StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. +//template class StrBase<utf16>; // Instantiation for XChar = utf16. +template<> StrBase<utf16>::StrBuffer StrBase<utf16>::s_bufEmpty; // Instantiation of empty utf16 buffer. //:Associate with StrBase<schar>. -template class StrBase<schar>; // Instantiation for XChar = schar. -StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. +//template class StrBase<schar>; // Instantiation for XChar = schar. +template<> StrBase<schar>::StrBuffer StrBase<schar>::s_bufEmpty; // Instantiation of empty schar buffer. /*---------------------------------------------------------------------------------------------- |
From: <sil...@li...> - 2005-08-04 14:23:10
|
Update of /cvsroot/silgraphite/silgraphite/contrib/Perl/lib/SIL/Graphite In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23368/lib/SIL/Graphite Modified Files: PerlGraphics.pm Log Message: fix for API changes and add -d to scripts/maketest Index: PerlGraphics.pm =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/Perl/lib/SIL/Graphite/PerlGraphics.pm,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- PerlGraphics.pm 12 Apr 2004 10:24:08 -0000 1.7 +++ PerlGraphics.pm 4 Aug 2005 14:22:58 -0000 1.8 @@ -10,7 +10,9 @@ sub new { my ($class, %opts) = @_; - my ($self) = {'XperInch' => 1000, 'YperInch' => 1000, 'size' => 12, %opts}; + my ($self) = {%opts}; + $self->{'XperInch'} = 1000 unless (defined $self->{'XperInch'}); + $self->{'size'} = 12 unless (defined $self->{'size'}); bless $self, $class; $self->SetupGraphics if (defined $self->{'font'}); return $self; |
From: <sil...@li...> - 2005-08-04 14:23:10
|
Update of /cvsroot/silgraphite/silgraphite/contrib/Perl/scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23368/scripts Modified Files: maketest.pl Log Message: fix for API changes and add -d to scripts/maketest Index: maketest.pl =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/Perl/scripts/maketest.pl,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- maketest.pl 17 Jul 2003 10:16:29 -0000 1.4 +++ maketest.pl 4 Aug 2005 14:22:58 -0000 1.5 @@ -3,6 +3,11 @@ use SIL::Graphite::PerlGraphics; use SIL::Graphite::PerlText; use IO::File; +use Getopt::Std; + +getopts('d:'); + +$opt_d ||= 1000; %tests = ( 'piglatin' => [ @@ -16,7 +21,8 @@ foreach $t (sort keys %tests) { - $graphics = SIL::Graphite::PerlGraphics->new(font_file => "../fonts/$t.ttf", size => 12, XperInch => 1000); +# $graphics = SIL::Graphite::PerlGraphics->new(font_file => "../fonts/$t.ttf", size => 12, XperInch => 1000); + $graphics = SIL::Graphite::PerlGraphics->new(font_file => "../fonts/$t.ttf", size => 12, XperInch => $opt_d); $gr = PerlGraphicsPtr->new($graphics); $engine = SIL::Graphite::GrEngine->new("../fonts/$t.ttf", $graphics, $gr); $text = SIL::Graphite::PerlText->new(); |