/* * Copyright (c) 2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace ImageDecoder { class ConnectionFromClient final : public IPC::ConnectionFromClient { C_OBJECT(ConnectionFromClient); public: ~ConnectionFromClient() override = default; virtual void die() override; struct DecodeResult { bool is_animated = false; u32 loop_count = 0; u32 frame_count = 0; Gfx::FloatPoint scale { 1, 1 }; Gfx::BitmapSequence bitmaps; Vector durations; Gfx::ColorSpace color_profile; // Non-null for streaming animated sessions: RefPtr decoder; Core::AnonymousBuffer encoded_data; }; struct AnimationSession : public AtomicRefCounted { Core::AnonymousBuffer encoded_data; RefPtr decoder; u32 frame_count { 0 }; Sync::Mutex decoder_mutex; }; private: struct PendingJob : public AtomicRefCounted { void cancel() { m_canceled.store(true, AK::MemoryOrder::memory_order_relaxed); } bool is_canceled() const { return m_canceled.load(AK::MemoryOrder::memory_order_relaxed); } private: Atomic m_canceled { false }; }; using FrameDecodeResult = Vector; explicit ConnectionFromClient(NonnullOwnPtr); virtual void decode_image(Core::AnonymousBuffer, Optional ideal_size, Optional mime_type, i64 request_id) override; virtual void cancel_decoding(i64 request_id) override; virtual void request_animation_frames(i64 session_id, u32 start_frame_index, u32 count) override; virtual void stop_animation_decode(i64 session_id) override; virtual Messages::ImageDecoderServer::ConnectNewClientsResponse connect_new_clients(size_t count) override; virtual Messages::ImageDecoderServer::InitTransportResponse init_transport(int peer_pid) override; ErrorOr connect_new_client(); NonnullRefPtr start_decode_image_job(i64 request_id, Core::AnonymousBuffer, Optional ideal_size, Optional mime_type); NonnullRefPtr start_frame_decode_job(i64 session_id, NonnullRefPtr, u32 start_frame_index, u32 end_index); i64 m_next_session_id { 1 }; HashMap> m_pending_jobs; HashMap> m_animation_sessions; HashMap> m_pending_frame_jobs; }; }