+ // Draw nikud
+ p.pain->text(int(p.x) + dx, p.yo + p.row->baseline(), str, font);
+}
+
+
+void LyXText::drawChars(DrawRowParams & p, pos_type & vpos,
+ bool hebrew, bool arabic)
+{
+ pos_type pos = vis2log(vpos);
+ pos_type const last = rowLastPrintable(p.row);
+ LyXFont const & orig_font = getFont(p.bv->buffer(), p.row->par(), pos);
+
+ // first character
+ string str;
+ str += p.row->par()->getChar(pos);
+ if (arabic) {
+ unsigned char c = str[0];
+ str[0] = transformChar(c, p.row->par(), pos);
+ }
+ ++vpos;
+
+ // collect as much similar chars as we can
+ while (vpos <= last && (pos = vis2log(vpos)) >= 0) {
+ char c = p.row->par()->getChar(pos);
+
+ if (!IsPrintableNonspace(c))
+ break;
+
+ if (arabic && Encodings::IsComposeChar_arabic(c))
+ break;
+ if (hebrew && Encodings::IsComposeChar_hebrew(c))
+ break;
+
+ if (orig_font != getFont(p.bv->buffer(), p.row->par(), pos))
+ break;
+
+ str += c;
+ ++vpos;
+ }
+
+ // Draw text and set the new x position
+ p.pain->text(int(p.x), p.yo + p.row->baseline(), str, orig_font);
+ p.x += lyxfont::width(str, orig_font);
+}
+
+
+void LyXText::draw(DrawRowParams & p, pos_type & vpos)
+{
+ pos_type const pos = vis2log(vpos);
+ Paragraph * par = p.row->par();
+
+ LyXFont const & orig_font = getFont(p.bv->buffer(), par, pos);
+
+ float const orig_x = p.x;
+
+ char const c = par->getChar(pos);
+
+ if (IsNewlineChar(c)) {
+ ++vpos;
+ drawNewline(p, pos);
+ return;
+ } else if (IsInsetChar(c)) {
+ drawInset(p, pos);
+ ++vpos;
+ drawForeignMark(p, orig_x, orig_font);
+ return;
+ }
+
+ // usual characters, no insets
+
+ // special case languages
+ bool const hebrew = (orig_font.language()->lang() == "hebrew");
+ bool const arabic =
+ orig_font.language()->lang() == "arabic" &&
+ (lyxrc.font_norm_type == LyXRC::ISO_8859_6_8 ||
+ lyxrc.font_norm_type == LyXRC::ISO_10646_1);
+
+ // draw as many chars as we can
+ if ((!hebrew && !arabic)
+ || (hebrew && !Encodings::IsComposeChar_hebrew(c))
+ || (arabic && !Encodings::IsComposeChar_arabic(c))) {
+ drawChars(p, vpos, true, false);
+ } else if (hebrew) {
+ drawHebrewComposeChar(p, vpos);
+ } else if (arabic) {
+ drawArabicComposeChar(p, vpos);
+ }
+
+ drawForeignMark(p, orig_x, orig_font);