summaryrefslogtreecommitdiff
path: root/SharedGraphics
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-05-11 16:53:53 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-05-11 16:55:30 +0200
commit788fb7699b2d5df2619625f5a1092af15fb0e5f6 (patch)
tree060b2d05194beb53484e156c394b643ebdf123e9 /SharedGraphics
parent1652cb7db93e37c8e8a44bd441c769e975d0a526 (diff)
downloadserenity-788fb7699b2d5df2619625f5a1092af15fb0e5f6.zip
Painter: Simplify the draw_scaled_bitmap() fast path for integer scale.
Iterate over the source image instead of the destination image, and blow it up pixel by pixel. This code will only run for upscaling so we don't need to worry about anything else.
Diffstat (limited to 'SharedGraphics')
-rw-r--r--SharedGraphics/Painter.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/SharedGraphics/Painter.cpp b/SharedGraphics/Painter.cpp
index 1bfb8b0621..70d0d53f90 100644
--- a/SharedGraphics/Painter.cpp
+++ b/SharedGraphics/Painter.cpp
@@ -349,21 +349,20 @@ void Painter::blit(const Point& position, const GraphicsBitmap& source, const Re
}
template<bool has_alpha_channel, typename GetPixel>
-ALWAYS_INLINE static void do_draw_integer_scaled_bitmap(GraphicsBitmap& target, const Rect& dst_rect, const Rect& clipped_rect, const GraphicsBitmap& source, int hscale, int vscale, int hfactor, int vfactor, GetPixel get_pixel)
+ALWAYS_INLINE static void do_draw_integer_scaled_bitmap(GraphicsBitmap& target, const Rect& dst_rect, const GraphicsBitmap& source, int hfactor, int vfactor, GetPixel get_pixel)
{
- for (int y = clipped_rect.top(); y <= clipped_rect.bottom(); y += vfactor) {
- for (int x = clipped_rect.left(); x <= clipped_rect.right(); x += hfactor) {
- auto scaled_x = ((x - dst_rect.x()) * hscale) >> 16;
- auto scaled_y = ((y - dst_rect.y()) * vscale) >> 16;
- auto src_pixel = get_pixel(source, scaled_x, scaled_y);
-
+ for (int y = source.rect().top(); y <= source.rect().bottom(); ++y) {
+ int dst_y = dst_rect.y() + y * vfactor;
+ for (int x = source.rect().left(); x <= source.rect().right(); ++x) {
+ auto src_pixel = get_pixel(source, x, y);
for (int yo = 0; yo < vfactor; ++yo) {
- auto* scanline = (Color*)target.scanline(y + yo);
+ auto* scanline = (Color*)target.scanline(dst_y + yo);
+ int dst_x = dst_rect.x() + x * hfactor;
for (int xo = 0; xo < hfactor; ++xo) {
if constexpr (has_alpha_channel)
- scanline[x + xo] = scanline[x].blend(src_pixel);
+ scanline[dst_x + xo] = scanline[dst_x + xo].blend(src_pixel);
else
- scanline[x + xo] = src_pixel;
+ scanline[dst_x + xo] = src_pixel;
}
}
}
@@ -377,12 +376,12 @@ ALWAYS_INLINE static void do_draw_scaled_bitmap(GraphicsBitmap& target, const Re
int hfactor = dst_rect.width() / src_rect.width();
int vfactor = dst_rect.height() / src_rect.height();
if (hfactor == 2 && vfactor == 2)
- return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, clipped_rect, source, hscale, vscale, 2, 2, get_pixel);
+ return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, source, 2, 2, get_pixel);
if (hfactor == 3 && vfactor == 3)
- return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, clipped_rect, source, hscale, vscale, 3, 3, get_pixel);
+ return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, source, 3, 3, get_pixel);
if (hfactor == 4 && vfactor == 4)
- return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, clipped_rect, source, hscale, vscale, 4, 4, get_pixel);
- return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, clipped_rect, source, hscale, vscale, hfactor, vfactor, get_pixel);
+ return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, source, 4, 4, get_pixel);
+ return do_draw_integer_scaled_bitmap<has_alpha_channel>(target, dst_rect, source, hfactor, vfactor, get_pixel);
}
for (int y = clipped_rect.top(); y <= clipped_rect.bottom(); ++y) {