Serenity Operating System
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}