ImageResource.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. virtual ~ImageResource() override;
  13. struct Frame {
  14. RefPtr<Gfx::Bitmap> bitmap;
  15. size_t duration { 0 };
  16. };
  17. const Gfx::Bitmap* bitmap(size_t frame_index = 0) const;
  18. int frame_duration(size_t frame_index) const;
  19. size_t frame_count() const
  20. {
  21. decode_if_needed();
  22. return m_decoded_frames.size();
  23. }
  24. bool is_animated() const
  25. {
  26. decode_if_needed();
  27. return m_animated;
  28. }
  29. size_t loop_count() const
  30. {
  31. decode_if_needed();
  32. return m_loop_count;
  33. }
  34. void update_volatility();
  35. private:
  36. explicit ImageResource(const LoadRequest&);
  37. void decode_if_needed() const;
  38. mutable bool m_animated { false };
  39. mutable int m_loop_count { 0 };
  40. mutable Vector<Frame> m_decoded_frames;
  41. mutable bool m_has_attempted_decode { false };
  42. };
  43. class ImageResourceClient : public ResourceClient {
  44. public:
  45. virtual ~ImageResourceClient();
  46. virtual bool is_visible_in_viewport() const { return false; }
  47. protected:
  48. ImageResource* resource() { return static_cast<ImageResource*>(ResourceClient::resource()); }
  49. const ImageResource* resource() const { return static_cast<const ImageResource*>(ResourceClient::resource()); }
  50. private:
  51. virtual Resource::Type client_type() const override { return Resource::Type::Image; }
  52. };
  53. }