diff --git a/pandatool/src/egg-palettize/imageFile.cxx b/pandatool/src/egg-palettize/imageFile.cxx index 54f86b702f..af583a17b7 100644 --- a/pandatool/src/egg-palettize/imageFile.cxx +++ b/pandatool/src/egg-palettize/imageFile.cxx @@ -193,19 +193,25 @@ void ImageFile:: set_filename(const string &dirname, const string &basename) { _filename = Filename(dirname, basename); - if (_properties._alpha_type != (PNMFileType *)NULL) { - _alpha_filename = - _filename.get_fullpath() + "_a." + - _properties._alpha_type->get_suggested_extension(); - } + // Since we use set_extension() here, if the file already contains a + // filename extension it will be lost. + + // It is particularly important to note that a single embedded dot + // will appear to begin a filename extension, so if the filename + // does *not* contain an extension, but does contain an embedded + // dot, the filename will be truncated at that dot. It is therefore + // important that the supplied basename always contains either an + // extension or a terminating dot. if (_properties._color_type != (PNMFileType *)NULL) { - // We shouldn't use _filename.set_extension(), because that may - // inadvertently truncate the filename if it already includes a - // dot. - _filename = - _filename.get_fullpath() + "." + - _properties._color_type->get_suggested_extension(); + _filename.set_extension + (_properties._color_type->get_suggested_extension()); + } + + if (_properties._alpha_type != (PNMFileType *)NULL) { + _alpha_filename = _filename.get_fullpath_wo_extension() + "_a"; + _alpha_filename.set_extension + (_properties._alpha_type->get_suggested_extension()); } } diff --git a/pandatool/src/egg-palettize/paletteImage.cxx b/pandatool/src/egg-palettize/paletteImage.cxx index 3d1ce05a8f..b38b636801 100644 --- a/pandatool/src/egg-palettize/paletteImage.cxx +++ b/pandatool/src/egg-palettize/paletteImage.cxx @@ -175,8 +175,12 @@ PaletteImage(PalettePage *page, int index) : _got_image = false; ostringstream name; + // We must end the basename with a dot, so that it does not appear + // to have a filename extension. Otherwise, an embedded dot in the + // group's name would make everything following appear to be an + // extension, which would get lost in the set_filename() call. name << page->get_group()->get_name() << "_palette_" - << page->get_name() << "_" << index + 1; + << page->get_name() << "_" << index + 1 << "."; _basename = name.str();