nsImageModule.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2. *
  3. * This Source Code Form is subject to the terms of the Mozilla Public
  4. * License, v. 2.0. If a copy of the MPL was not distributed with this
  5. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6. #include "nsImageModule.h"
  7. #include "mozilla/ModuleUtils.h"
  8. #include "nsMimeTypes.h"
  9. #include "DecodePool.h"
  10. #include "ImageFactory.h"
  11. #include "ShutdownTracker.h"
  12. #include "SurfaceCache.h"
  13. #include "SurfacePipe.h"
  14. #include "gfxPrefs.h"
  15. #include "imgLoader.h"
  16. #include "imgRequest.h"
  17. #include "imgRequestProxy.h"
  18. #include "imgTools.h"
  19. #include "nsICOEncoder.h"
  20. #include "nsPNGEncoder.h"
  21. #include "nsJPEGEncoder.h"
  22. #include "nsBMPEncoder.h"
  23. // objects that just require generic constructors
  24. using namespace mozilla::image;
  25. // XXX We would like to get rid of the imgLoader factory constructor. See the
  26. // comment documenting the imgLoader constructor.
  27. NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(imgLoader, Init)
  28. NS_GENERIC_FACTORY_CONSTRUCTOR(imgRequestProxy)
  29. NS_GENERIC_FACTORY_CONSTRUCTOR(imgTools)
  30. NS_GENERIC_FACTORY_CONSTRUCTOR(nsICOEncoder)
  31. NS_GENERIC_FACTORY_CONSTRUCTOR(nsJPEGEncoder)
  32. NS_GENERIC_FACTORY_CONSTRUCTOR(nsPNGEncoder)
  33. NS_GENERIC_FACTORY_CONSTRUCTOR(nsBMPEncoder)
  34. NS_DEFINE_NAMED_CID(NS_IMGLOADER_CID);
  35. NS_DEFINE_NAMED_CID(NS_IMGREQUESTPROXY_CID);
  36. NS_DEFINE_NAMED_CID(NS_IMGTOOLS_CID);
  37. NS_DEFINE_NAMED_CID(NS_ICOENCODER_CID);
  38. NS_DEFINE_NAMED_CID(NS_JPEGENCODER_CID);
  39. NS_DEFINE_NAMED_CID(NS_PNGENCODER_CID);
  40. NS_DEFINE_NAMED_CID(NS_BMPENCODER_CID);
  41. static const mozilla::Module::CIDEntry kImageCIDs[] = {
  42. { &kNS_IMGLOADER_CID, false, nullptr, imgLoaderConstructor, },
  43. { &kNS_IMGREQUESTPROXY_CID, false, nullptr, imgRequestProxyConstructor, },
  44. { &kNS_IMGTOOLS_CID, false, nullptr, imgToolsConstructor, },
  45. { &kNS_ICOENCODER_CID, false, nullptr, nsICOEncoderConstructor, },
  46. { &kNS_JPEGENCODER_CID, false, nullptr, nsJPEGEncoderConstructor, },
  47. { &kNS_PNGENCODER_CID, false, nullptr, nsPNGEncoderConstructor, },
  48. { &kNS_BMPENCODER_CID, false, nullptr, nsBMPEncoderConstructor, },
  49. { nullptr }
  50. };
  51. static const mozilla::Module::ContractIDEntry kImageContracts[] = {
  52. { "@mozilla.org/image/cache;1", &kNS_IMGLOADER_CID },
  53. { "@mozilla.org/image/loader;1", &kNS_IMGLOADER_CID },
  54. { "@mozilla.org/image/request;1", &kNS_IMGREQUESTPROXY_CID },
  55. { "@mozilla.org/image/tools;1", &kNS_IMGTOOLS_CID },
  56. { "@mozilla.org/image/encoder;2?type=" IMAGE_ICO_MS, &kNS_ICOENCODER_CID },
  57. { "@mozilla.org/image/encoder;2?type=" IMAGE_JPEG, &kNS_JPEGENCODER_CID },
  58. { "@mozilla.org/image/encoder;2?type=" IMAGE_PNG, &kNS_PNGENCODER_CID },
  59. { "@mozilla.org/image/encoder;2?type=" IMAGE_BMP, &kNS_BMPENCODER_CID },
  60. { nullptr }
  61. };
  62. static const mozilla::Module::CategoryEntry kImageCategories[] = {
  63. { "Gecko-Content-Viewers", IMAGE_GIF, "@mozilla.org/content/document-loader-factory;1" },
  64. { "Gecko-Content-Viewers", IMAGE_JPEG, "@mozilla.org/content/document-loader-factory;1" },
  65. { "Gecko-Content-Viewers", IMAGE_PJPEG, "@mozilla.org/content/document-loader-factory;1" },
  66. { "Gecko-Content-Viewers", IMAGE_JPG, "@mozilla.org/content/document-loader-factory;1" },
  67. { "Gecko-Content-Viewers", IMAGE_ICO, "@mozilla.org/content/document-loader-factory;1" },
  68. { "Gecko-Content-Viewers", IMAGE_ICO_MS, "@mozilla.org/content/document-loader-factory;1" },
  69. { "Gecko-Content-Viewers", IMAGE_BMP, "@mozilla.org/content/document-loader-factory;1" },
  70. { "Gecko-Content-Viewers", IMAGE_BMP_MS, "@mozilla.org/content/document-loader-factory;1" },
  71. { "Gecko-Content-Viewers", IMAGE_ICON_MS, "@mozilla.org/content/document-loader-factory;1" },
  72. { "Gecko-Content-Viewers", IMAGE_PNG, "@mozilla.org/content/document-loader-factory;1" },
  73. { "Gecko-Content-Viewers", IMAGE_APNG, "@mozilla.org/content/document-loader-factory;1" },
  74. { "Gecko-Content-Viewers", IMAGE_X_PNG, "@mozilla.org/content/document-loader-factory;1" },
  75. { "Gecko-Content-Viewers", IMAGE_WEBP, "@mozilla.org/content/document-loader-factory;1" },
  76. { "content-sniffing-services", "@mozilla.org/image/loader;1", "@mozilla.org/image/loader;1" },
  77. { nullptr }
  78. };
  79. static bool sInitialized = false;
  80. nsresult
  81. mozilla::image::EnsureModuleInitialized()
  82. {
  83. MOZ_ASSERT(NS_IsMainThread());
  84. if (sInitialized) {
  85. return NS_OK;
  86. }
  87. // Make sure the preferences are initialized
  88. gfxPrefs::GetSingleton();
  89. mozilla::image::ShutdownTracker::Initialize();
  90. mozilla::image::ImageFactory::Initialize();
  91. mozilla::image::DecodePool::Initialize();
  92. mozilla::image::SurfaceCache::Initialize();
  93. mozilla::image::SurfacePipe::Initialize();
  94. imgLoader::GlobalInit();
  95. sInitialized = true;
  96. return NS_OK;
  97. }
  98. void
  99. mozilla::image::ShutdownModule()
  100. {
  101. if (!sInitialized) {
  102. return;
  103. }
  104. imgLoader::Shutdown();
  105. mozilla::image::SurfaceCache::Shutdown();
  106. sInitialized = false;
  107. }
  108. static const mozilla::Module kImageModule = {
  109. mozilla::Module::kVersion,
  110. kImageCIDs,
  111. kImageContracts,
  112. kImageCategories,
  113. nullptr,
  114. mozilla::image::EnsureModuleInitialized,
  115. // We need to be careful about shutdown ordering to avoid intermittent crashes
  116. // when hashtable enumeration decides to destroy modules in an unfortunate
  117. // order. So our shutdown is invoked explicitly during layout module shutdown.
  118. nullptr
  119. };
  120. NSMODULE_DEFN(nsImageLib2Module) = &kImageModule;