Thanks for the tips. I'll try replacing the DOM subtree to avoid the performance issue. The only immediate downside to that seems to be that text selections can get lost...
----- Original Message ----- From: "Thomas DeWeese" <[EMAIL PROTECTED]> To: "Batik Users" <[EMAIL PROTECTED]> Sent: Thursday, August 21, 2003 12:24 PM Subject: Re: tspan.setAttributeNS(null, "class", "normal") null pointer exception > Denis Bohm wrote: > > I changed my sources so that if the old property value is null then it > > considers it as a change (rather than throwing a null pointer exception). > > Now changing the attribute seems to work. > > This is essentially the patch I was going to make. > > > However, it seems very very very > > slow to refresh when changing class attributes that result in simple style > > changes. > In SVG there is no such thing as a 'simple style change'. So for example > if the text uses an SVG font then the font now needs to inherit the modified > fill color. Also consider that your one element can in certain cases > be mapped into several disjoint pieces by BIDI reordering. This is really > amazingly complex stuff. The text code in Batik is by a fair bit the > most complex piece, the code has been almost completely rewritten three times > already and serveral weeks of effort have gone into trying to optimize it > and still it sucks! :) > > > In my case, the class change only results in changing the fill > > color - which shouldn't effect the bounds of the elements. Changing the > > class for about 25 tspan elements (making up one short line of text) takes > > about 1.5 seconds. I ran OptimizeIt on the code and it appears that each > > time the class property is changed on one tspan element the glyphs go > > through relayout down in the gvt layer. > > I've just taken a look through the code and I may try and optimize this > case a bit (although SVG Fonts are very problematic). > > > This results in the creation of > > around 27,000 points during the process. > > Hmm, thanks for pointing this out, not that I think this is the bottle neck > but it was easy to fix most of these :). > > > Any tips for speeding up changing the color of text runs? For example, is > > there some way to batch changes to the DOM? > > The best you can do (and it is probably pretty good) is remove the elements from > the rendering tree: text.parentNode.removeChild(text) Then make all your changes > and add it back in - this will keep Batik from trying to keep the rendering tree > in sync with the modified elements. > > > Thanks, > > Denis > > > > ----- Original Message ----- > > From: "Denis Bohm" <[EMAIL PROTECTED]> > > To: "Batik Users" <[EMAIL PROTECTED]> > > Sent: Thursday, August 21, 2003 8:26 AM > > Subject: Re: tspan.setAttributeNS(null, "class", "normal") null pointer > > exception > > > > > > > >>I've attached a standalone version that shows the problem. > >> > >>----- Original Message ----- > >>From: "Thomas DeWeese" <[EMAIL PROTECTED]> > >>To: "Batik Users" <[EMAIL PROTECTED]> > >>Sent: Thursday, August 21, 2003 5:19 AM > >>Subject: Re: tspan.setAttributeNS(null, "class", "normal") null pointer > >>exception > >> > >> > >> > >>>Denis Bohm wrote: > >>> > >>>>Setting color to the Shadow?When I try to append a tspan to a text > >> > >>element > >> > >>>>and then set the tspan class: > >>>> > >>>> Element tspan = document.createElementNS( > >>>> SVGDOMImplementation.SVG_NAMESPACE_URI, "tspan" > >>>> ); > >>>> tspan.appendChild(document.createCDATASection(text)); > >>>> text.appendChild(tspan); > >>>> tspan.setAttributeNS(null, "class", "normal"); > >>>> > >>>>I get a null pointer exception: > >>> > >>> Can you provide a standalone version of this problem? > >>>Looking at the line indicated below it isn't real clear why you > >>>would get an NPE. > >>> > >>> > >>>>In Event > >>>>java.lang.NullPointerException > >>>> at > >>>> > >> > > org.apache.batik.css.engine.CSSEngine.invalidateProperties(CSSEngine.java:18 > > > >>>>91) > >>>> at > >>>> > >> > > org.apache.batik.css.engine.CSSEngine$DOMAttrModifiedListener.handleEvent(CS > > > >>>>SEngine.java:2280) > >>>> at > >>>> > >> > > org.apache.batik.dom.events.EventSupport.fireEventListeners(EventSupport.jav > > > >>>>a:268) > >>>> at > >>>> > >> > > org.apache.batik.dom.events.EventSupport.dispatchEvent(EventSupport.java:240 > > > >>>>) > >>>> at > >>>>org.apache.batik.dom.AbstractNode.dispatchEvent(AbstractNode.java:455) > >>>> at > >>>> > >> > > org.apache.batik.dom.AbstractElement.fireDOMAttrModifiedEvent(AbstractElemen > > > >>>>t.java:544) > >>>> at > >>>> > >> > > org.apache.batik.dom.AbstractElement$NamedNodeHashMap.setNamedItem(AbstractE > > > >>>>lement.java:725) > >>>> at > >>>> > >> > > org.apache.batik.dom.AbstractElement$NamedNodeHashMap.setNamedItemNS(Abstrac > > > >>>>tElement.java:672) > >>>> at > >>>> > >> > > org.apache.batik.dom.AbstractElement.setAttributeNS(AbstractElement.java:271 > > > >>>>) > >>>> at > > > > com.hp.hpl.epc.evaluator.DemoUI.appendTSpan(DemoUI.java:209) > > > >>>> at com.hp.hpl.epc.evaluator.DemoUI.mouseMove(DemoUI.java:409) > >>>> at > >> > >>com.hp.hpl.epc.evaluator.DemoUI$2.handleEvent(DemoUI.java:276) > >> > >>>> at > >>>> > >> > > org.apache.batik.dom.events.EventSupport.fireEventListeners(EventSupport.jav > > > >>>>a:268) > >>>> at > >>>> > >> > > org.apache.batik.dom.events.EventSupport.dispatchEvent(EventSupport.java:240 > > > >>>>) > >>>> at > >>>>org.apache.batik.dom.AbstractNode.dispatchEvent(AbstractNode.java:455) > >>>> at > >>>> > >> > > org.apache.batik.bridge.BridgeEventSupport$Listener.dispatchMouseEvent(Bridg > > > >>>>eEventSupport.java:372) > >>>> at > >>>> > >> > > org.apache.batik.bridge.BridgeEventSupport$Listener.mouseMoved(BridgeEventSu > > > >>>>pport.java:286) > >>>> at > >>>> > >> > > org.apache.batik.gvt.event.AWTEventDispatcher.processMouseEvent(AWTEventDisp > > > >>>>atcher.java:538) > >>>> at > >>>> > >> > > org.apache.batik.gvt.event.AWTEventDispatcher.dispatchMouseEvent(AWTEventDis > > > >>>>patcher.java:502) > >>>> at > >>>> > >> > > org.apache.batik.gvt.event.AWTEventDispatcher.dispatchEvent(AWTEventDispatch > > > >>>>er.java:391) > >>>> at > >>>> > >> > > org.apache.batik.gvt.event.AWTEventDispatcher.mouseMoved(AWTEventDispatcher. > > > >>>>java:244) > >>>> at > >>>> > >> > > org.apache.batik.swing.svg.JSVGComponent$1MouseMovedRunnable.run(JSVGCompone > > > >>>>nt.java:1989) > >>>> at > >> > >>org.apache.batik.util.RunnableQueue.run(RunnableQueue.java:204) > >> > >>>> at java.lang.Thread.run(Thread.java:534) > >>>> > >>>> > >>>>Am I doing something wrong? > >>>> > >>>>Thanks, > >>>> Denis > >>>> > >>>> > >>>>--------------------------------------------------------------------- > >>>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>>For additional commands, e-mail: [EMAIL PROTECTED] > >>>> > >>>> > >>> > >>> > >>> > >>> > >>>--------------------------------------------------------------------- > >>>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>>For additional commands, e-mail: [EMAIL PROTECTED] > >>> > >>> > >> > > > > > > -------------------------------------------------------------------------- -- > > ---- > > > > > > > >>--------------------------------------------------------------------- > >>To unsubscribe, e-mail: [EMAIL PROTECTED] > >>For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]