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. #include <LibGfx/QOILoader.h>
  17. namespace Gfx {
  18. RefPtr<ImageDecoder> ImageDecoder::try_create(ReadonlyBytes bytes)
  19. {
  20. auto* data = bytes.data();
  21. auto size = bytes.size();
  22. auto plugin = [](auto* data, auto size) -> OwnPtr<ImageDecoderPlugin> {
  23. OwnPtr<ImageDecoderPlugin> plugin;
  24. plugin = make<PNGImageDecoderPlugin>(data, size);
  25. if (plugin->sniff())
  26. return plugin;
  27. plugin = make<GIFImageDecoderPlugin>(data, size);
  28. if (plugin->sniff())
  29. return plugin;
  30. plugin = make<BMPImageDecoderPlugin>(data, size);
  31. if (plugin->sniff())
  32. return plugin;
  33. plugin = make<PBMImageDecoderPlugin>(data, size);
  34. if (plugin->sniff())
  35. return plugin;
  36. plugin = make<PGMImageDecoderPlugin>(data, size);
  37. if (plugin->sniff())
  38. return plugin;
  39. plugin = make<PPMImageDecoderPlugin>(data, size);
  40. if (plugin->sniff())
  41. return plugin;
  42. plugin = make<ICOImageDecoderPlugin>(data, size);
  43. if (plugin->sniff())
  44. return plugin;
  45. plugin = make<JPGImageDecoderPlugin>(data, size);
  46. if (plugin->sniff())
  47. return plugin;
  48. plugin = make<DDSImageDecoderPlugin>(data, size);
  49. if (plugin->sniff())
  50. return plugin;
  51. plugin = make<QOIImageDecoderPlugin>(data, size);
  52. if (plugin->sniff())
  53. return plugin;
  54. return {};
  55. }(data, size);
  56. if (!plugin)
  57. return {};
  58. return adopt_ref_if_nonnull(new (nothrow) ImageDecoder(plugin.release_nonnull()));
  59. }
  60. ImageDecoder::ImageDecoder(NonnullOwnPtr<ImageDecoderPlugin> plugin)
  61. : m_plugin(move(plugin))
  62. {
  63. }
  64. ImageDecoder::~ImageDecoder()
  65. {
  66. }
  67. }