ImageDecoder.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. }