#include "rdp_worker/graphics/graphics_adapter.hpp" #include namespace rdp_worker::graphics { GraphicsAdapter::GraphicsAdapter(GraphicsAdapterPolicy policy) : policy_(policy) {} const GraphicsAdapterPolicy& GraphicsAdapter::Policy() const { return policy_; } RenderUpdate GraphicsAdapter::MakeFullBgraFrame(std::uint64_t sequence, int width, int height, int stride, std::vector pixels, bool baseline) const { RenderUpdate update; update.kind = RenderUpdateKind::kFullBgraFrame; update.sequence = sequence; update.desktop_width = width; update.desktop_height = height; update.frame_width = width; update.frame_height = height; update.stride = stride; update.region = Rect{0, 0, width, height}; update.payload = std::move(pixels); update.baseline = baseline; update.droppable = !baseline; return update; } std::optional GraphicsAdapter::TryMakeBgraRegion(std::uint64_t sequence, int desktop_width, int desktop_height, int stride, Rect region, std::vector pixels) const { if (!RegionAllowed(desktop_width, desktop_height, region)) { return std::nullopt; } RenderUpdate update; update.kind = RenderUpdateKind::kBgraRegion; update.sequence = sequence; update.desktop_width = desktop_width; update.desktop_height = desktop_height; update.frame_width = region.width; update.frame_height = region.height; update.stride = stride; update.region = region; update.payload = std::move(pixels); update.baseline = false; update.droppable = true; return update; } bool GraphicsAdapter::RegionAllowed(int desktop_width, int desktop_height, const Rect& region) const { if (desktop_width <= 0 || desktop_height <= 0 || region.x < 0 || region.y < 0 || region.width <= 0 || region.height <= 0 || region.x + region.width > desktop_width || region.y + region.height > desktop_height) { return false; } const long long desktop_area = static_cast(desktop_width) * static_cast(desktop_height); const long long region_area = static_cast(region.width) * static_cast(region.height); return region_area * 100 <= desktop_area * policy_.max_region_area_percent; } } // namespace rdp_worker::graphics