| Summary: | images in html should be scalable like fonts | ||
|---|---|---|---|
| Product: | [Applications] konqueror | Reporter: | james |
| Component: | khtml | Assignee: | Konqueror Bugs <konqueror-bugs-null> |
| Status: | RESOLVED FIXED | ||
| Severity: | wishlist | CC: | dominik.karall, elias_kunnas, fh, joachim.eibl, mpartap, taj |
| Priority: | NOR | ||
| Version First Reported In: | unspecified | ||
| Target Milestone: | --- | ||
| Platform: | Mandrake RPMs | ||
| OS: | Linux | ||
| Latest Commit: | Version Fixed/Implemented In: | ||
| Sentry Crash Report: | |||
|
Description
james
2002-05-02 17:07:50 UTC
*** Bug 83359 has been marked as a duplicate of this bug. *** *** Bug 87728 has been marked as a duplicate of this bug. *** Opera has this feature. There exists an extension for Firefox/Mozilla which provides per-image zoom functionality as described above. Yes, it would be great to have this feature in kde-4.0, specially for people using a great resolution. All objects (text, images, flash objects, etc.) should zoom accordingly, Opera does it really wel. As the original poster already sayed it shouldn't be so difficult to implement. *** Bug 100284 has been marked as a duplicate of this bug. *** *** Bug 100284 has been marked as a duplicate of this bug. *** *** Bug 112324 has been marked as a duplicate of this bug. *** *** Bug 115115 has been marked as a duplicate of this bug. *** *** This bug has been confirmed by popular vote. *** *** Bug 87862 has been marked as a duplicate of this bug. *** SVN commit 630479 by ggarand:
A simple "page scaling" zoom à la Opera.
For now, it replaces the font scaling action, as the method names used for it
in KHTML part are better suited to a real zoom (e.g. setZoomFactor).
Need to reintroduce pure font-scaling under another name..
Also introduce an alternate, non-blitting painting mode for being able to do
fixed positioning again.
QScrollArea's quite a bit on the terse side, so there was no such thing ;(
Should fix widget jittering issues as a bonus.
BUG: 42029, 68721
M +2 -2 css/cssstyleselector.cpp
M +9 -4 khtml_part.cpp
M +111 -18 khtmlview.cpp
M +20 -1 khtmlview.h
M +15 -8 rendering/render_canvas.cpp
M +1 -1 rendering/render_replaced.cpp
M +2 -0 xml/dom_nodeimpl.cpp
--- trunk/KDE/kdelibs/khtml/css/cssstyleselector.cpp #630478:630479
@@ -749,7 +749,7 @@
// FIXME: We only need to invalidate the fixed regions when scrolling. It's total overkill to
// prevent the entire view from blitting on a scroll.
if (style->hasFixedBackgroundImage() && view)
- view->useSlowRepaints();
+ view->setHasStaticBackground();
}
unsigned int CSSStyleSelector::addInlineDeclarations(DOM::ElementImpl* e,
@@ -2414,7 +2414,7 @@
p = ABSOLUTE; break;
case CSS_VAL_FIXED:
{
- view->useSlowRepaints();
+ view->setHasStaticBackground();
p = FIXED;
break;
}
--- trunk/KDE/kdelibs/khtml/khtml_part.cpp #630478:630479
@@ -5754,11 +5754,16 @@
if (d->m_zoomFactor == percent) return;
d->m_zoomFactor = percent;
- if(d->m_doc) {
+ if(d->m_view) {
QApplication::setOverrideCursor( Qt::WaitCursor );
- if (d->m_doc->styleSelector())
- d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
- d->m_doc->recalcStyle( NodeImpl::Force );
+
+// ### make the increasing/decreasing of font size a separate setting
+//
+// if (d->m_doc->styleSelector())
+// d->m_doc->styleSelector()->computeFontSizes(d->m_doc->paintDeviceMetrics(), d->m_zoomFactor);
+// d->m_doc->recalcStyle( NodeImpl::Force );
+
+ d->m_view->setZoomLevel( d->m_zoomFactor );
QApplication::restoreOverrideCursor();
}
--- trunk/KDE/kdelibs/khtml/khtmlview.cpp #630478:630479
@@ -186,10 +186,11 @@
oldUnderMouse->deref();
oldUnderMouse = 0;
linkPressed = false;
- useSlowRepaints = false;
+ staticWidget = false;
tabMovePending = false;
lastTabbingDirection = true;
pseudoFocusNode = PFNone;
+ zoomLevel = 100;
#ifndef KHTML_NO_SCROLLBARS
//We don't turn off the toolbars here
//since if the user turns them
@@ -287,6 +288,8 @@
scrollSuspended = false;
}
+ bool haveZoom() const { return zoomLevel != 100; }
+
#ifndef KHTML_NO_CARET
/** this function returns an instance of the caret view context. If none
* exists, it will be instantiated.
@@ -324,9 +327,10 @@
Qt::ScrollBarPolicy hpolicy;
bool prevScrollbarVisible:1;
bool linkPressed:1;
- bool useSlowRepaints:1;
+ bool staticWidget:1;
bool ignoreWheelEvents:1;
+ int zoomLevel;
int borderX, borderY;
KSimpleConfig *formCompletions;
@@ -510,9 +514,13 @@
QSize s = viewport()->size();
resizeContents(s.width(), s.height());
- // ### we'll enable redirection of khtmlview here
- // when event and painting issues have been thoroughly worked out
- // m_kwp->setIsRedirected(true);
+ // ### we'll enable redirection of khtmlview
+ // when event issues have been thoroughly worked out
+
+ bool redirect = false; // m_part->parentPart() && !isFrame() ...
+
+ m_kwp->setIsRedirected( redirect );
+ d->staticWidget = redirect;
}
void KHTMLView::clear()
@@ -640,6 +648,7 @@
void KHTMLView::updateContents(int x, int y, int w, int h)
{
+ applyTransforms(x, y, w, h);
widget()->update(x, y, w, h);
}
@@ -650,6 +659,7 @@
void KHTMLView::repaintContents(int x, int y, int w, int h)
{
+ applyTransforms(x, y, w, h);
widget()->repaint(x, y, w, h);
}
@@ -658,6 +668,42 @@
repaintContents( r.x(), r.y(), r.width(), r.height() );
}
+void KHTMLView::applyTransforms( int& x, int& y, int& w, int& h) const
+{
+ if (d->staticWidget) {
+ x -= contentsX();
+ y -= contentsY();
+ }
+ if (d->haveZoom()) {
+ const int z = d->zoomLevel;
+ x = x*z/100;
+ y = y*z/100;
+ w = w*z/100;
+ h = h*z/100;
+ }
+}
+
+void KHTMLView::revertTransforms( int& x, int& y, int& w, int& h) const
+{
+ if (d->staticWidget) {
+ x += contentsX();
+ y += contentsY();
+ }
+ if (d->haveZoom()) {
+ const int z = d->zoomLevel;
+ x = x*100/z;
+ y = y*100/z;
+ w = w*100/z;
+ h = h*100/z;
+ }
+}
+
+void KHTMLView::revertTransforms( int& x, int& y ) const
+{
+ int dummy = 0;
+ revertTransforms(x, y, dummy, dummy);
+}
+
void KHTMLView::resizeEvent (QResizeEvent* e)
{
int dw = e->oldSize().width() - e->size().width();
@@ -692,16 +738,30 @@
QRect r = e->rect();
QRect v(contentsX(), contentsY(), visibleWidth(), visibleHeight());
+ if (d->staticWidget) {
+ QPoint off(contentsX(),contentsY());
+ p.translate(-off);
+ r.translate(off);
+ }
r = r.intersect(v);
if (!r.isValid() || r.isEmpty()) return;
- p.setClipRect(v);
+
+ if (d->haveZoom()) {
+ p.scale( d->zoomLevel/100., d->zoomLevel/100.);
+ r.setX(r.x()*100/d->zoomLevel);
+ r.setY(r.y()*100/d->zoomLevel);
+ r.setWidth(r.width()*100/d->zoomLevel);
+ r.setHeight(r.height()*100/d->zoomLevel);
+ }
+ p.setClipRect(r);
+
int ex = r.x();
int ey = r.y();
int ew = r.width();
int eh = r.height();
-
+
if(!m_part || !m_part->xmlDocImpl() || !m_part->xmlDocImpl()->renderer()) {
p.fillRect(ex, ey, ew, eh, palette().brush(QPalette::Active, QPalette::Base));
return;
@@ -882,6 +942,23 @@
QScrollArea::closeEvent( ev );
}
+void KHTMLView::setZoomLevel(int percent)
+{
+ percent = percent < 20 ? 20 : (percent > 800 ? 800 : percent);
+ int oldpercent = d->zoomLevel;
+ d->zoomLevel = percent;
+ if (percent != oldpercent) {
+ if (d->layoutSchedulingEnabled)
+ layout();
+ widget()->update();
+ }
+}
+
+int KHTMLView::zoomLevel() const
+{
+ return d->zoomLevel;
+}
+
//
// Event Handling
//
@@ -898,6 +975,7 @@
int xm = _mouse->x();
int ym = _mouse->y();
+ revertTransforms(xm, ym);
// kDebug( 6000 ) << "mousePressEvent: viewport=("<<_mouse->x()-contentsX()<<"/"<<_mouse->y()-contentsY()<<"), contents=(" << xm << "/" << ym << ")\n";
@@ -1018,6 +1096,7 @@
int xm = _mouse->x();
int ym = _mouse->y();
+ revertTransforms(xm, ym);
// kDebug( 6000 ) << "mouseDblClickEvent: x=" << xm << ", y=" << ym << endl;
@@ -1087,6 +1166,7 @@
int xm = _mouse->x();
int ym = _mouse->y();
+ revertTransforms(xm, ym);
DOM::NodeImpl::MouseEvent mev( _mouse->buttons(), DOM::NodeImpl::MouseMove );
// Do not modify :hover/:active state while mouse is pressed.
@@ -1240,6 +1320,7 @@
int xm = _mouse->x();
int ym = _mouse->y();
+ revertTransforms(xm, ym);
DOM::NodeImpl::MouseEvent mev( _mouse->buttons(), DOM::NodeImpl::MouseRelease );
@@ -3001,10 +3082,11 @@
}
-void KHTMLView::useSlowRepaints()
+void KHTMLView::setHasStaticBackground()
{
- d->useSlowRepaints = true;
-// setStaticBackground(true); ### ?? FIXME
+ if (!d->staticWidget)
+ widget()->move(0,0);
+ d->staticWidget = true;
}
@@ -3136,6 +3218,7 @@
int exceptioncode = 0;
int pageX = _mouse->x();
int pageY = _mouse->y();
+ revertTransforms(pageX, pageY);
int clientX = pageX - contentsX();
int clientY = pageY - contentsY();
int screenX = _mouse->globalX();
@@ -3164,7 +3247,7 @@
// mouseout/mouseover
if (setUnder && d->oldUnderMouse != targetNode) {
- if (d->oldUnderMouse && d->oldUnderMouse->getDocument() != targetNode->getDocument()) {
+ if (d->oldUnderMouse && d->oldUnderMouse->getDocument() != m_part->xmlDocImpl()) {
d->oldUnderMouse->deref();
d->oldUnderMouse = 0;
}
@@ -3436,16 +3519,29 @@
horizontalScrollBar()->maximum()-horizontalScrollBar()->value() : horizontalScrollBar()->value();
d->contentsY = verticalScrollBar()->value();
- if (d->useSlowRepaints) {
- widget()->blockSignals( true );
- widget()->move( widget()->pos().x() + dx, widget()->pos().y() +dy );
- widget()->blockSignals( false );
+ if ( d->staticWidget ) {
widget()->repaint();
return;
}
QScrollArea::scrollContentsBy(dx, dy);
}
+void KHTMLView::addChild(QWidget * child, int x, int y)
+{
+ if (!child)
+ return;
+
+ if (child->parent() != widget())
+ child->setParent( widget() );
+
+ // ### handle pseudo-zooming of non-redirected widgets (e.g. just resize'em)
+
+ if (!d->staticWidget)
+ child->move(x, y);
+ else
+ child->move(x-contentsX(), y-contentsY());
+}
+
void KHTMLView::timerEvent ( QTimerEvent *e )
{
// kDebug() << "timer event " << e->timerId() << endl;
@@ -3518,9 +3614,6 @@
}
}
-// setStaticBackground(d->useSlowRepaints); ?? ### FIXME
-
-// kDebug() << "scheduled repaint "<< d->repaintTimerId << endl;
if (d->repaintTimerId)
killTimer(d->repaintTimerId);
d->repaintTimerId = 0;
--- trunk/KDE/kdelibs/khtml/khtmlview.h #630478:630479
@@ -98,6 +98,7 @@
friend class DOM::HTMLFormElementImpl;
friend class DOM::HTMLAnchorElementImpl;
friend class DOM::HTMLInputElementImpl;
+ friend class DOM::NodeImpl;
friend class DOM::DocumentImpl;
friend class KHTMLPart;
friend class khtml::RenderCanvas;
@@ -257,6 +258,8 @@
*/
void updateContents( const QRect& r );
void updateContents(int x, int y, int w, int h);
+
+ void addChild(QWidget *child, int dx, int dy);
/**
* Requests an immediate repaint of the content area
@@ -264,6 +267,18 @@
*/
void repaintContents( const QRect& r );
void repaintContents(int x, int y, int w, int h);
+
+ /**
+ * Apply a zoom level to the content area
+ * @param percent a zoom level expressed as a percentage
+ */
+ void setZoomLevel( int percent );
+
+ /**
+ * Retrieve the current zoom level
+ *
+ */
+ int zoomLevel() const;
public Q_SLOTS:
/**
@@ -393,7 +408,10 @@
QMap< DOM::ElementImpl*, QChar > buildFallbackAccessKeys() const;
void displayAccessKeys( KHTMLView* caller, KHTMLView* origview, QVector< QChar >& taken, bool use_fallbacks );
- void useSlowRepaints();
+ void setHasStaticBackground();
+ void applyTransforms( int& x, int& y, int& w, int& h) const;
+ void revertTransforms( int& x, int& y, int& w, int& h) const;
+ void revertTransforms( int& x, int& y ) const;
void setIgnoreWheelEvents(bool e);
@@ -699,6 +717,7 @@
void setWidgetVisible(::khtml::RenderWidget*, bool visible);
+
int _width;
int _height;
--- trunk/KDE/kdelibs/khtml/rendering/render_canvas.cpp #630478:630479
@@ -220,35 +220,42 @@
// update our cached document size
int hDocH = m_cachedDocHeight = docHeight();
int hDocW = m_cachedDocWidth = docWidth();
+
+ int zLevel = m_view? m_view->zoomLevel() : 100;
+ hDocW = hDocW*zLevel/100;
+ hDocH = hDocH*zLevel/100;
if (!m_pagedMode && m_view) {
bool vss = !m_view->verticalScrollBar()->isHidden();
bool hss = !m_view->horizontalScrollBar()->isHidden();
QSize s = m_view->maximumViewportSize();
- if ( m_cachedDocWidth > s.width() )
+
+ int zoomedDocWidth = m_cachedDocWidth*zLevel/100;
+ int zoomedDocHeight = m_cachedDocHeight*zLevel/100;
+ if ( zoomedDocWidth > s.width() )
s.setWidth( s.width()-m_view->verticalScrollBar()->sizeHint().width() );
- if ( m_cachedDocHeight > s.height() )
+ if ( zoomedDocHeight > s.height() )
s.setHeight( s.height()-m_view->horizontalScrollBar()->sizeHint().height() );
// if we are about to show a scrollbar, and the document is sized to the viewport w or h,
// then reserve the scrollbar space so that it doesn't trigger the _other_ scrollbar
if (!vss && m_width - m_view->verticalScrollBar()->sizeHint().width() == s.width() &&
- m_cachedDocWidth <= m_width)
- hDocW = qMin( m_cachedDocWidth, s.width() );
+ zoomedDocWidth <= m_width)
+ hDocW = qMin( zoomedDocWidth, s.width() );
if (!hss && m_height - m_view->horizontalScrollBar()->sizeHint().height() == s.height() &&
- m_cachedDocHeight <= m_height)
- hDocH = qMin( m_cachedDocHeight, s.height() );
+ zoomedDocHeight <= m_height)
+ hDocH = qMin( zoomedDocHeight, s.height() );
// likewise, if a scrollbar is shown, and we have a cunning plan to turn it off,
// think again if we are falling downright in the hysteresis zone
- if (vss && s.width() > m_cachedDocWidth && m_cachedDocWidth > m_view->visibleWidth())
+ if (vss && s.width() > zoomedDocWidth && zoomedDocWidth > m_view->visibleWidth())
hDocW = s.width()+1;
- if (hss && s.height() > m_cachedDocHeight && m_cachedDocHeight > m_view->visibleHeight())
+ if (hss && s.height() > zoomedDocHeight && zoomedDocHeight > m_view->visibleHeight())
hDocH = s.height()+1;
m_view->resizeContents(hDocW, hDocH);
--- trunk/KDE/kdelibs/khtml/rendering/render_replaced.cpp #630478:630479
@@ -524,7 +524,7 @@
}
m_view->setWidgetVisible(this, true);
if (!khtmlw)
- m_widget->move( xPos, yPos );
+ m_view->addChild( m_widget, xPos, yPos );
else
m_widget->move( xPos, -500000 +yPos);
m_widget->show();
--- trunk/KDE/kdelibs/khtml/xml/dom_nodeimpl.cpp #630478:630479
@@ -503,6 +503,8 @@
int exceptioncode = 0;
int pageX = _mouse->x();
int pageY = _mouse->y();
+ if ( getDocument()->view() )
+ getDocument()->view()->revertTransforms( pageX, pageY );
int clientX = pageX;
int clientY = pageY;
if ( getDocument()->view() )
|