From kde-commits Sat Jan 14 23:14:10 2006 From: Allan Sandfeld Jensen Date: Sat, 14 Jan 2006 23:14:10 +0000 To: kde-commits Subject: branches/KDE/3.5/kdelibs/khtml Message-Id: <1137280450.500847.30737.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=113728047316010 SVN commit 498206 by carewolf: Respect min/max sizes and aspect ratios at the same time. Matches the CSS 2.1 standard and Opera, but differs from Firefox and Safari. BUG: 120107 M +5 -0 ChangeLog M +72 -17 rendering/render_image.cpp M +6 -0 rendering/render_image.h --- branches/KDE/3.5/kdelibs/khtml/ChangeLog #498205:498206 @@ -1,3 +1,8 @@ +2006-01-14 Allan Sandfeld Jensen + + * rendering/render_image.cpp (calcReplacedWidth,calcReplacedHeight): + Respect both min/max sizes and aspect-ratio when resizing. + 2006-01-03 Allan Sandfeld Jensen * css/cssparser.cpp: Allow content: normal | none --- branches/KDE/3.5/kdelibs/khtml/rendering/render_image.cpp #498205:498206 @@ -244,7 +244,7 @@ static QPixmap *loadingIcon; QColor bg = khtml::retrieveBackgroundColor(this); QColor fg = khtml::hasSufficientContrast(Qt::gray, bg) ? Qt::gray : - (hasSufficientContrast(Qt::white, bg) ? Qt::white : Qt::black); + (hasSufficientContrast(Qt::white, bg) ? Qt::white : Qt::black); paintInfo.p->setPen(QPen(fg, 1)); paintInfo.p->setBrush( Qt::NoBrush ); paintInfo.p->drawRect(_tx, _ty, m_width, m_height); @@ -255,7 +255,7 @@ } paintInfo.p->drawPixmap(_tx + 4, _ty + 4, *loadingIcon, 0, 0, m_width - 5, m_height - 5); } - + } //kdDebug( 6040 ) << " contents (" << contentWidth << "/" << contentHeight << ") border=" << borderLeft() << " padding=" << paddingLeft() << endl; @@ -497,32 +497,87 @@ return image && image->valid_rect().size() == image->pixmap_size() && !needsLayout(); } -short RenderImage::calcReplacedWidth() const +bool RenderImage::isWidthSpecified() const { - const Length w = style()->width(); + switch (style()->width().type()) { + case Fixed: + case Percent: + return true; + default: + return false; + } + assert(false); + return false; +} - if (w.isVariable()) { - int h = RenderReplaced::calcReplacedHeight(); - if (m_intrinsicHeight > 0 && h!= m_intrinsicHeight) { - return (h*intrinsicWidth())/m_intrinsicHeight; - } +bool RenderImage::isHeightSpecified() const +{ + switch (style()->height().type()) { + case Fixed: + case Percent: + return true; + default: + return false; } + assert(false); + return false; +} - return RenderReplaced::calcReplacedWidth(); +short RenderImage::calcAspectRatioWidth() const +{ + if (intrinsicHeight() == 0) + return 0; + if (!image || image->isErrorImage()) + return intrinsicWidth(); // Don't bother scaling. + return RenderReplaced::calcReplacedHeight() * intrinsicWidth() / intrinsicHeight(); } +int RenderImage::calcAspectRatioHeight() const +{ + if (intrinsicWidth() == 0) + return 0; + if (!image || image->isErrorImage()) + return intrinsicHeight(); // Don't bother scaling. + return RenderReplaced::calcReplacedWidth() * intrinsicHeight() / intrinsicWidth(); +} + +short RenderImage::calcReplacedWidth() const +{ + int width; + if (isWidthSpecified()) + width = calcReplacedWidthUsing(Width); + else + width = calcAspectRatioWidth(); + int minW = calcReplacedWidthUsing(MinWidth); + int maxW = style()->maxWidth().value() == UNDEFINED ? width : calcReplacedWidthUsing(MaxWidth); + + if (width > maxW) + width = maxW; + + if (width < minW) + width = minW; + + return width; +} + int RenderImage::calcReplacedHeight() const { - const Length h = style()->height(); + int height; + if (isHeightSpecified()) + height = calcReplacedHeightUsing(Height); + else + height = calcAspectRatioHeight(); - if (h.isVariable()) { - int w = RenderReplaced::calcReplacedWidth(); - if( m_intrinsicWidth > 0 && w != m_intrinsicWidth ) - return (w*intrinsicHeight())/m_intrinsicWidth; + int minH = calcReplacedHeightUsing(MinHeight); + int maxH = style()->maxHeight().value() == UNDEFINED ? height : calcReplacedHeightUsing(MaxHeight); - } + if (height > maxH) + height = maxH; - return RenderReplaced::calcReplacedHeight(); + if (height < minH) + height = minH; + + return height; } #if 0 --- branches/KDE/3.5/kdelibs/khtml/rendering/render_image.h #498205:498206 @@ -66,6 +66,12 @@ virtual void notifyFinished(CachedObject *finishedObj); virtual bool nodeAtPoint(NodeInfo& info, int x, int y, int tx, int ty, HitTestAction hitTestAction, bool inside); + bool isWidthSpecified() const; + bool isHeightSpecified() const; + + short calcAspectRatioWidth() const; + int calcAspectRatioHeight() const; + virtual short calcReplacedWidth() const; virtual int calcReplacedHeight() const;