<br><br><div class="gmail_quote">On Thu, Jun 3, 2010 at 3:38 AM, Andreas Vox <span dir="ltr">&lt;<a href="mailto:avox@arcor.de">avox@arcor.de</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Hi Drew!<br>
<br>
&gt;Von: Drew Vogel [mailto:<a href="mailto:drewpvogel@gmail.com">drewpvogel@gmail.com</a>]<br>
&gt;Gesendet: Mittwoch, 2. Juni 2010 20:08<br>
&gt;An: <a href="mailto:scribus-dev@lists.scribus.info">scribus-dev@lists.scribus.info</a><br>
&gt;Betreff: [scribus-dev] Where is the text frame word wrap code?<br>
<div class="im">&gt;<br>
&gt;I am working on an application that will generate a scribus document from a<br>
database of survey &gt;questions. The output of each question will look a bit<br>
like this image: &gt;<a href="http://imgur.com/ha2ag.png" target="_blank">http://imgur.com/ha2ag.png</a><br>
&gt;<br>
&gt;The question text is inside the text frame itself. The response options are<br>
in text frames of &gt;their own. In order to determine the appropriate vertical<br>
position for the first response &gt;option, I need to determine where scribus<br>
will wrap the text inside the text frame (the width &gt;of the text frame is<br>
pre-determined). I first thought that I could use<br>
&gt;QFontMetrics::boundingRect() to determine where the text would need to be<br>
wrapped. However &gt;that seems dependent on the DPI of the QPaintDevice that<br>
the text is drawn on and, in my &gt;testing, scribus wraps text independent of<br>
the monitor DPI. Is that true?<br>
<br>
</div>Yes, Scribus has ist own text layout code. Unfortunately that&#39;s one of the<br>
most ugly parts of Scribus. :-(<br>
<div class="im"><br>
&gt;Thus it seems that I need to emulate the word wrap logic in scribus itself<br>
but I&#39;m having &gt;trouble locating that part of the scribus code. It seems<br>
logical to me that the word wrap code &gt;would either be in or called from<br>
PageItem_TextFrame::DrawObj_<br>
&gt;Item() but if it&#39;s there, it&#39;s not obvious to me. Could someone help me<br>
locate the word wrap &gt;logic?<br>
<br>
</div>It&#39;s in PageItem_TextFrame::layout(). Unfortunately that particular method<br>
is 1500 lines long, so I&#39;ll outline the basic stuff for you.<br>
<br>
Without taking into account Dropcaps, Tabs, Optical Margins, Glyph Extension<br>
or changes to Word Spacing, Scribus relies solely on the width of the<br>
characters. After calling PageItem::layoutGlyphs() these are stored in<br>
GlyphLayout.xadvance. The method GlyphLayout::wide() calculates the width in<br>
case the given characters is associated with more than one glyph (that<br>
happens only to pagenumbers and tabs at the moment). After that Scribus just<br>
fills the line with as many words as fit. In case of hyphenation, the<br>
possible hyphenation points are marked with &quot;ScText::effects() |<br>
TextFlag_Hyphenation_Possible&quot; (or something like that).<br>
<br>
If you use glyph extension and/or modified word spacing, you can do the<br>
same, but in addition to the break position you get that way, you also have<br>
to check the next break opportunity that normally wouldn&#39;t fit on this line.<br>
Then multiply all blank widths with the minimal word spacing and all other<br>
char widths with the minimal glyph extension. If the resulting linewidth is<br>
closer to the wanted linewidth than the linewidth of the original break<br>
position, the new one is taken.<br>
<br>
I&#39;m currently rewriting all this code; and in 1.5.0 we will export a<br>
function to scripter that can determine the needed space for a given text.<br>
For now, the above description is all I can offer.<br>
<br>
Cheers,<br>
<font color="#888888">Andreas<br>
<br>
</font></blockquote></div><br>Thank you Andreas! I&#39;m sure that this will prove very helpful.<br><br><br><br><br><br>