From f6514056940074dd3e9da38028726c1f37d5489c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 16 Jan 2019 19:43:01 +0100 Subject: [PATCH] Optimize the Painter::blit() loop a bit. ~3% fewer cycles, I'll take it. --- AK/StdLibExtras.h | 4 ++-- Widgets/GraphicsBitmap.cpp | 9 --------- Widgets/GraphicsBitmap.h | 10 ++++++++++ Widgets/Painter.cpp | 14 ++++++++++---- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/AK/StdLibExtras.h b/AK/StdLibExtras.h index 84a0174f7e..4e50a3cad1 100644 --- a/AK/StdLibExtras.h +++ b/AK/StdLibExtras.h @@ -20,7 +20,7 @@ ALWAYS_INLINE void fast_dword_copy(dword* dest, const dword* src, size_t count) #ifdef SERENITY asm volatile( "rep movsl\n" - : "=S"(src), "=D"(dest) + : "=S"(src), "=D"(dest), "=c"(count) : "S"(src), "D"(dest), "c"(count) : "memory" ); @@ -34,7 +34,7 @@ ALWAYS_INLINE void fast_dword_fill(dword* dest, dword value, size_t count) #ifdef SERENITY asm volatile( "rep stosl\n" - : "=D"(dest) + : "=D"(dest), "=c"(count) : "D"(dest), "c"(count), "a"(value) : "memory" ); diff --git a/Widgets/GraphicsBitmap.cpp b/Widgets/GraphicsBitmap.cpp index 3dbc47cf47..d7a4445b79 100644 --- a/Widgets/GraphicsBitmap.cpp +++ b/Widgets/GraphicsBitmap.cpp @@ -55,12 +55,3 @@ GraphicsBitmap::~GraphicsBitmap() m_data = nullptr; } -RGBA32* GraphicsBitmap::scanline(int y) -{ - return reinterpret_cast((((byte*)m_data) + (y * m_pitch))); -} - -const RGBA32* GraphicsBitmap::scanline(int y) const -{ - return reinterpret_cast((((const byte*)m_data) + (y * m_pitch))); -} diff --git a/Widgets/GraphicsBitmap.h b/Widgets/GraphicsBitmap.h index fad84f15d4..050518f3ba 100644 --- a/Widgets/GraphicsBitmap.h +++ b/Widgets/GraphicsBitmap.h @@ -46,3 +46,13 @@ private: Region* m_server_region { nullptr }; #endif }; + +inline RGBA32* GraphicsBitmap::scanline(int y) +{ + return reinterpret_cast((((byte*)m_data) + (y * m_pitch))); +} + +inline const RGBA32* GraphicsBitmap::scanline(int y) const +{ + return reinterpret_cast((((const byte*)m_data) + (y * m_pitch))); +} diff --git a/Widgets/Painter.cpp b/Widgets/Painter.cpp index 088420d68a..41d284b2e1 100644 --- a/Widgets/Painter.cpp +++ b/Widgets/Painter.cpp @@ -226,9 +226,15 @@ void Painter::blit(const Point& position, const GraphicsBitmap& source) Rect dst_rect(position, source.size()); dst_rect.intersect(m_clip_rect); - for (int y = 0; y < dst_rect.height(); ++y) { - auto* dst_scanline = m_target->scanline(position.y() + y); - auto* src_scanline = source.scanline(y); - fast_dword_copy(dst_scanline + dst_rect.x(), src_scanline + (dst_rect.x() - position.x()), dst_rect.width()); + RGBA32* dst = m_target->scanline(position.y()) + dst_rect.x(); + const RGBA32* src= source.scanline(0) + (dst_rect.x() - position.x()); + + const unsigned dst_skip = m_target->width(); + const unsigned src_skip = source.width(); + + for (int i = dst_rect.height() - 1; i >= 0; --i) { + fast_dword_copy(dst, src, dst_rect.width()); + dst += dst_skip; + src += src_skip; } }