Optimize {,Shm}PutImage
Don't calculate clipping when its not needed. This can still be improved by a ton, but it can wait :)
This commit is contained in:
@@ -60,8 +60,33 @@ void put_image(const PutImageInfo& info)
|
|||||||
}
|
}
|
||||||
case ZPixmap:
|
case ZPixmap:
|
||||||
{
|
{
|
||||||
|
bool needs_clipping = true;
|
||||||
|
|
||||||
|
if (info.gc.clip_mask == None)
|
||||||
|
{
|
||||||
|
needs_clipping = false;
|
||||||
|
}
|
||||||
|
else if (info.gc.clip_mask == UINT32_MAX)
|
||||||
|
{
|
||||||
|
const uint32_t clip_min_x = min_x - info.gc.clip_origin_x;
|
||||||
|
const uint32_t clip_min_y = min_y - info.gc.clip_origin_y;
|
||||||
|
|
||||||
|
const uint32_t clip_max_x = max_x - info.gc.clip_origin_x;
|
||||||
|
const uint32_t clip_max_y = max_y - info.gc.clip_origin_y;
|
||||||
|
|
||||||
|
for (const auto& rect : info.gc.clip_rects)
|
||||||
|
{
|
||||||
|
if (clip_min_x < rect.x || clip_max_x > rect.x + rect.width)
|
||||||
|
continue;
|
||||||
|
if (clip_min_y < rect.y || clip_max_y > rect.y + rect.height)
|
||||||
|
continue;
|
||||||
|
needs_clipping = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(info.left_pad == 0);
|
ASSERT(info.left_pad == 0);
|
||||||
if (in_bpp == 32 && info.gc.clip_mask == None)
|
if (in_bpp == 32 && !needs_clipping)
|
||||||
{
|
{
|
||||||
const auto bytes_per_row = (max_x - min_x) * 4;
|
const auto bytes_per_row = (max_x - min_x) * 4;
|
||||||
for (int32_t y = min_y; y < max_y; y++)
|
for (int32_t y = min_y; y < max_y; y++)
|
||||||
|
|||||||
Reference in New Issue
Block a user