1 /******************************************************************************
3 * Copyright (C) 1997-2015 by Dimitri van Heesch.
5 * Permission to use, copy, modify, and distribute this software and its
6 * documentation under the terms of the GNU General Public License is hereby
7 * granted. No representations are made about the suitability of this software
8 * for any purpose. It is provided "as is" without express or implied warranty.
9 * See the GNU General Public License for more details.
11 * Documents produced by Doxygen are derivative works derived from the
12 * input used in their production; they are not affected by this license.
20 #include "resourcemgr.h"
27 class ResourceMgr::Private
30 std::map<std::string,Resource> resources;
33 ResourceMgr &ResourceMgr::instance()
35 static ResourceMgr theInstance;
39 ResourceMgr::ResourceMgr() : p(std::make_unique<Private>())
43 ResourceMgr::~ResourceMgr()
47 void ResourceMgr::registerResources(std::initializer_list<Resource> resources)
49 for (auto &res : resources)
51 p->resources.insert({res.name,res});
55 bool ResourceMgr::writeCategory(const QCString &categoryName,const QCString &targetDir) const
57 for (auto &[name,res] : p->resources)
59 if (res.category==categoryName)
61 QCString pathName = targetDir+"/"+res.name;
62 std::ofstream f = Portable::openOutputStream(pathName);
66 f.write(reinterpret_cast<const char *>(res.data),res.size);
71 err("Failed to write resource '%s' to directory '%s'\n",res.name,qPrint(targetDir));
79 bool ResourceMgr::copyResourceAs(const QCString &name,const QCString &targetDir,const QCString &targetName,bool append) const
81 QCString pathName = targetDir+"/"+targetName;
82 const Resource *res = get(name);
87 case Resource::Verbatim:
89 std::ofstream f = Portable::openOutputStream(pathName,append);
93 f.write(reinterpret_cast<const char *>(res->data),res->size);
102 case Resource::Luminance:
105 n = n.left(n.length()-4)+".png"; // replace .lum by .png
106 const uint8_t *data = res->data;
107 uint16_t width = (data[0]<<8)+data[1];
108 uint16_t height = (data[2]<<8)+data[3];
109 ColoredImgDataItem images[2];
110 images[0].name = n.data();
111 images[0].width = width;
112 images[0].height = height;
113 images[0].content = &data[4];
115 images[1].name = 0; // terminator
116 writeColoredImgData(targetDir,images);
120 case Resource::LumAlpha:
123 n = n.left(n.length()-5)+".png"; // replace .luma by .png
124 const uint8_t *data = res->data;
125 uint16_t width = (data[0]<<8)+data[1];
126 uint16_t height = (data[2]<<8)+data[3];
127 ColoredImgDataItem images[2];
128 images[0].name = n.data();
129 images[0].width = width;
130 images[0].height = height;
131 images[0].content = &data[4];
132 images[0].alpha = &data[4+width*height];
133 images[1].name = 0; // terminator
134 writeColoredImgData(targetDir,images);
140 std::ofstream t = Portable::openOutputStream(pathName,append);
143 QCString buf(res->size+1);
144 memcpy(buf.rawData(),res->data,res->size);
145 buf = replaceColorMarkers(buf);
146 if (name=="navtree.css")
148 t << substitute(buf,"$width",QCString().setNum(Config_getInt(TREEVIEW_WIDTH))+"px");
152 t << substitute(buf,"$doxygenversion",getDoxygenVersion());
160 std::ofstream t = Portable::openOutputStream(pathName,append);
163 QCString buf(res->size+1);
164 memcpy(buf.rawData(),res->data,res->size);
165 t << replaceColorMarkers(buf);
173 err("requested resource '%s' not compiled in!\n",qPrint(name));
178 bool ResourceMgr::copyResource(const QCString &name,const QCString &targetDir) const
180 return copyResourceAs(name,targetDir,name);
183 const Resource *ResourceMgr::get(const QCString &name) const
185 auto it = p->resources.find(name.str());
186 if (it!=p->resources.end()) return &it->second;
190 QCString ResourceMgr::getAsString(const QCString &name) const
192 const Resource *res = get(name);
195 QCString result(res->size+1);
196 memcpy(result.rawData(),res->data,res->size);