Serenity Operating System
at master 72 lines 1.7 kB view raw
1/* 2 * Copyright (c) 2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <LibWeb/Loader/Resource.h> 10 11namespace Web { 12 13class ImageResource final : public Resource { 14 friend class Resource; 15 16public: 17 static NonnullRefPtr<ImageResource> convert_from_resource(Resource&); 18 19 virtual ~ImageResource() override; 20 21 struct Frame { 22 RefPtr<Gfx::Bitmap> bitmap; 23 size_t duration { 0 }; 24 }; 25 26 Gfx::Bitmap const* bitmap(size_t frame_index = 0) const; 27 int frame_duration(size_t frame_index) const; 28 size_t frame_count() const 29 { 30 decode_if_needed(); 31 return m_decoded_frames.size(); 32 } 33 bool is_animated() const 34 { 35 decode_if_needed(); 36 return m_animated; 37 } 38 size_t loop_count() const 39 { 40 decode_if_needed(); 41 return m_loop_count; 42 } 43 44 void update_volatility(); 45 46private: 47 explicit ImageResource(LoadRequest const&); 48 explicit ImageResource(Resource&); 49 50 void decode_if_needed() const; 51 52 mutable bool m_animated { false }; 53 mutable int m_loop_count { 0 }; 54 mutable Vector<Frame> m_decoded_frames; 55 mutable bool m_has_attempted_decode { false }; 56}; 57 58class ImageResourceClient : public ResourceClient { 59public: 60 virtual ~ImageResourceClient(); 61 62 virtual bool is_visible_in_viewport() const { return false; } 63 64protected: 65 ImageResource* resource() { return static_cast<ImageResource*>(ResourceClient::resource()); } 66 ImageResource const* resource() const { return static_cast<ImageResource const*>(ResourceClient::resource()); } 67 68private: 69 virtual Resource::Type client_type() const override { return Resource::Type::Image; } 70}; 71 72}