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.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/noncore/apps/opie-reader/CDrawBuffer.cpp b/noncore/apps/opie-reader/CDrawBuffer.cpp
index bfb3027..227f0f6 100644
--- a/noncore/apps/opie-reader/CDrawBuffer.cpp
+++ b/noncore/apps/opie-reader/CDrawBuffer.cpp
@@ -343,48 +343,49 @@ int CDrawBuffer::rightMargin()
{
return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style)+3)/6;
}
int CDrawBuffer::offset(int scwidth, unsigned short _lborder, unsigned short _rborder, int availht)
{
int currentx = _lborder;
switch(segs.begin()->style.getJustify())
{
case m_AlignRight:
{
currentx = scwidth - _rborder - rightMargin() - width(availht);
}
break;
case m_AlignCentre:
{
currentx = (
scwidth - _lborder -_rborder +
leftMargin() - rightMargin()
- width(availht))/2 + _lborder;
}
break;
case m_AlignJustify:
case m_AlignLeft:
+ case m_AlignNone:
currentx = _lborder + leftMargin();
break;
}
return currentx;
}
void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth, unsigned short _lborder, unsigned short _rborder, const QColor& _bg, int availht)
{
CList<textsegment>::iterator textstart = segs.begin();
QColor paperColour = QColor(qRgb(textstart->style.pRed(),
textstart->style.pGreen(),
textstart->style.pBlue()));
Highlight(_p, !(paperColour == _bg), _lborder, _y, scwidth-(_lborder+_rborder), paperColour);
// Highlight(_p, true, _lborder, _y, scwidth-(_lborder+_rborder), paperColour);
int gzoom = fc->gzoom();
int currentx = offset(scwidth, _lborder, _rborder, availht);
if (!m_hastext)
{
for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end(); iter++)
{
CStyle currentstyle = iter->style;
if (currentstyle.isPicture())
{
@@ -463,49 +464,49 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
int end = (textend != segs.end()) ? textend->start : len;
CStyle currentstyle = textstart->style;
/*
bool drawBackground = (
currentstyle.bRed() != 255
||
currentstyle.bGreen() != 255
||
currentstyle.bBlue() != 255
);
*/
QColor bgColour = QColor(qRgb(currentstyle.bRed(),
currentstyle.bGreen(),
currentstyle.bBlue()));
drawBackground = !(bgColour == _bg);
// if (drawBackground) qDebug("Drawing background");
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);
#if defined(OPIE) || !defined(USEQPE)
- _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/100));
+ _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/10/*0*/));
#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)
{
Highlight(_p, drawBackground, currentx, _y, str.length()*_charWidth, bgColour);
if (currentstyle.isUnderline())
{
_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+voffset, currentx + str.length()*_charWidth, _y-ascent+voffset);
}
for (int i = 0; i < str.length(); i++)
{
_p->drawText( currentx + i*_charWidth, _y+voffset, QString(str[i]));
}
currentx += str.length()*_charWidth;
}
@@ -637,163 +638,179 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
{
Highlight(_p, drawBackground, currentx, _y, scwidth - (currentx + _lborder + _rborder), bgColour);
}
*/
}
void CDrawBuffer::Highlight(QPainter* _p, bool drawBackground, int _x, int _y, int w, QColor bgColour)
{
if (drawBackground)
{
_p->fillRect(_x, _y-m_ascent, w, m_lineSpacing, bgColour);
}
}
CStyle CDrawBuffer::laststyle()
{
return segs.last().style;
}
CStyle CDrawBuffer::firststyle()
{
return segs.first().style;
}
-linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*& img)
+linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*& img, size_t& tabletgt)
{
linkType ret = eNone;
int end = 0;
CStyle currentstyle;
CList<textsegment>::iterator textstart = segs.begin();
CList<textsegment>::iterator textend = textstart;
do
{
textend++;
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);
*/
textstart = textend;
}
while (textend != segs.end() && end <= numchars);
img = currentstyle.getPicture();
if (currentstyle.getPictureLink())
{
pictgt = currentstyle.getPictureLinkData();
ret |= ePicture;
}
if (currentstyle.getLink())
{
tgt = currentstyle.getData();
offset = currentstyle.getOffset();
ret |= eLink;
}
+ if (currentstyle.isTable())
+ {
+ tabletgt = currentstyle.getTable();
+ ret |= eTable;
+ }
return ret;
}
void CDrawBuffer::resize(int availht)
{
int gzoom = fc->gzoom();
m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0;
/*
int t_ascent = 0;
int t_descent = 0;
int t_lineExtraSpacing = 0;
*/
int t_lineSpacing = 0;
m_hastext = false;
for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= len; )
{
CStyle _style = iter->style;
if (!_style.isPicture())
{
m_hastext = true;
break;
}
iter++;
}
if (m_hastext)
{
-
+ int p_linespacing = 0;
for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= len; )
{
CList<textsegment>::iterator next = iter;
iter++;
int st = next->start;
if (st < 0) st = 0;
CStyle _style = next->style;
int linespacing, ascent, descent, extra;
ascent = fc->ascent(_style);
descent = fc->descent(_style);
linespacing = fc->lineSpacing(_style);
extra = linespacing - ascent - descent;
/*
if (ascent > t_ascent) t_ascent = ascent;
if (descent > t_descent) t_descent = descent;
if (extra > t_lineExtraSpacing) t_lineExtraSpacing = extra;
t_lineSpacing = t_ascent+t_descent+t_lineExtraSpacing;
*/
if (linespacing > t_lineSpacing) t_lineSpacing = linespacing;
if (_style.isPicture())
{
int ht = (gzoom*_style.getPicture()->height())/100;
int wt = (gzoom*_style.getPicture()->width())/100;
bool willscale = false;
if (ht > availht)
{
wt = (wt*availht)/ht;
ht = availht;
willscale = true;
}
if (willscale || _style.canScale())
{
descent = ((gzoom*_style.getPicture()->height())/100-ascent)/2;
ascent = ((gzoom*_style.getPicture()->height())/100+ascent)/2;
}
+ else
+ {
+ descent = (_style.getPicture()->height()-ascent)/2;
+ ascent = (_style.getPicture()->height()+ascent)/2;
+ }
+ int lineSpacing = ascent+descent;
+ if (lineSpacing > p_linespacing)
+ {
+ p_linespacing = lineSpacing;
+ }
+ extra = 0;
}
/*
else if (fc != NULL)
{
ascent = fc->ascent(_style);
descent = fc->descent(_style);
linespacing = fc->lineSpacing(_style);
extra = linespacing - ascent - descent;
}
*/
if (ascent > m_ascent) m_ascent = ascent;
if (descent > m_descent) m_descent = descent;
if (extra > m_lineExtraSpacing) m_lineExtraSpacing = extra;
m_lineSpacing = m_ascent+m_descent+m_lineExtraSpacing;
}
- m_showPartial = (m_lineSpacing > t_lineSpacing);
+ m_showPartial = (p_linespacing > t_lineSpacing);
int lead = fc->getlead();
if (lead != 0)
{
int xt = (lead*t_lineSpacing+5)/10;
m_lineExtraSpacing += 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;
}
}
else
{
m_showPartial = true;
int maxheight = 0;
for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end(); iter++)
{
CStyle _style = iter->style;
if (_style.isPicture())
{