ImageResource.h 1.7 KB

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