32 PNMFileTypeRegistry() {
33 _requires_sort =
false;
40 ~PNMFileTypeRegistry() {
48 if (pnmimage_cat->is_debug()) {
50 <<
"Registering image type " << type->get_name() <<
"\n";
55 if (handle != PNMFileType::get_class_type()) {
56 Handles::iterator hi = _handles.find(handle);
57 if (hi != _handles.end()) {
58 pnmimage_cat->warning()
59 <<
"Attempt to register PNMFileType " << type->get_name()
60 <<
" (" << type->get_type() <<
") more than once.\n";
63 _handles.insert(Handles::value_type(handle, type));
66 _types.push_back(type);
71 for (
int i = 0; i < num_extensions; i++) {
74 if (!unique_extensions.insert(extension).second) {
75 pnmimage_cat->warning()
76 <<
"PNMFileType " << type->get_name()
77 <<
" (" << type->get_type() <<
") defined extension "
78 << extension <<
" more than once.\n";
83 for (ui = unique_extensions.begin(); ui != unique_extensions.end(); ++ui) {
84 _extensions[*ui].push_back(type);
87 _requires_sort =
true;
95 if (pnmimage_cat->is_debug()) {
97 <<
"Unregistering image type " << type->get_name() <<
"\n";
101 if (handle != PNMFileType::get_class_type()) {
102 Handles::iterator hi = _handles.find(handle);
103 if (hi != _handles.end()) {
108 _types.erase(std::remove(_types.begin(), _types.end(), type),
111 Extensions::iterator ei;
112 for (ei = _extensions.begin(); ei != _extensions.end(); ++ei) {
113 Types &types = ei->second;
114 types.erase(std::remove(types.begin(), types.end(), type),
118 _requires_sort =
true;
126 if (_requires_sort) {
129 return _types.size();
137 nassertr(n >= 0 && n < (
int)_types.size(),
nullptr);
148 if (_requires_sort) {
157 size_t dot = filename.rfind(
'.');
159 if (dot == string::npos) {
160 extension = filename;
162 extension = filename.substr(dot + 1);
166 if (extension ==
"pz" || extension ==
"gz") {
169 size_t prev_dot = filename.rfind(
'.', dot - 1);
170 if (prev_dot == string::npos) {
171 extension = filename.substr(0, dot);
173 extension = filename.substr(prev_dot + 1, dot - prev_dot - 1);
178 if (extension.find(
'/') != string::npos) {
185 Extensions::const_iterator ei;
186 ei = _extensions.find(extension);
187 if (ei == _extensions.end() || (*ei).second.empty()) {
191 ei = _extensions.find(
downcase(extension));
193 if (ei == _extensions.end() || (*ei).second.empty()) {
200 return (*ei).second.front();
211 if (_requires_sort) {
215 Types::const_iterator ti;
216 for (ti = _types.begin(); ti != _types.end(); ++ti) {
234 Handles::const_iterator hi;
235 hi = _handles.find(handle);
236 if (hi != _handles.end()) {
248 write(std::ostream &out,
int indent_level)
const {
249 if (_types.empty()) {
250 indent(out, indent_level) <<
"(No image types are known).\n";
252 Types::const_iterator ti;
253 for (ti = _types.begin(); ti != _types.end(); ++ti) {
255 string name = type->get_name();
256 indent(out, indent_level) << name;
257 indent(out, std::max(30 - (
int)name.length(), 0)) <<
" ";
260 if (num_extensions == 1) {
262 }
else if (num_extensions > 1) {
264 for (
int i = 1; i < num_extensions; i++) {
278 if (_global_ptr ==
nullptr) {
290 void PNMFileTypeRegistry::
294 _requires_sort =
false;