From: <kp...@us...> - 2008-09-02 10:56:36
|
Revision: 13505 http://jedit.svn.sourceforge.net/jedit/?rev=13505&view=rev Author: kpouer Date: 2008-09-02 10:56:34 +0000 (Tue, 02 Sep 2008) Log Message: ----------- a little javadoc Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-02 01:31:36 UTC (rev 13504) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-02 10:56:34 UTC (rev 13505) @@ -46,6 +46,8 @@ * @param gfx The graphics context * @param x The x co-ordinate * @param y The y co-ordinate + * @param glyphVector true if we want to use glyphVector, false if we + * want to use drawString * @return The width of the painted text * @since jEdit 4.2pre1 */ @@ -255,30 +257,28 @@ //{{{ xToOffset() method public final int xToOffset(float x, boolean round) { - if(!visible) + if (!visible) { - if(round && width - x < x) + if (round && width - x < x) return offset + length; else return offset; } - else + + float[] pos = getPositions(); + + for(int i = 0; i < length; i++) { - float[] pos = getPositions(); + float glyphX = pos[i*2]; + float nextX = (i == length - 1 + ? width : pos[i*2+2]); - for(int i = 0; i < length; i++) + if(nextX > x) { - float glyphX = pos[i*2]; - float nextX = (i == length - 1 - ? width : pos[i*2+2]); - - if(nextX > x) - { - if(!round || nextX - x > x - glyphX) - return offset + i; - else - return offset + i + 1; - } + if(!round || nextX - x > x - glyphX) + return offset + i; + else + return offset + i + 1; } } @@ -307,11 +307,10 @@ visible = true; str = new String(seg.array,seg.offset + offset,length); - - Rectangle2D logicalBounds; + gv = style.getFont().createGlyphVector( fontRenderContext, str); - logicalBounds = gv.getLogicalBounds(); + Rectangle2D logicalBounds = gv.getLogicalBounds(); width = (float)logicalBounds.getWidth(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2008-09-08 22:11:51
|
Revision: 13622 http://jedit.svn.sourceforge.net/jedit/?rev=13622&view=rev Author: k_satoda Date: 2008-09-08 22:11:47 +0000 (Mon, 08 Sep 2008) Log Message: ----------- Add a workaround for a bug in Sun Java 5, because jEdit 4.3 should run on Java 5. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266084 Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-08 03:02:36 UTC (rev 13621) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-08 22:11:47 UTC (rev 13622) @@ -308,7 +308,21 @@ str = new String(seg.array,seg.offset + offset,length); + char[] textArray = seg.array; int textStart = seg.offset + offset; + // {{{ Workaround for a bug in Sun Java 5 + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266084 + if (SUN_JAVA_5) + { + // textLimit is used as a text count in + // layoutGlyphVector(). So it works only the + // case textStart is 0. + char[] copy = new char[length]; + System.arraycopy(textArray, textStart, + copy, 0, length); + textArray = copy; + textStart = 0; + } //}}} int textLimit = textStart + length; // FIXME: Need BiDi support. int layoutFlags = Font.LAYOUT_LEFT_TO_RIGHT @@ -316,7 +330,7 @@ | Font.LAYOUT_NO_LIMIT_CONTEXT; gv = style.getFont().layoutGlyphVector( fontRenderContext, - seg.array, textStart, textLimit, layoutFlags); + textArray, textStart, textLimit, layoutFlags); Rectangle2D logicalBounds = gv.getLogicalBounds(); width = (float)logicalBounds.getWidth(); @@ -325,5 +339,22 @@ //{{{ Private members private float[] positions; + + // Flag to enable a workaround for a bug in Sun Java 5. + private static final boolean SUN_JAVA_5; + static + { + boolean sun_java_5 = false; + String vendor = System.getProperty("java.vendor"); + if (vendor != null && vendor.startsWith("Sun")) + { + String version = System.getProperty("java.version"); + if (version != null && version.startsWith("1.5")) + { + sun_java_5 = true; + } + } + SUN_JAVA_5 = sun_java_5; + } //}}} } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2008-09-09 18:25:41
|
Revision: 13633 http://jedit.svn.sourceforge.net/jedit/?rev=13633&view=rev Author: k_satoda Date: 2008-09-09 18:25:38 +0000 (Tue, 09 Sep 2008) Log Message: ----------- Extended the scope of the workaround in r13622 to cover Mac OS X because the same problem was reported on it. http://www.nabble.com/--jedit-Patches-2096752---Embeddable-text-area-to19369320.html#a19386108 Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-09 16:41:47 UTC (rev 13632) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2008-09-09 18:25:38 UTC (rev 13633) @@ -346,7 +346,10 @@ { boolean sun_java_5 = false; String vendor = System.getProperty("java.vendor"); - if (vendor != null && vendor.startsWith("Sun")) + // Enable the workaround on Apple JVM, too, because the + // same problem was reported on Mac OS X. + if (vendor != null && (vendor.startsWith("Sun") || + vendor.startsWith("Apple"))) { String version = System.getProperty("java.version"); if (version != null && version.startsWith("1.5")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2010-01-18 17:06:54
|
Revision: 16954 http://jedit.svn.sourceforge.net/jedit/?rev=16954&view=rev Author: k_satoda Date: 2010-01-18 17:06:40 +0000 (Mon, 18 Jan 2010) Log Message: ----------- Extended the scope of the workaround in r13622 to cover IBM JVM because the same problem was reported on it. http://old.nabble.com/start-failure-tp27146746p27159162.html Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-01-18 17:01:10 UTC (rev 16953) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-01-18 17:06:40 UTC (rev 16954) @@ -346,10 +346,12 @@ { boolean sun_java_5 = false; String vendor = System.getProperty("java.vendor"); - // Enable the workaround on Apple JVM, too, because the - // same problem was reported on Mac OS X. - if (vendor != null && (vendor.startsWith("Sun") || - vendor.startsWith("Apple"))) + // Enable the workaround on Apple and IBM JVM, too, + // because the same problem was reported on them. + if (vendor != null && + (vendor.startsWith("Sun") || + vendor.startsWith("Apple") || + vendor.startsWith("IBM"))) { String version = System.getProperty("java.version"); if (version != null && version.startsWith("1.5")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Alan E. <ala...@gm...> - 2010-01-18 17:09:43
|
Why check for vendors now, when it seems like all of the supported ones are included in the list? It seems to me, if we come across a vendor for which the workaround is *NOT* needed, it would be better to add a check for *that*. On Mon, Jan 18, 2010 at 9:06 AM, <k_s...@us...> wrote: > Revision: 16954 > http://jedit.svn.sourceforge.net/jedit/?rev=16954&view=rev > Author: k_satoda > Date: 2010-01-18 17:06:40 +0000 (Mon, 18 Jan 2010) > > Log Message: > ----------- > Extended the scope of the workaround in r13622 to cover IBM JVM because > the same problem was reported on it. > > http://old.nabble.com/start-failure-tp27146746p27159162.html > > Modified Paths: > -------------- > jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java > > Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java > =================================================================== > --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-01-18 17:01:10 > UTC (rev 16953) > +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-01-18 17:06:40 > UTC (rev 16954) > @@ -346,10 +346,12 @@ > { > boolean sun_java_5 = false; > String vendor = System.getProperty("java.vendor"); > - // Enable the workaround on Apple JVM, too, because the > - // same problem was reported on Mac OS X. > - if (vendor != null && (vendor.startsWith("Sun") || > - vendor.startsWith("Apple"))) > + // Enable the workaround on Apple and IBM JVM, too, > + // because the same problem was reported on them. > + if (vendor != null && > + (vendor.startsWith("Sun") || > + vendor.startsWith("Apple") || > + vendor.startsWith("IBM"))) > { > String version = System.getProperty("java.version"); > if (version != null && version.startsWith("1.5")) > > > This was sent by the SourceForge.net collaborative development platform, > the world's largest Open Source development site. > > > ------------------------------------------------------------------------------ > Throughout its 18-year history, RSA Conference consistently attracts the > world's best and brightest in the field, creating opportunities for > Conference > attendees to learn about information security's most important issues > through > interactions with peers, luminaries and emerging and established companies. > http://p.sf.net/sfu/rsaconf-dev2dev > _______________________________________________ > jEdit-CVS mailing list > jEd...@li... > https://lists.sourceforge.net/lists/listinfo/jedit-cvs > |
From: <va...@us...> - 2010-03-07 05:13:48
|
Revision: 17432 http://jedit.svn.sourceforge.net/jedit/?rev=17432&view=rev Author: vanza Date: 2010-03-07 05:13:41 +0000 (Sun, 07 Mar 2010) Log Message: ----------- Fix Chunk.xToOffset(). Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-07 03:43:57 UTC (rev 17431) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-07 05:13:41 UTC (rev 17432) @@ -283,14 +283,10 @@ if (x < gwidth) { float[] pos = gv.getGlyphPositions(0, gv.getNumGlyphs(), null); - float nextX = 0; - int i = 0; - while (x < nextX) - { - nextX += pos[i * 2]; - off++; - } - return off; + int i; + for (i = 0; i < pos.length && x > pos[i]; i += 2); + return off + (i / 2) + + (round && i < pos.length && x > pos[i] ? 1 : 0); } x -= gwidth; off += gv.getNumGlyphs(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <va...@us...> - 2010-03-07 19:42:57
|
Revision: 17434 http://jedit.svn.sourceforge.net/jedit/?rev=17434&view=rev Author: vanza Date: 2010-03-07 19:42:47 +0000 (Sun, 07 Mar 2010) Log Message: ----------- Fix xToOffset(), again. Fix the logic so it's closer to the previous version of the code, but, mainly, account for the offset of the current chunk when calculating the offset of the requested position inside the chunk. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-07 11:37:41 UTC (rev 17433) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-07 19:42:47 UTC (rev 17434) @@ -276,19 +276,31 @@ return offset; } - int off = 0; + int off = offset; + float myx = 0.0f; for (GlyphVector gv : glyphs) { float gwidth = (float) gv.getLogicalBounds().getWidth(); - if (x < gwidth) + if (myx + gwidth >= x) { float[] pos = gv.getGlyphPositions(0, gv.getNumGlyphs(), null); - int i; - for (i = 0; i < pos.length && x > pos[i]; i += 2); - return off + (i / 2) + - (round && i < pos.length && x > pos[i] ? 1 : 0); + for (int i = 0; i < gv.getNumGlyphs(); i++) + { + float glyphX = myx + pos[i * 2]; + float nextX = (i == gv.getNumGlyphs() - 1) + ? width + : myx + pos[i * 2 + 2]; + + if (nextX > x) + { + if (!round || nextX - x > x - glyphX) + return off + i; + else + return off + i + 1; + } + } } - x -= gwidth; + myx += gwidth; off += gv.getNumGlyphs(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <el...@us...> - 2010-03-16 17:41:18
|
Revision: 17476 http://jedit.svn.sourceforge.net/jedit/?rev=17476&view=rev Author: elberry Date: 2010-03-16 17:41:12 +0000 (Tue, 16 Mar 2010) Log Message: ----------- Fixing Java 6 dependent code. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-15 05:53:32 UTC (rev 17475) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-16 17:41:12 UTC (rev 17476) @@ -237,8 +237,8 @@ * check skips fonts that don't exist. */ Font f = new Font(family, Font.PLAIN, 12); - if (!f.getFamily().equals(Font.DIALOG) || - family.equals(Font.DIALOG)) + if (!f.getFamily().equalsIgnoreCase("dialog") || + family.equalsIgnoreCase("dialog")) userFonts.add(f); i++; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kp...@us...> - 2010-03-30 09:13:27
|
Revision: 17551 http://jedit.svn.sourceforge.net/jedit/?rev=17551&view=rev Author: kpouer Date: 2010-03-30 09:13:21 +0000 (Tue, 30 Mar 2010) Log Message: ----------- fixed import and variable name Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-29 19:03:37 UTC (rev 17550) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-03-30 09:13:21 UTC (rev 17551) @@ -28,11 +28,9 @@ import java.awt.font.*; import java.awt.geom.*; import java.awt.*; -import java.awt.font.TextAttribute; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import javax.swing.*; import org.gjt.sp.jedit.Debug; import org.gjt.sp.jedit.IPropertyManager; @@ -523,7 +521,7 @@ private float layoutGlyphs(FontRenderContext frc, char text[], int start, - int limit) + int end) { float width = 0.0f; int max = 0; @@ -531,9 +529,9 @@ glyphs = new LinkedList<GlyphVector>(); - while (max != -1 && start < limit) + while (max != -1 && start < end) { - max = fontSubstEnabled ? dflt.canDisplayUpTo(text, start, limit) + max = fontSubstEnabled ? dflt.canDisplayUpTo(text, start, end) : -1; if (max == -1) { @@ -541,7 +539,7 @@ frc, text, start, - limit); + end); } else { @@ -584,7 +582,7 @@ * can. */ int last = start; - while (last < limit && + while (last < end && f.canDisplay(text[last]) && !dflt.canDisplay(text[last])) last++; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2010-11-02 18:39:03
|
Revision: 18914 http://jedit.svn.sourceforge.net/jedit/?rev=18914&view=rev Author: ezust Date: 2010-11-02 18:38:57 +0000 (Tue, 02 Nov 2010) Log Message: ----------- Removed java5 workaround in Chunk.java. Bug is fixed in java 1.6. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-02 18:36:04 UTC (rev 18913) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-02 18:38:57 UTC (rev 18914) @@ -377,17 +377,6 @@ char[] textArray = seg.array; int textStart = seg.offset + offset; - - // {{{ Workaround for a bug in Sun Java 5 - // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6266084 - // textLimit is used as a text count in - // layoutGlyphVector(). So it works only the - // case textStart is 0. - char[] copy = new char[length]; - System.arraycopy(textArray, textStart, - copy, 0, length); - textArray = copy; - textStart = 0; width = layoutGlyphs(fontRenderContext, textArray, textStart, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kp...@us...> - 2010-11-30 10:36:13
|
Revision: 19078 http://jedit.svn.sourceforge.net/jedit/?rev=19078&view=rev Author: kpouer Date: 2010-11-30 10:36:07 +0000 (Tue, 30 Nov 2010) Log Message: ----------- minor coding style change Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-30 10:32:15 UTC (rev 19077) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-30 10:36:07 UTC (rev 19078) @@ -225,12 +225,12 @@ } - int i = 0; - String family; List<Font> userFonts = new ArrayList<Font>(); fontSubstEnabled = Boolean.parseBoolean(props.getProperty("view.enableFontSubst")); + String family; + int i = 0; while ((family = props.getProperty("view.fontSubstList." + i)) != null) { /* @@ -239,8 +239,8 @@ * check skips fonts that don't exist. */ Font f = new Font(family, Font.PLAIN, 12); - if (!f.getFamily().equalsIgnoreCase("dialog") || - family.equalsIgnoreCase("dialog")) + if (!"dialog".equalsIgnoreCase(f.getFamily()) || + "dialog".equalsIgnoreCase(family)) userFonts.add(f); i++; } @@ -320,10 +320,10 @@ float[] pos = gv.getGlyphPositions(0, gv.getNumGlyphs(), null); for (int i = 0; i < gv.getNumGlyphs(); i++) { - float glyphX = myx + pos[i * 2]; + float glyphX = myx + pos[i << 1]; float nextX = (i == gv.getNumGlyphs() - 1) ? width - : myx + pos[i * 2 + 2]; + : myx + pos[(i << 1) + 2]; if (nextX > x) { @@ -492,7 +492,7 @@ * @return Width of the rendered text. */ private float layoutGlyphs(FontRenderContext frc, - char text[], + char[] text, int start, int end) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kp...@us...> - 2010-11-30 10:39:50
|
Revision: 19079 http://jedit.svn.sourceforge.net/jedit/?rev=19079&view=rev Author: kpouer Date: 2010-11-30 10:39:44 +0000 (Tue, 30 Nov 2010) Log Message: ----------- Fixed a potential bug that should never happens in fact Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-30 10:36:07 UTC (rev 19078) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2010-11-30 10:39:44 UTC (rev 19079) @@ -223,12 +223,14 @@ fontSubstEnabled = false; preferredFonts = null; } + else + { + fontSubstEnabled = Boolean.parseBoolean(props.getProperty("view.enableFontSubst")); + } List<Font> userFonts = new ArrayList<Font>(); - fontSubstEnabled = Boolean.parseBoolean(props.getProperty("view.enableFontSubst")); - String family; int i = 0; while ((family = props.getProperty("view.fontSubstList." + i)) != null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2012-01-27 01:05:59
|
Revision: 20969 http://jedit.svn.sourceforge.net/jedit/?rev=20969&view=rev Author: ezust Date: 2012-01-27 01:05:52 +0000 (Fri, 27 Jan 2012) Log Message: ----------- #3480246: No font substitution for control keys Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-01-27 00:48:42 UTC (rev 20968) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-01-27 01:05:52 UTC (rev 20969) @@ -435,6 +435,10 @@ private Font getFont(int i) { Font f = null; + + if (Character.isISOControl(i)) + return f; + for (Font candidate : getFonts()) { if (candidate.canDisplay(i)) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-11 18:11:18
|
Revision: 21118 http://jedit.svn.sourceforge.net/jedit/?rev=21118&view=rev Author: k_satoda Date: 2012-02-11 18:11:12 +0000 (Sat, 11 Feb 2012) Log Message: ----------- Fixed a misplaced and then incorrect comment. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-11 18:09:58 UTC (rev 21117) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-11 18:11:12 UTC (rev 21118) @@ -251,8 +251,8 @@ //{{{ Instance variables boolean initialized; + SyntaxStyle style; // set up after init() - SyntaxStyle style; float width; //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-23 17:24:16
|
Revision: 21192 http://jedit.svn.sourceforge.net/jedit/?rev=21192&view=rev Author: k_satoda Date: 2012-02-23 17:24:09 +0000 (Thu, 23 Feb 2012) Log Message: ----------- Reduced memory usage a bit in Chunk, knowing that the number of GlyphVector is 1 for most Chunk, and the list won't be modified after building it. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-23 16:57:57 UTC (rev 21191) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-23 17:24:09 UTC (rev 21192) @@ -29,8 +29,9 @@ import java.awt.geom.*; import java.awt.*; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; +import java.util.Collections; +import java.util.Arrays; import org.gjt.sp.jedit.Debug; import org.gjt.sp.jedit.IPropertyManager; @@ -536,8 +537,9 @@ //{{{ addGlyphVector() method /** * Creates a glyph vector for the text with the given font, - * and adds it to the internal list. + * and adds it to the list. * + * @param glyphs list to add * @param f Font to use for rendering. * @param frc Font rendering context. * @param text Char array with text to render. @@ -546,11 +548,9 @@ * * @return Width of the rendered text. */ - private float addGlyphVector(Font f, - FontRenderContext frc, - char[] text, - int start, - int end) + private static float addGlyphVector(ArrayList<GlyphVector> glyphs, + Font f, FontRenderContext frc, + char[] text, int start, int end) { // FIXME: Need BiDi support. int layoutFlags = Font.LAYOUT_LEFT_TO_RIGHT @@ -601,9 +601,7 @@ float width = 0.0f; int max = 0; Font dflt = style.getFont(); - - glyphs = new LinkedList<GlyphVector>(); - + ArrayList<GlyphVector> glyphs_ = new ArrayList<GlyphVector>(); while (max != -1 && start < end) { max = fontSubstEnabled ? dflt.canDisplayUpTo(text, start, end) @@ -614,11 +612,8 @@ * No font substitution * -> Draw all with the main font */ - width += addGlyphVector(dflt, - frc, - text, - start, - end); + width += addGlyphVector(glyphs_, + dflt, frc, text, start, end); } else { @@ -628,11 +623,8 @@ */ if (max > start) { - width += addGlyphVector(dflt, - frc, - text, - start, - max); + width += addGlyphVector(glyphs_, + dflt, frc, text, start, max); start = max; } @@ -659,26 +651,34 @@ f = f.deriveFont(dflt.getStyle(), dflt.getSize()); - width += addGlyphVector(f, - frc, - text, - start, - last); + width += addGlyphVector(glyphs_, + f, frc, text, start, last); start = last; } else { int ds = Character.charCount(Character.codePointAt(text,start)); - width += addGlyphVector(dflt, - frc, - text, - start, - start + ds); + width += addGlyphVector(glyphs_, + dflt, frc, text, start, start + ds); start += ds; } } } + + // Optimize memory usage knowing that the size of list + // is 1 in most case, and the list can be immutable + // after here. + if (glyphs_.size() == 1) + { + glyphs = Collections.singletonList(glyphs_.get(0)); + } + else + { + glyphs = Arrays.asList(glyphs_.toArray( + new GlyphVector[glyphs_.size()])); + } + return width; } //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Matthieu C. <cho...@gm...> - 2012-02-23 23:49:58
|
Hi, a little idea: 2012/2/23 <k_s...@us...> > + > + // Optimize memory usage knowing that the size of list > + // is 1 in most case, and the list can be immutable > + // after here. > + if (glyphs_.size() == 1) > + { > + glyphs = Collections.singletonList(glyphs_.get(0)); > + } > + else > + { > + glyphs = Arrays.asList(glyphs_.toArray( > + new GlyphVector[glyphs_.size()])); > + } > Here, if you want to optimize memory, why not replacing the list by a simple glyphs array ? Is there a reason to keep a list here since the list is immutable after that ? Matthieu |
From: <k_s...@us...> - 2012-02-23 17:59:27
|
Revision: 21194 http://jedit.svn.sourceforge.net/jedit/?rev=21194&view=rev Author: k_satoda Date: 2012-02-23 17:59:16 +0000 (Thu, 23 Feb 2012) Log Message: ----------- Eliminated the last flag variable in Chunk, which had been unused since r21116. Revision Links: -------------- http://jedit.svn.sourceforge.net/jedit/?rev=21116&view=rev Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-23 17:53:56 UTC (rev 21193) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-23 17:59:16 UTC (rev 21194) @@ -251,7 +251,6 @@ //{{{ Package private members //{{{ Instance variables - boolean initialized; SyntaxStyle style; // set up after init() float width; @@ -266,6 +265,7 @@ super(Token.NULL,offset,0,rules); this.width = width; assert !isAccessible(); + assert isInitialized(); } //}}} //{{{ Chunk constructor @@ -278,6 +278,7 @@ if(background == null) background = styles[defaultID].getBackgroundColor(); assert isAccessible(); + assert !isInitialized(); } //}}} //{{{ Chunk constructor @@ -288,6 +289,7 @@ this.style = style; this.background = background; assert isAccessible(); + assert !isInitialized(); } //}}} //{{{ isAccessible() method @@ -299,6 +301,17 @@ return length > 0; } //}}} + //{{{ isInitialized() method + /** + * Returns true if this chunk is ready for painting. + */ + final boolean isInitialized() + { + return !isAccessible() // virtual indent + || (glyphs != null) // normal text + || (width > 0); // tab + } //}}} + //{{{ isTab() method /** * Returns true if this chunk represents a tab. @@ -412,7 +425,6 @@ void init(Segment lineText, TabExpander expander, float x, FontRenderContext fontRenderContext, int physicalLineOffset) { - initialized = true; if(!isAccessible()) { // do nothing @@ -433,6 +445,7 @@ textStart, textStart + length); } + assert isInitialized(); } //}}} //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-25 17:10:18
|
Revision: 21203 http://jedit.svn.sourceforge.net/jedit/?rev=21203&view=rev Author: k_satoda Date: 2012-02-25 17:10:11 +0000 (Sat, 25 Feb 2012) Log Message: ----------- Removed unnecessary use of List on glyphs field in Chunk for a bit less use of memory and simpler code. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-24 21:12:36 UTC (rev 21202) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-25 17:10:11 UTC (rev 21203) @@ -30,8 +30,6 @@ import java.awt.*; import java.util.ArrayList; import java.util.List; -import java.util.Collections; -import java.util.Arrays; import java.util.LinkedHashMap; import java.util.Map; import java.lang.ref.SoftReference; @@ -447,7 +445,7 @@ GlyphKey cacheKey = new GlyphKey(str, style.getFont(), fontRenderContext); GlyphCache cache = getGlyphCache(); - List<GlyphVector> cachedGlyphs = cache.get(cacheKey); + GlyphVector[] cachedGlyphs = cache.get(cacheKey); if (cachedGlyphs != null) { glyphs = cachedGlyphs; @@ -508,7 +506,7 @@ // styles[defaultID].getBackgroundColor() private Color background; private String str; - private List<GlyphVector> glyphs; + private GlyphVector[] glyphs; //}}} //{{{ getFonts() method @@ -720,20 +718,7 @@ } } } - - // Optimize memory usage knowing that the size of list - // is 1 in most case, and the list can be immutable - // after here. - if (glyphs_.size() == 1) - { - glyphs = Collections.singletonList(glyphs_.get(0)); - } - else - { - glyphs = Arrays.asList(glyphs_.toArray( - new GlyphVector[glyphs_.size()])); - } - + glyphs = glyphs_.toArray(new GlyphVector[glyphs_.size()]); return width; } //}}} @@ -798,7 +783,7 @@ } //}}} //{{{ class GlyphCache - private static class GlyphCache extends LinkedHashMap<GlyphKey, List<GlyphVector>> + private static class GlyphCache extends LinkedHashMap<GlyphKey, GlyphVector[]> { public GlyphCache(int capacity) { @@ -808,7 +793,7 @@ } @Override - protected boolean removeEldestEntry(Map.Entry<GlyphKey, List<GlyphVector>> eldest) + protected boolean removeEldestEntry(Map.Entry<GlyphKey, GlyphVector[]> eldest) { return size() > capacity; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-26 12:26:07
|
Revision: 21205 http://jedit.svn.sourceforge.net/jedit/?rev=21205&view=rev Author: k_satoda Date: 2012-02-26 12:26:01 +0000 (Sun, 26 Feb 2012) Log Message: ----------- Improved readability (naming, comments, etc) of font substitution logic to make further changes clearer. No behavior change was intended. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 10:59:10 UTC (rev 21204) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 12:26:01 UTC (rev 21205) @@ -509,12 +509,8 @@ private GlyphVector[] glyphs; //}}} - //{{{ getFonts() method - /** - * Returns a list of fonts to be searched when applying font - * substitution. - */ - private static Font[] getFonts() + //{{{ getFontSubstList() method + private static Font[] getFontSubstList() { if (fontSubstList == null) { @@ -543,28 +539,29 @@ return fontSubstList; } //}}} - //{{{ getFont() method + //{{{ getSubstFont() method /** - * Determines the best font for printing a character - * from substitution fonts detemined by getfonts() - * @param i Codepoint of the character + * Returns the first font which can display a character from + * configured substitution candidates, or null if there is no + * such font. */ - private Font getFont(int i) + private static Font getSubstFont(int codepoint) { - Font f = null; + // Workaround for a problem reported in SF.net patch #3480246 + // > If font substitution with system fonts is enabled, + // > I get for inserted control characters strange mathematical + // > symbols from a non-unicode font in my system. + if (Character.isISOControl(codepoint)) + return null; - if (Character.isISOControl(i)) - return f; - - for (Font candidate : getFonts()) + for (Font candidate: getFontSubstList()) { - if (candidate.canDisplay(i)) - { - f = candidate; - break; - } + if (candidate.canDisplay(codepoint)) + { + return candidate; + } } - return f; + return null; } //}}} //{{{ drawGlyphs() method @@ -593,7 +590,7 @@ * and adds it to the list. * * @param glyphs list to add - * @param f Font to use for rendering. + * @param font Font to use for rendering. * @param frc Font rendering context. * @param text Char array with text to render. * @param start Start index of text to render. @@ -602,7 +599,7 @@ * @return Width of the rendered text. */ private static float addGlyphVector(ArrayList<GlyphVector> glyphs, - Font f, FontRenderContext frc, + Font font, FontRenderContext frc, char[] text, int start, int end) { // FIXME: Need BiDi support. @@ -610,15 +607,17 @@ | Font.LAYOUT_NO_START_CONTEXT | Font.LAYOUT_NO_LIMIT_CONTEXT; - GlyphVector gv = f.layoutGlyphVector(frc, + GlyphVector gv = font.layoutGlyphVector(frc, text, start, end, layoutFlags); + // This is necessary to work around a memory leak in Sun Java 6 where // the sun.font.GlyphLayout is cached and reused while holding an // instance to the char array. - f.layoutGlyphVector(frc, EMPTY_TEXT, 0, 0, layoutFlags); + font.layoutGlyphVector(frc, EMPTY_TEXT, 0, 0, layoutFlags); + glyphs.add(gv); return (float) gv.getLogicalBounds().getWidth(); } // }}} @@ -627,12 +626,12 @@ /** * Layout the glyphs to render the given text, applying font * substitution if configured. GlyphVectors are created and - * added to the internal glyph list. + * set to the internal glyph list. * * Font substitution works in the following manner: - * - All characters that can be rendered with the default + * - All characters that can be rendered with the main * font will be. - * - For characters that can't be handled by the default + * - For characters that can't be handled by the main * font, iterate over the list of available fonts to * find an appropriate one. The first match is chosen. * @@ -652,71 +651,44 @@ int end) { float width = 0.0f; - int max = 0; - Font dflt = style.getFont(); + Font mainFont = style.getFont(); ArrayList<GlyphVector> glyphs_ = new ArrayList<GlyphVector>(); - while (max != -1 && start < end) + while (start < end) { - max = fontSubstEnabled ? dflt.canDisplayUpTo(text, start, end) - : -1; - if (max == -1) + int substStart = !fontSubstEnabled ? -1 + : mainFont.canDisplayUpTo(text, start, end); + if (substStart == -1) { - /* - * No font substitution - * -> Draw all with the main font - */ width += addGlyphVector(glyphs_, - dflt, frc, text, start, end); + mainFont, frc, text, start, end); + break; } - else + if (substStart > start) { - /* - * Draw as much as we can with the main font - * and update the current offset. - */ - if (max > start) + width += addGlyphVector(glyphs_, + mainFont, frc, text, start, substStart); + } + int nextChar = Character.codePointAt(text, substStart); + Font substFont = getSubstFont(nextChar); + int substEnd = substStart + Character.charCount(nextChar); + if (substFont != null) + { + while (substEnd < end && + substFont == getSubstFont(nextChar = Character.codePointAt(text, substEnd))) { - width += addGlyphVector(glyphs_, - dflt, frc, text, start, max); - start = max; + substEnd += Character.charCount(nextChar); } - - /* - * Find a font that can display the next - * characters. - */ - - Font f = getFont(Character.codePointAt(text,start)); - - if (f != null) - { - /* - * Find out how many characters - * the current font should display - */ - int last = start; - while (last < end && - f == getFont(Character.codePointAt(text,last))) - { - int dl = Character.charCount(Character.codePointAt(text,last)); - last += dl; - } - - f = f.deriveFont(dflt.getStyle(), dflt.getSize()); - - width += addGlyphVector(glyphs_, - f, frc, text, start, last); - - start = last; - } - else - { - int ds = Character.charCount(Character.codePointAt(text,start)); - width += addGlyphVector(glyphs_, - dflt, frc, text, start, start + ds); - start += ds; - } + width += addGlyphVector(glyphs_, + substFont.deriveFont(mainFont.getStyle(), + mainFont.getSize()), frc, + text, substStart, substEnd); } + else + { + width += addGlyphVector(glyphs_, + mainFont, frc, text, substStart, substEnd); + } + start = substEnd; } glyphs = glyphs_.toArray(new GlyphVector[glyphs_.size()]); return width; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-26 13:38:10
|
Revision: 21210 http://jedit.svn.sourceforge.net/jedit/?rev=21210&view=rev Author: k_satoda Date: 2012-02-26 13:38:03 +0000 (Sun, 26 Feb 2012) Log Message: ----------- Avoid unnecessary use (including allocation) of ArrayList<GlyphVector> in major cases where font substitution doesn't occur at all. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 13:20:40 UTC (rev 21209) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 13:38:03 UTC (rev 21210) @@ -458,10 +458,10 @@ } else { - char[] textArray = lineText.array; int textStart = lineText.offset + offset; - width = layoutGlyphs(fontRenderContext, - textArray, textStart, textStart + length); + int textEnd = textStart + length; + layoutGlyphs(fontRenderContext, + lineText.array, textStart, textEnd); cache.put(cacheKey, glyphs); } } @@ -584,40 +584,42 @@ } } //}}} - //{{{ addGlyphVector() method + //{{{ layoutGlyphVector() method /** - * Creates a glyph vector for the text with the given font, - * and adds it to the list. - * - * @param glyphs list to add - * @param font Font to use for rendering. - * @param frc Font rendering context. - * @param text Char array with text to render. - * @param start Start index of text to render. - * @param end End index of text to render. - * - * @return Width of the rendered text. + * A wrapper of Font.layoutGlyphVector() to simplify the calls. */ - private static float addGlyphVector(ArrayList<GlyphVector> glyphs, - Font font, FontRenderContext frc, + private static GlyphVector layoutGlyphVector(Font font, + FontRenderContext frc, char[] text, int start, int end) { // FIXME: Need BiDi support. - int layoutFlags = Font.LAYOUT_LEFT_TO_RIGHT + int flags = Font.LAYOUT_LEFT_TO_RIGHT | Font.LAYOUT_NO_START_CONTEXT | Font.LAYOUT_NO_LIMIT_CONTEXT; - GlyphVector gv = font.layoutGlyphVector(frc, - text, - start, - end, - layoutFlags); + GlyphVector result = + font.layoutGlyphVector(frc, text, start, end, flags); // This is necessary to work around a memory leak in Sun Java 6 where // the sun.font.GlyphLayout is cached and reused while holding an // instance to the char array. - font.layoutGlyphVector(frc, EMPTY_TEXT, 0, 0, layoutFlags); + font.layoutGlyphVector(frc, EMPTY_TEXT, 0, 0, flags); + return result; + } // }}} + + //{{{ addGlyphVector() method + /** + * Creates a glyph vector for the text with the given font, + * and adds it to the list. + * @return Width of the rendered text. + */ + private static float addGlyphVector(ArrayList<GlyphVector> glyphs, + Font font, FontRenderContext frc, + char[] text, int start, int end) + { + GlyphVector gv = layoutGlyphVector(font, frc, + text, start, end); glyphs.add(gv); return (float) gv.getLogicalBounds().getWidth(); } // }}} @@ -625,8 +627,8 @@ //{{{ layoutGlyphs() method /** * Layout the glyphs to render the given text, applying font - * substitution if configured. GlyphVectors are created and - * set to the internal glyph list. + * substitution if configured. GlyphVectors are created and set + * to glyphs field. Also, its width is set to width field. * * Font substitution works in the following manner: * - All characters that can be rendered with the main @@ -642,33 +644,46 @@ * @param text Char array with text to render. * @param start Start index of text to render. * @param end End index of text to render. - * - * @return Width of the rendered text. */ - private float layoutGlyphs(FontRenderContext frc, - char[] text, - int start, - int end) + private void layoutGlyphs(FontRenderContext frc, + char[] text, int start, int end) { - float width = 0.0f; Font mainFont = style.getFont(); - ArrayList<GlyphVector> glyphs_ = new ArrayList<GlyphVector>(); - while (start < end) + int substStart = !fontSubstEnabled ? -1 + : mainFont.canDisplayUpTo(text, start, end); + if (substStart == -1) { - int substStart = !fontSubstEnabled ? -1 - : mainFont.canDisplayUpTo(text, start, end); - if (substStart == -1) - { - width += addGlyphVector(glyphs_, - mainFont, frc, text, start, end); - break; - } + GlyphVector gv = layoutGlyphVector(mainFont, frc, + text, start, end); + glyphs = new GlyphVector[] {gv}; + width = (float)gv.getLogicalBounds().getWidth(); + } + else + { + ArrayList<GlyphVector> glyphs_ = new ArrayList<GlyphVector>(); + width = doFontSubstitution(glyphs_, + mainFont, frc, substStart, + text, start, end); + glyphs = glyphs_.toArray(new GlyphVector[glyphs_.size()]); + } + } //}}} + + //{{{ doFontSubstitution() method + private static float doFontSubstitution(ArrayList<GlyphVector> glyphs, + Font mainFont, FontRenderContext frc, int substStart, + char[] text, int start, int end) + { + float width = 0.0f; + for (;;) + { if (substStart > start) { - width += addGlyphVector(glyphs_, + width += addGlyphVector(glyphs, mainFont, frc, text, start, substStart); } + assert substStart < end; int nextChar = Character.codePointAt(text, substStart); + assert !mainFont.canDisplay(nextChar); Font substFont = getSubstFont(nextChar); int substEnd = substStart + Character.charCount(nextChar); if (substFont != null) @@ -678,19 +693,29 @@ { substEnd += Character.charCount(nextChar); } - width += addGlyphVector(glyphs_, + width += addGlyphVector(glyphs, substFont.deriveFont(mainFont.getStyle(), mainFont.getSize()), frc, text, substStart, substEnd); } else { - width += addGlyphVector(glyphs_, + width += addGlyphVector(glyphs, mainFont, frc, text, substStart, substEnd); } start = substEnd; + if (start >= end) + { + break; + } + substStart = mainFont.canDisplayUpTo(text, start, end); + if (substStart == -1) + { + width += addGlyphVector(glyphs, + mainFont, frc, text, start, end); + break; + } } - glyphs = glyphs_.toArray(new GlyphVector[glyphs_.size()]); return width; } //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-26 15:14:55
|
Revision: 21213 http://jedit.svn.sourceforge.net/jedit/?rev=21213&view=rev Author: k_satoda Date: 2012-02-26 15:14:49 +0000 (Sun, 26 Feb 2012) Log Message: ----------- Reduced the calls to layoutGlyphVector() in case of the font substitution logic found a character which can't be displayed with the main font, and also with substitution fonts. Before this change, it could be called for every single character. A new private helper class Chunk.FontSubstitution was introduced to make further tweaks easier without worry of this kind of problem. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 14:16:26 UTC (rev 21212) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-26 15:14:49 UTC (rev 21213) @@ -608,22 +608,6 @@ return result; } // }}} - //{{{ addGlyphVector() method - /** - * Creates a glyph vector for the text with the given font, - * and adds it to the list. - * @return Width of the rendered text. - */ - private static float addGlyphVector(ArrayList<GlyphVector> glyphs, - Font font, FontRenderContext frc, - char[] text, int start, int end) - { - GlyphVector gv = layoutGlyphVector(font, frc, - text, start, end); - glyphs.add(gv); - return (float) gv.getLogicalBounds().getWidth(); - } // }}} - //{{{ layoutGlyphs() method /** * Layout the glyphs to render the given text, applying font @@ -660,66 +644,137 @@ } else { - ArrayList<GlyphVector> glyphs_ = new ArrayList<GlyphVector>(); - width = doFontSubstitution(glyphs_, - mainFont, frc, substStart, - text, start, end); - glyphs = glyphs_.toArray(new GlyphVector[glyphs_.size()]); + FontSubstitution subst = new FontSubstitution( + mainFont, frc, text, start); + subst.addNonSubstRange(substStart - start); + doFontSubstitution(subst, mainFont, + text, substStart, end); + subst.finish(); + glyphs = subst.getGlyphs(); + width = subst.getWidth(); } } //}}} //{{{ doFontSubstitution() method - private static float doFontSubstitution(ArrayList<GlyphVector> glyphs, - Font mainFont, FontRenderContext frc, int substStart, + private static void doFontSubstitution(FontSubstitution subst, + Font mainFont, char[] text, int start, int end) { - float width = 0.0f; for (;;) { - if (substStart > start) - { - width += addGlyphVector(glyphs, - mainFont, frc, text, start, substStart); - } - assert substStart < end; - int nextChar = Character.codePointAt(text, substStart); + assert start < end; + int nextChar = Character.codePointAt(text, start); + int charCount = Character.charCount(nextChar); assert !mainFont.canDisplay(nextChar); Font substFont = getSubstFont(nextChar); - int substEnd = substStart + Character.charCount(nextChar); if (substFont != null) { - while (substEnd < end && - !mainFont.canDisplay(nextChar = Character.codePointAt(text, substEnd)) && - substFont == getSubstFont(nextChar)) - { - substEnd += Character.charCount(nextChar); - } - width += addGlyphVector(glyphs, - substFont.deriveFont(mainFont.getStyle(), - mainFont.getSize()), frc, - text, substStart, substEnd); + subst.addRange(substFont, charCount); } else { - width += addGlyphVector(glyphs, - mainFont, frc, text, substStart, substEnd); + subst.addNonSubstRange(charCount); } - start = substEnd; + start += charCount; if (start >= end) { break; } - substStart = mainFont.canDisplayUpTo(text, start, end); - if (substStart == -1) + int nextSubstStart = + mainFont.canDisplayUpTo(text, start, end); + if (nextSubstStart == -1) { - width += addGlyphVector(glyphs, - mainFont, frc, text, start, end); + subst.addNonSubstRange(end - start); break; } + subst.addNonSubstRange(nextSubstStart - start); + start = nextSubstStart; } - return width; } //}}} + //{{{ class FontSubstitution + // A helper class to build GlyphVector[] with least calls to + // layoutGlyphVector() no matter how many the font substitution + // logic find intermediate boundaries. + private static class FontSubstitution + { + public FontSubstitution(Font mainFont, FontRenderContext frc, + char[] text, int start) + { + this.mainFont = mainFont; + this.frc = frc; + this.text = text; + rangeStart = start; + rangeFont = null; + rangeLength = 0; + glyphs = new ArrayList<GlyphVector>(); + width = 0.0f; + } + + public void addNonSubstRange(int length) + { + addRange(null, length); + } + + private void addRange(Font font, int length) + { + if (font == rangeFont) + { + rangeLength += length; + } + else + { + addGlyphVectorOfLastRange(); + rangeFont = font; + rangeStart += rangeLength; + rangeLength = length; + } + } + + public void finish() + { + addGlyphVectorOfLastRange(); + rangeFont = null; + rangeStart += rangeLength; + rangeLength = 0; + } + + public GlyphVector[] getGlyphs() + { + return glyphs.toArray(new GlyphVector[glyphs.size()]); + } + + public float getWidth() + { + return (float)width; + } + + private final Font mainFont; + private final FontRenderContext frc; + private final char[] text; + private int rangeStart; + private Font rangeFont; + private int rangeLength; + private final ArrayList<GlyphVector> glyphs; + private double width; + + private void addGlyphVectorOfLastRange() + { + if (rangeLength == 0) + { + return; + } + Font font = (rangeFont == null) ? + mainFont : + rangeFont.deriveFont(mainFont.getStyle(), + mainFont.getSize()); + GlyphVector gv = layoutGlyphVector(font, frc, + text, rangeStart, rangeStart + rangeLength); + glyphs.add(gv); + width += gv.getLogicalBounds().getWidth(); + } + } //}}} + //{{{ getGlyphCache() method private static GlyphCache getGlyphCache() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-27 15:49:58
|
Revision: 21219 http://jedit.svn.sourceforge.net/jedit/?rev=21219&view=rev Author: k_satoda Date: 2012-02-27 15:49:47 +0000 (Mon, 27 Feb 2012) Log Message: ----------- Fixed wrong separation in composed character sequence which happened when font substitution is used on that sequence. (SF.net bug #3495002; the problem was introduced in r21213) Revision Links: -------------- http://jedit.svn.sourceforge.net/jedit/?rev=21213&view=rev Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-27 15:38:50 UTC (rev 21218) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-27 15:49:47 UTC (rev 21219) @@ -718,6 +718,11 @@ private void addRange(Font font, int length) { + assert length >= 0; + if (length == 0) + { + return; + } if (font == rangeFont) { rangeLength += length; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <k_s...@us...> - 2012-02-27 16:07:28
|
Revision: 21220 http://jedit.svn.sourceforge.net/jedit/?rev=21220&view=rev Author: k_satoda Date: 2012-02-27 16:07:18 +0000 (Mon, 27 Feb 2012) Log Message: ----------- Gathered various ways of width accumulation into a simple loop after getting GlyphVector[]. The complexity is anyway linear. Then, there is no reason to have different ways in different places. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-27 15:49:47 UTC (rev 21219) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2012-02-27 16:07:18 UTC (rev 21220) @@ -449,21 +449,22 @@ if (cachedGlyphs != null) { glyphs = cachedGlyphs; - float w = 0.0f; - for (GlyphVector gv: glyphs) - { - w += (float)gv.getLogicalBounds().getWidth(); - } - width = w; } else { int textStart = lineText.offset + offset; int textEnd = textStart + length; - layoutGlyphs(fontRenderContext, + glyphs = layoutGlyphs(style.getFont(), + fontRenderContext, lineText.array, textStart, textEnd); cache.put(cacheKey, glyphs); } + float w = 0.0f; + for (GlyphVector gv: glyphs) + { + w += (float)gv.getLogicalBounds().getWidth(); + } + width = w; } assert isInitialized(); } //}}} @@ -611,8 +612,7 @@ //{{{ layoutGlyphs() method /** * Layout the glyphs to render the given text, applying font - * substitution if configured. GlyphVectors are created and set - * to glyphs field. Also, its width is set to width field. + * substitution if configured. * * Font substitution works in the following manner: * - All characters that can be rendered with the main @@ -623,24 +623,18 @@ * * The user can define his list of preferred fonts, which will * be tried before the system fonts. - * - * @param frc Font rendering context. - * @param text Char array with text to render. - * @param start Start index of text to render. - * @param end End index of text to render. */ - private void layoutGlyphs(FontRenderContext frc, + private static GlyphVector[] layoutGlyphs(Font mainFont, + FontRenderContext frc, char[] text, int start, int end) { - Font mainFont = style.getFont(); int substStart = !fontSubstEnabled ? -1 : mainFont.canDisplayUpTo(text, start, end); if (substStart == -1) { GlyphVector gv = layoutGlyphVector(mainFont, frc, text, start, end); - glyphs = new GlyphVector[] {gv}; - width = (float)gv.getLogicalBounds().getWidth(); + return new GlyphVector[] {gv}; } else { @@ -650,8 +644,7 @@ doFontSubstitution(subst, mainFont, text, substStart, end); subst.finish(); - glyphs = subst.getGlyphs(); - width = subst.getWidth(); + return subst.getGlyphs(); } } //}}} @@ -708,7 +701,6 @@ rangeFont = null; rangeLength = 0; glyphs = new ArrayList<GlyphVector>(); - width = 0.0f; } public void addNonSubstRange(int length) @@ -749,11 +741,6 @@ return glyphs.toArray(new GlyphVector[glyphs.size()]); } - public float getWidth() - { - return (float)width; - } - private final Font mainFont; private final FontRenderContext frc; private final char[] text; @@ -761,7 +748,6 @@ private Font rangeFont; private int rangeLength; private final ArrayList<GlyphVector> glyphs; - private double width; private void addGlyphVectorOfLastRange() { @@ -776,7 +762,6 @@ GlyphVector gv = layoutGlyphVector(font, frc, text, rangeStart, rangeStart + rangeLength); glyphs.add(gv); - width += gv.getLogicalBounds().getWidth(); } } //}}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2018-01-23 19:14:13
|
Revision: 24819 http://sourceforge.net/p/jedit/svn/24819 Author: daleanson Date: 2018-01-23 19:14:10 +0000 (Tue, 23 Jan 2018) Log Message: ----------- fix for patch #569, which broke the text area build. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2018-01-18 20:13:44 UTC (rev 24818) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2018-01-23 19:14:10 UTC (rev 24819) @@ -34,7 +34,6 @@ import java.util.Map; import java.lang.ref.SoftReference; -import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.Debug; import org.gjt.sp.jedit.IPropertyManager; //}}} @@ -242,7 +241,7 @@ * doesn't match any installed fonts. The following * check skips fonts that don't exist. */ - Font f = jEdit.getFontProperty("view.fontSubstList." + i); + Font f = Font.decode(props.getProperty("view.fontSubstList." + i)); if (f != null && (!"dialog".equalsIgnoreCase(f.getFamily()) || "dialog".equalsIgnoreCase(family))) userFonts.add(f); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mak...@us...> - 2019-12-23 20:07:48
|
Revision: 24971 http://sourceforge.net/p/jedit/svn/24971 Author: makarius Date: 2019-12-23 20:07:47 +0000 (Mon, 23 Dec 2019) Log Message: ----------- Proper treatment of multi-character glyphs (e.g. 0x01d49c) in OpenJDK 11. Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java Modified: jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2019-12-23 20:00:41 UTC (rev 24970) +++ jEdit/trunk/org/gjt/sp/jedit/syntax/Chunk.java 2019-12-23 20:07:47 UTC (rev 24971) @@ -655,6 +655,10 @@ // instance to the char array. font.layoutGlyphVector(frc, EMPTY_TEXT, 0, 0, flags); + if ((result.getLayoutFlags() & GlyphVector.FLAG_COMPLEX_GLYPHS) != 0) { + result = font.createGlyphVector(frc, new String(text, start, end - start)); + } + return result; } // }}} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |