ImageDecoder.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGfx/BMPLoader.h>
  7. #include <LibGfx/DDSLoader.h>
  8. #include <LibGfx/GIFLoader.h>
  9. #include <LibGfx/ICOLoader.h>
  10. #include <LibGfx/ImageDecoder.h>
  11. #include <LibGfx/JPGLoader.h>
  12. #include <LibGfx/PBMLoader.h>
  13. #include <LibGfx/PGMLoader.h>
  14. #include <LibGfx/PNGLoader.h>
  15. #include <LibGfx/PPMLoader.h>
  16. namespace Gfx {
  17. RefPtr<ImageDecoder> ImageDecoder::try_create(ReadonlyBytes bytes)
  18. {
  19. auto* data = bytes.data();
  20. auto size = bytes.size();
  21. auto plugin = [](auto* data, auto size) -> OwnPtr<ImageDecoderPlugin> {
  22. OwnPtr<ImageDecoderPlugin> plugin;
  23. plugin = make<PNGImageDecoderPlugin>(data, size);
  24. if (plugin->sniff())
  25. return plugin;
  26. plugin = make<GIFImageDecoderPlugin>(data, size);
  27. if (plugin->sniff())
  28. return plugin;
  29. plugin = make<BMPImageDecoderPlugin>(data, size);
  30. if (plugin->sniff())
  31. return plugin;
  32. plugin = make<PBMImageDecoderPlugin>(data, size);
  33. if (plugin->sniff())
  34. return plugin;
  35. plugin = make<PGMImageDecoderPlugin>(data, size);
  36. if (plugin->sniff())
  37. return plugin;
  38. plugin = make<PPMImageDecoderPlugin>(data, size);
  39. if (plugin->sniff())
  40. return plugin;
  41. plugin = make<ICOImageDecoderPlugin>(data, size);
  42. if (plugin->sniff())
  43. return plugin;
  44. plugin = make<JPGImageDecoderPlugin>(data, size);
  45. if (plugin->sniff())
  46. return plugin;
  47. plugin = make<DDSImageDecoderPlugin>(data, size);
  48. if (plugin->sniff())
  49. return plugin;
  50. return {};
  51. }(data, size);
  52. if (!plugin)
  53. return {};
  54. return adopt_ref_if_nonnull(new (nothrow) ImageDecoder(plugin.release_nonnull()));
  55. }
  56. ImageDecoder::ImageDecoder(NonnullOwnPtr<ImageDecoderPlugin> plugin)
  57. : m_plugin(move(plugin))
  58. {
  59. }
  60. ImageDecoder::~ImageDecoder()
  61. {
  62. }
  63. RefPtr<Gfx::Bitmap> ImageDecoder::bitmap() const
  64. {
  65. return m_plugin->bitmap();
  66. }
  67. }