From kde-commits Sat Oct 04 11:17:02 2008 From: Harri Porten Date: Sat, 04 Oct 2008 11:17:02 +0000 To: kde-commits Subject: branches/KDE/4.1/kdelibs/khtml Message-Id: <1223119022.812639.11899.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=122311903303146 SVN commit 867730 by porten: Merged revision 867728: Set color components directly on the scan line rather than reading and setting QColor values with pixel() and setPixel(). Saved about 4-6% of cpu cycles on a heavy duty example. M +1 -16 ecma/kjs_context2d.cpp M +28 -0 html/html_canvasimpl.cpp M +1 -0 html/html_canvasimpl.h --- branches/KDE/4.1/kdelibs/khtml/ecma/kjs_context2d.cpp #867729:867730 @@ -815,22 +815,7 @@ unsigned char componentValue = decodeComponent(exec, value); unsigned int pixel = index / 4; unsigned int comp = index % 4; - QColor cur = parent->impl()->pixel(pixel); - switch (comp) { //RGBA.. - case 0: - cur.setRed(componentValue); - break; - case 1: - cur.setGreen(componentValue); - break; - case 2: - cur.setBlue(componentValue); - break; - default: - cur.setAlpha(componentValue); - break; - } - parent->impl()->setPixel(pixel, cur); + parent->impl()->setComponent(pixel, comp, componentValue); return; } --- branches/KDE/4.1/kdelibs/khtml/html/html_canvasimpl.cpp #867729:867730 @@ -695,6 +695,34 @@ data.setPixel(pixelNum % w, pixelNum / w, code); } +void CanvasImageDataImpl::setComponent(unsigned pixelNum, int component, + int value) +{ + int w = data.width(); + int x = pixelNum % w; + int y = pixelNum / w; + // ### could avoid inherent QImage::detach() by a const cast + QRgb *rgb = reinterpret_cast(data.scanLine(y) + 4 * x); + unsigned char a = qAlpha(*rgb); + switch (component) { + case 0: + *rgb = qRgba(premulComponent(value, a), qGreen(*rgb), qBlue(*rgb), a); + break; + case 1: + *rgb = qRgba(qRed(*rgb), premulComponent(value, a), qBlue(*rgb), a); + break; + case 2: + *rgb = qRgba(qRed(*rgb), qGreen(*rgb), premulComponent(value, a), a); + break; + default: + *rgb = qRgba(premulComponent(unpremulComponent(qRed(*rgb), a), value), + premulComponent(unpremulComponent(qGreen(*rgb), a), value), + premulComponent(unpremulComponent(qBlue(*rgb), a), value), + value); + break; + } +} + //------- void CanvasContext2DImpl::setStrokeStyle(CanvasStyleBaseImpl* strokeStyle) --- branches/KDE/4.1/kdelibs/khtml/html/html_canvasimpl.h #867729:867730 @@ -186,6 +186,7 @@ unsigned height() const; QColor pixel(unsigned pixelNum) const; void setPixel(unsigned pixelNum, const QColor& val); + void setComponent(unsigned pixelNum, int component, int value); QImage data; };