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