From: <sil...@li...> - 2004-12-24 23:35:18
|
Update of /cvsroot/silgraphite/silgraphite/contrib/pangomod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13388 Modified Files: GrGraphics.cpp Makefile.am configure.ac pangographite.cpp Log Message: use PANGO_PIXELS and pkgconfig check for fontconfig Index: GrGraphics.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/GrGraphics.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrGraphics.cpp 8 Nov 2004 22:28:20 -0000 1.4 +++ GrGraphics.cpp 24 Dec 2004 23:35:05 -0000 1.5 @@ -220,24 +220,24 @@ #else PangoRectangle ink_rect, logical_rect; pango_font_get_glyph_extents(m_pfont, chw, &ink_rect, &logical_rect); - *pxAdvanceX = logical_rect.width/PANGO_SCALE; + *pxAdvanceX = PANGO_PIXELS(logical_rect.width); *pyAdvanceY = 0; - *pxBoundingWidth = ink_rect.width/PANGO_SCALE; - *pyBoundingHeight = ink_rect.height/PANGO_SCALE; - *pxBoundingX = ink_rect.x/PANGO_SCALE; - *pyBoundingY = -ink_rect.y/PANGO_SCALE; + *pxBoundingWidth = PANGO_PIXELS(ink_rect.width); + *pyBoundingHeight = PANGO_PIXELS(ink_rect.height); + *pxBoundingX = PANGO_PIXELS(ink_rect.x); + *pyBoundingY = -PANGO_PIXELS(ink_rect.y); #endif #if 0 - if (*pxAdvanceX != logical_rect.width/PANGO_SCALE) - g_warning("pxAdvanceX %d != %d", *pxAdvanceX, logical_rect.width/PANGO_SCALE); - if (*pxBoundingWidth != ink_rect.width/PANGO_SCALE) - g_warning("pxBoundingWidth %d != %d", *pxBoundingWidth, ink_rect.width/PANGO_SCALE); - if (*pyBoundingHeight != ink_rect.height/PANGO_SCALE) - g_warning("pyBoundingHeight %d != %d", *pyBoundingHeight, ink_rect.height/PANGO_SCALE); - if (*pxBoundingX != ink_rect.x/PANGO_SCALE) - g_warning("pxBoundingX %d != %d", *pxBoundingX, ink_rect.x/PANGO_SCALE); - if (*pyBoundingY != (ink_rect.y - *pyBoundingHeight)/PANGO_SCALE) - g_warning("pyBoundingY %d != %d", *pyBoundingY, (ink_rect.y - *pyBoundingHeight)/PANGO_SCALE); + if (*pxAdvanceX != PANGO_PIXELS(logical_rect.width); + g_warning("pxAdvanceX %d != %d", *pxAdvanceX, PANGO_PIXELS(logical_rect.width); + if (*pxBoundingWidth != PANGO_PIXELS(ink_rect.width); + g_warning("pxBoundingWidth %d != %d", *pxBoundingWidth, PANGO_PIXELS(ink_rect.width); + if (*pyBoundingHeight != PANGO_PIXELS(ink_rect.height); + g_warning("pyBoundingHeight %d != %d", *pyBoundingHeight, PANGO_PIXELS(ink_rect.height); + if (*pxBoundingX != PANGO_PIXELS(ink_rect.x); + g_warning("pxBoundingX %d != %d", *pxBoundingX, PANGO_PIXELS(ink_rect.x); + if (*pyBoundingY != PANGO_PIXELS((ink_rect.y - *pyBoundingHeight)); + g_warning("pyBoundingY %d != %d", *pyBoundingY, PANGO_PIXELS(ink_rect.y - *pyBoundingHeight)); #endif return kresOk; } Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/Makefile.am,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- Makefile.am 27 Oct 2004 17:00:13 -0000 1.6 +++ Makefile.am 24 Dec 2004 23:35:05 -0000 1.7 @@ -27,7 +27,7 @@ pango_silgraphite_fc_la_LIBADD = $(PANGO_LIBS) $(GR_LIBS) pango_silgraphite_fc_la_SOURCES = $(silgraphite_fc_sources) -noinst_PROGRAMS = stressengine testtext +noinst_PROGRAMS = stressengine testtext tmp #bin_PROGRAMS = stressengine testtext stressengine_LDADD = $(PANGO_LIBS) $(GRLIBS) pango-silgraphite-fc.la @@ -38,5 +38,8 @@ prop-editor.c \ testtext.c testtext_CFLAGS = $(GTK_CFLAGS) +tmp_SOURCES = tmp.c +tmp_CFLAGS = $(GTK_CFLAGS) +tmp_LDADD = $(GTK_LIBS) Index: configure.ac =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/configure.ac,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- configure.ac 25 Oct 2004 22:40:30 -0000 1.5 +++ configure.ac 24 Dec 2004 23:35:05 -0000 1.6 @@ -120,7 +120,7 @@ PANGO_MODULE_VERSION=`$PKG_CONFIG --modversion pango` AC_SUBST(PANGO_MODULE_VERSION) -PKG_CHECK_MODULES(PANGO, glib-2.0 pango pangoft2 pangoxft freetype2) +PKG_CHECK_MODULES(PANGO, glib-2.0 pango pangoft2 pangoxft freetype2 fontconfig) AC_SUBST(PANGO_CFLAGS) AC_SUBST(PANGO_LIBS) PKG_CHECK_MODULES(GTK, gtk+-2.0) Index: pangographite.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/pangomod/pangographite.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- pangographite.cpp 28 Oct 2004 15:50:29 -0000 1.8 +++ pangographite.cpp 24 Dec 2004 23:35:05 -0000 1.9 @@ -110,60 +110,113 @@ // Get the number of chars first pgrseg->GetGlyphsAndPositions(0, pgrfx, rs, rd, 0, &n_glyphs, NULL, NULL, NULL, NULL); - #if 0 - g_message("%d chars: %s", n_glyphs, text); - #endif prgchGlyphs = new utf16[n_glyphs]; prgxd = new int[n_glyphs]; prgyd = new int[n_glyphs]; prgdxdAdv = new int[n_glyphs]; + // now get the list of glyphs, xoffsets, yoffsets and advances pgrseg->GetUniscribeGlyphsAndPositions(0, pgrfx, rs, rd, n_glyphs, &n_glyphs, prgchGlyphs, prgxd, prgyd, prgdxdAdv); -#ifdef NEW_CLUSTER int n_chars; int * prg1stOfCluster; bool * pfClusterStart; int * prg1stCharInClust; - + int first_char_in_cluster, last_cluster_start = 0; + int cluster_width = 0; + //int * tmp; + + // find the length (in utf8 chars) of textsource pgrtext->get_Length(&n_chars); + //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]; - //int cch, cf; + //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*/NULL, - pfClusterStart, n_glyphs, /*&cf*/NULL); + prg1stOfCluster, n_chars, NULL, + pfClusterStart, n_glyphs, NULL); - #if 1 + // BUG? single character strings prg1stOfCluster[0] = -1 + // This isn't right though because it isn't guaranteed to be 0 + prg1stOfCluster[0] = 0; for (int i=n_glyphs-1; i>0; i--) { 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 - prg1stCharInClust[prg1stOfCluster[i]] = i; - //g_message("prg1stCharInClust[%d] = %d", prg1stOfCluster[i], i); + #endif + prg1stCharInClust[prg1stOfCluster[i]] = i; } -#endif - + for (int i=1; i < n_glyphs; i++) + { + if (prg1stCharInClust[i] == -1) // 1cinc==-1 do need to deal with it + { + int j = i; + if (pfClusterStart[i]) // glyph is start of cluster + { + // travel forward to find a valid value + while (prg1stCharInClust[j] == -1) + { + j++; + } + } + else // glyph is not start of cluster + { + // travel back to find the a valid value + while (prg1stCharInClust[j] == -1) + { + j--; + } + } + if (j < 0 || j >= n_glyphs) + { + g_message("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); PangoGlyph index; PangoRectangle logical_rect; int prev_offset = 0; - + int i, j; + for (int i=0; i<n_glyphs; i++) { //g_message("char %d", i); @@ -173,68 +226,44 @@ glyphs->glyphs[i].geometry.x_offset = PANGO_SCALE * prgxd[i]; -#if 0 - // pango x offset is graphite offset - previous offset - previous width - #if 1 - glyphs->glyphs[i].geometry.x_offset = PANGO_SCALE * prgxd[i]; - #else - if (i) - glyphs->glyphs[i].geometry.x_offset = PANGO_SCALE * (prgxd[i] - prev_offset - PANGO_PIXELS(logical_rect.width)); - else - glyphs->glyphs[i].geometry.x_offset = 0; - #endif - #if 0 - if (glyphs->glyphs[i].geometry.x_offset) - { - g_message("glyphs %d xoffset %d (%d %d %d) %d", i, glyphs->glyphs[i].geometry.x_offset, - prgxd[i], prev_offset, PANGO_PIXELS(logical_rect.width), prgdxdAdv[i]); - } - else - { - g_message("glyphs %d (%d %d %d) %d", i, - prgxd[i], prev_offset, PANGO_PIXELS(logical_rect.width), prgdxdAdv[i]); - } - #endif - prev_offset = prgxd[i]; -#endif - + pango_font_get_glyph_extents (xftfont, glyphs->glyphs[i].glyph, NULL, &logical_rect); - glyphs->glyphs[i].geometry.width = logical_rect.width; - - //glyphs->log_clusters[i] = prgdxdAdv[i]; - #ifdef NEW_CLUSTER + 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 + if (pfClusterStart[i]) { if (prg1stCharInClust[i]==-1) g_warning("oops cluster wrong at %d", i); first_char_in_cluster = prg1stCharInClust[i]; } + + //tmp[i] = first_char_in_cluster; glyphs->log_clusters[i] = g_utf8_offset_to_pointer(text, first_char_in_cluster) - text; - #else - pgrseg->GlyphToChar(0, pgrfx, i, 1, &(glyphs->log_clusters[i])); - #endif - #if 0 - g_message("%d complete glyph %d xoff %d yoff %d width %d logclust %d", - i, glyphs->glyphs[i].glyph, - PANGO_PIXELS(glyphs->glyphs[i].geometry.x_offset), PANGO_PIXELS(glyphs->glyphs[i].geometry.y_offset), - PANGO_PIXELS(glyphs->glyphs[i].geometry.width), glyphs->log_clusters[i]); - #endif - //glyphs->glyphs[i].geometry.width = prgdxdAdv[i]; + #ifdef WDGDEBUG + g_message("glyph %d has lh%d lw%d lx%d ly%d xoff%d yoff%d wid%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); + #endif + } + glyphs->num_glyphs = n_glyphs; delete[] prgchGlyphs; delete[] prgxd; delete[] prgyd; delete[] prgdxdAdv; -#ifdef NEW_CLUSTER delete[] prg1stOfCluster; delete[] pfClusterStart; delete[] prg1stCharInClust; -#endif + //delete[] tmp; delete pgrseg; delete pgrtext; delete pchrp; |