summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/CDrawBuffer.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/CDrawBuffer.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/CDrawBuffer.cpp281
1 files changed, 226 insertions, 55 deletions
diff --git a/noncore/apps/opie-reader/CDrawBuffer.cpp b/noncore/apps/opie-reader/CDrawBuffer.cpp
index ca220e6..77b76fb 100644
--- a/noncore/apps/opie-reader/CDrawBuffer.cpp
+++ b/noncore/apps/opie-reader/CDrawBuffer.cpp
@@ -4,4 +4,6 @@
#include <qpainter.h>
#include <qpixmap.h>
+#include <qimage.h>
+#include "useqpe.h"
#include "opie.h"
@@ -43,5 +45,5 @@ CDrawBuffer& CDrawBuffer::operator=(CDrawBuffer& rhs)
{
int i;
-// qDebug("Trying 2");
+// //qDebug("Trying 2");
len = rhs.len;
m_maxstyle = rhs.m_maxstyle;
@@ -61,5 +63,5 @@ CDrawBuffer& CDrawBuffer::operator=(CDrawBuffer& rhs)
(*this)[i] = '\0';
len = i;
-// qDebug("Tried 2");
+// //qDebug("Tried 2");
return *this;
}
@@ -81,4 +83,6 @@ CDrawBuffer& CDrawBuffer::operator=(const tchar*sztmp)
void CDrawBuffer::empty()
{
+ m_bSop = false;
+ m_bEop = false;
len = 0;
(*this)[0] = 0;
@@ -112,14 +116,52 @@ void CDrawBuffer::truncate(int n)
}
-int CDrawBuffer::width(int numchars)
+int CDrawBuffer::width(int numchars, bool onscreen, int scwidth, unsigned char _border)
{
+ int gzoom = fc->gzoom();
int currentx = 0, end = 0;
- QString text = toQString(data());
+ QString text = (numchars < 0) ? toQString(data()) : toQString(data(), numchars);
CList<textsegment>::iterator textstart = segs.begin();
+ int extraspace = 0;
+ bool just = (onscreen && !m_bEop && textstart->style.getJustify() == m_AlignJustify);
+ int spaces = 0;
+ int spacesofar = 0;
+ int spacenumber = 0;
+ int nonspace = 0;
+ if (just)
+ {
+ for (int i = 0; i < len; i++)
+ {
+ if ((*this)[i] != ' ')
+ {
+ nonspace = i;
+ break;
+ }
+ }
+#ifdef _WINDOWS
+ for (i = nonspace; i < len; i++)
+#else
+ for (int i = nonspace; i < len; i++)
+#endif
+ {
+ if ((*this)[i] == ' ')
+ {
+ spaces++;
+ }
+ }
+ if (spaces == 0)
+ {
+ just = false;
+ }
+ else
+ {
+ extraspace = (scwidth - 2*_border - rightMargin() - leftMargin() - width());
+ if (extraspace == 0) just = false;
+ }
+ }
CList<textsegment>::iterator textend = textstart;
do
{
textend++;
- end = (textend != segs.end()) ? textend->start : length();
+ end = (textend != segs.end()) ? textend->start : len;
if (numchars >= 0 && end > numchars)
{
@@ -129,5 +171,12 @@ int CDrawBuffer::width(int numchars)
if (currentstyle.isPicture())
{
- currentx += currentstyle.getPicture()->width();
+ if (currentstyle.canScale())
+ {
+ currentx += (gzoom*currentstyle.getPicture()->width())/100;
+ }
+ else
+ {
+ currentx += currentstyle.getPicture()->width();
+ }
}
else
@@ -140,14 +189,47 @@ int CDrawBuffer::width(int numchars)
else
{
- QFont f(currentstyle.isMono() ? QString("courier") : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) );
+ QFont f(currentstyle.isMono() ? QString(fc->fixedfontname()) : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) );
// f.setUnderline(currentstyle.isUnderline());
QString str = text.mid(textstart->start, end-textstart->start);
QFontMetrics fm(f);
- currentx += fm.width(str);
+ if (just)
+ {
+ int lastspace = -1;
+ int nsp = 0;
+ int cx = currentx;
+ while ((nsp = str.find(" ", lastspace+1)) >= 0)
+ {
+ if (nsp > nonspace)
+ {
+ spacenumber++;
+ int nexttoadd = (extraspace*spacenumber+spaces/2)/spaces - spacesofar;
+ QString nstr = str.mid(lastspace+1, nsp-lastspace);
+ int lw = fm.width(nstr);
+ cx += lw+nexttoadd;
+ spacesofar += nexttoadd;
+ lastspace = nsp;
+ }
+ else
+ {
+ QString nstr = str.mid(lastspace+1, nsp-lastspace);
+// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr);
+ int lw = fm.width(nstr);
+ cx += lw;
+ lastspace = nsp;
+ }
+ }
+ QString nstr = str.right(str.length()-1-lastspace);
+ cx += fm.width(nstr);
+ currentx = cx;
+ }
+ else
+ {
+ currentx += fm.width(str);
+ }
}
}
textstart = textend;
}
- while (textend != segs.end() && end != numchars);
+ while (textend != segs.end() && end != numchars && textstart->start < len);
return currentx;
}
@@ -155,20 +237,20 @@ int CDrawBuffer::width(int numchars)
int CDrawBuffer::leftMargin()
{
- return (segs.begin()->style.getLeftMargin()*fc->getsize(segs.begin()->style))/6;
+ return (segs.begin()->style.getLeftMargin()*fc->getsize(segs.begin()->style)+3)/6;
}
int CDrawBuffer::rightMargin()
{
- return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style))/6;
+ return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style)+3)/6;
}
-int CDrawBuffer::offset(int scwidth)
+int CDrawBuffer::offset(int scwidth, unsigned char _border)
{
- int currentx = BORDER;
+ int currentx = _border;
switch(segs.begin()->style.getJustify())
{
case m_AlignRight:
{
- currentx = scwidth - BORDER - rightMargin() - width();
+ currentx = scwidth - _border - rightMargin() - width();
}
break;
@@ -183,5 +265,5 @@ int CDrawBuffer::offset(int scwidth)
case m_AlignJustify:
case m_AlignLeft:
- currentx = BORDER + leftMargin();
+ currentx = _border + leftMargin();
break;
}
@@ -189,58 +271,78 @@ int CDrawBuffer::offset(int scwidth)
}
-void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth)
+void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth, unsigned char _border)
{
- int currentx = offset(scwidth);
+ int gzoom = fc->gzoom();
+ int currentx = offset(scwidth, _border);
QString text = toQString(data());
CList<textsegment>::iterator textstart = segs.begin();
-/*
- StyleType align = textstart->style.getJustify();
- switch (align)
+ int extraspace = 0;
+ bool just = (!m_bEop && textstart->style.getJustify() == m_AlignJustify);
+ int spaces = 0;
+ int spacesofar = 0;
+ int spacenumber = 0;
+ int nonspace = 0;
+ if (just)
{
- case CStyle::m_AlignRight:
+ for (int i = 0; i < len; i++)
{
- currentx = scwidth - width() - 2*BORDER;
+ if ((*this)[i] != ' ')
+ {
+ nonspace = i;
+ break;
+ }
}
- break;
- case CStyle::m_AlignCentre:
+#ifdef _WINDOWS
+ for (i = nonspace; i < len; i++)
+#else
+ for (int i = nonspace; i < len; i++)
+#endif
{
- currentx = (scwidth - width())/2 - BORDER;
+ if ((*this)[i] == ' ')
+ {
+ spaces++;
+ }
+ }
+ if (spaces == 0)
+ {
+ just = false;
+ }
+ else
+ {
+ extraspace = (scwidth - 2*_border - rightMargin() - leftMargin() - width());
+ if (extraspace == 0) just = false;
}
- break;
- case CStyle::m_AlignJustify:
- case CStyle::m_AlignLeft:
- break;
}
-*/
CList<textsegment>::iterator textend = textstart;
do
{
textend++;
- int end = (textend != segs.end()) ? textend->start : length();
+ int end = (textend != segs.end()) ? textend->start : len;
CStyle currentstyle = textstart->style;
- QFont f((currentstyle.isMono() && fc->hasCourier()) ? QString("courier") : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) );
+ QFont f((currentstyle.isMono() && fc->hasCourier()) ? fc->fixedfontname() : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) );
// f.setUnderline(currentstyle.isUnderline());
// if (currentstyle.isUnderline()) qDebug("UNDERLINE");
_p->setFont(f);
QString str = text.mid(textstart->start, end-textstart->start);
-#ifdef OPIE
+#if defined(OPIE) || !defined(USEQPE)
_p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/100));
#else
_p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/10));
#endif
+ int voffset = currentstyle.getVOffset()*fc->getsize(currentstyle)/2;
if (_bMono)
{
if (currentstyle.isUnderline())
{
- _p->drawLine( currentx, _y, currentx + str.length()*_charWidth, _y);
+ _p->drawLine( currentx, _y+voffset, currentx + str.length()*_charWidth, _y+voffset);
}
if (currentstyle.isStrikethru())
{
int ascent = fc->ascent(currentstyle)/3;
- _p->drawLine( currentx, _y-ascent, currentx + str.length()*_charWidth, _y-ascent);
+ _p->drawLine( currentx, _y-ascent+voffset, currentx + str.length()*_charWidth, _y-ascent+voffset);
}
for (int i = 0; i < str.length(); i++)
{
- _p->drawText( currentx + i*_charWidth, _y, QString(str[i]));
+ _p->drawText( currentx + i*_charWidth, _y+voffset, QString(str[i]));
}
currentx += str.length()*_charWidth;
@@ -250,8 +352,21 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
if (currentstyle.isPicture())
{
+ int ht = (gzoom*currentstyle.getPicture()->height())/100;
+ int wt = (gzoom*currentstyle.getPicture()->width())/100;
int ascent = fc->ascent(currentstyle)/2;
- int yoffset = currentstyle.getPicture()->height()/2 + ascent;
- _p->drawPixmap( currentx, _y-yoffset, *(currentstyle.getPicture()));
- currentx += currentstyle.getPicture()->width();
+ int yoffset = ht/2 + ascent;
+
+ QPixmap pc;
+ if (gzoom != 100 && currentstyle.canScale())
+ {
+ QImage im = currentstyle.getPicture()->smoothScale(wt,ht);
+ pc.convertFromImage(im);
+ }
+ else
+ {
+ pc.convertFromImage(*currentstyle.getPicture());
+ }
+ _p->drawPixmap( currentx, _y-yoffset, pc );
+ currentx += wt;
}
else
@@ -263,16 +378,20 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
if (currentstyle.isUnderline())
{
- _p->drawLine( currentx, _y, currentx + w, _y);
+ _p->drawLine( currentx, _y+voffset, currentx + w, _y+voffset);
}
if (currentstyle.isStrikethru())
{
int ascent = fc->ascent(currentstyle)/3;
- _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent);
+ _p->drawLine( currentx, _y-ascent+voffset, currentx + w, _y-ascent+voffset);
}
QString str = text.mid(textstart->start, end-textstart->start);
- for (int i = 0; i < str.length(); i++)
+ for (unsigned int i = 0; i < str.length(); i++)
{
- _p->drawText( currentx, _y, QString(str[i]));
+#ifdef _WINDOWS
+ _p->drawText( currentx, _y+voffset, QString(str.at(i)));
+#else
+ _p->drawText( currentx, _y+voffset, QString(str[i]));
+#endif
currentx += cw;
}
@@ -281,15 +400,53 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
{
QFontMetrics fm(f);
- int w = fm.width(str);
+ int w;
+ if (just)
+ {
+ int lastspace = -1;
+ int nsp = 0;
+ int cx = currentx;
+ while ((nsp = str.find(" ", lastspace+1)) >= 0)
+ {
+ if (nsp+textstart->start >= nonspace)
+ {
+ spacenumber++;
+ int nexttoadd = (extraspace*spacenumber+spaces/2)/spaces - spacesofar;
+ QString nstr = str.mid(lastspace+1, nsp-lastspace);
+// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr);
+ int lw = fm.width(nstr);
+ _p->drawText( cx, _y+voffset, nstr);
+ cx += lw+nexttoadd;
+ spacesofar += nexttoadd;
+ lastspace = nsp;
+ }
+ else
+ {
+ QString nstr = str.mid(lastspace+1, nsp-lastspace);
+// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr);
+ int lw = fm.width(nstr);
+ _p->drawText( cx, _y+voffset, nstr);
+ cx += lw;
+ lastspace = nsp;
+ }
+ }
+ QString nstr = str.right(str.length()-1-lastspace);
+ _p->drawText( cx, _y+voffset, nstr);
+ cx += fm.width(nstr);
+ w = cx - currentx;
+ }
+ else
+ {
+ _p->drawText( currentx, _y+voffset, str);
+ w = fm.width(str);
+ }
if (currentstyle.isUnderline())
{
- _p->drawLine( currentx, _y, currentx + w, _y);
+ _p->drawLine( currentx, _y+voffset, currentx + w, _y+voffset);
}
if (currentstyle.isStrikethru())
{
int ascent = fc->ascent(currentstyle)/3;
- _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent);
+ _p->drawLine( currentx, _y-ascent+voffset, currentx + w, _y-ascent+voffset);
}
- _p->drawText( currentx, _y, str);
currentx += w;
}
@@ -298,5 +455,5 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
textstart = textend;
}
- while (textend != segs.end() && textstart->start < length()-1);
+ while (textend != segs.end() && textstart->start < len);
}
@@ -315,10 +472,10 @@ linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt)
{
textend++;
- end = (textend != segs.end()) ? textend->start : length();
+ end = (textend != segs.end()) ? textend->start : len;
currentstyle = textstart->style;
/*
if (currentstyle.isPicture()) qDebug("Passed thru picture");
if (currentstyle.getLink()) qDebug("Passed thru link");
- qDebug("islink:%d - %d", numchars, end);
+ //qDebug("islink:%d - %d", numchars, end);
*/
textstart = textend;
@@ -341,7 +498,7 @@ linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt)
void CDrawBuffer::resize()
{
- int i;
+ int gzoom = fc->gzoom();
m_maxstyle = m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0;
- for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= length(); )
+ for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= len; )
{
CList<textsegment>::iterator next = iter;
@@ -358,8 +515,8 @@ void CDrawBuffer::resize()
linespacing = fc->lineSpacing(_style);
extra = linespacing - ascent - descent;
- if (_style.isPicture())
+ if (_style.isPicture() && _style.canScale())
{
- descent = (_style.getPicture()->height()-ascent)/2;
- ascent = (_style.getPicture()->height()+ascent)/2;
+ descent = ((gzoom*_style.getPicture()->height())/100-ascent)/2;
+ ascent = ((gzoom*_style.getPicture()->height())/100+ascent)/2;
}
/*
@@ -377,3 +534,17 @@ void CDrawBuffer::resize()
m_lineSpacing = m_ascent+m_descent+m_lineExtraSpacing;
}
+ int lead = fc->getlead();
+ if (lead != 0)
+ {
+ int xt = (lead*m_lineSpacing+5)/10;
+ m_descent += xt;
+ m_lineSpacing += xt;
+ }
+ if (m_bSop)
+ {
+ int xt = ((segs.begin()->style.getExtraSpace()+fc->getextraspace())*fc->getsize(segs.begin()->style)+5)/10;
+// qDebug("ExtraSpace:%d", xt);
+ m_ascent += xt;
+ m_lineSpacing += xt;
+ }
}