2 * \file GraphicsCache.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Angus Leeming
9 * Full author contact details are available in file CREDITS.
14 #include "GraphicsCache.h"
15 #include "GraphicsCacheItem.h"
16 #include "GraphicsImage.h"
20 #include "frontends/Application.h"
22 #include "support/debug.h"
23 #include "support/FileName.h"
24 #include "support/filetools.h"
29 using namespace lyx::support
;
35 /** The cache contains one item per file, so use a map to find the
36 * cache item quickly by filename.
38 typedef map
<FileName
, Cache::ItemPtr
> CacheType
;
49 // Now return the cache
50 static Cache singleton
;
66 vector
<string
> const & Cache::loadableFormats() const
68 static vector
<string
> fmts
;
73 // The formats recognised by LyX
74 Formats::const_iterator begin
= formats
.begin();
75 Formats::const_iterator end
= formats
.end();
77 // The formats natively loadable.
78 vector
<string
> nformat
= frontend::loadableImageFormats();
80 vector
<string
>::const_iterator it
= nformat
.begin();
81 for (; it
!= nformat
.end(); ++it
) {
82 for (Formats::const_iterator fit
= begin
; fit
!= end
; ++fit
) {
83 if (fit
->extension() == *it
) {
84 fmts
.push_back(fit
->name());
90 if (lyxerr
.debugging()) {
91 LYXERR(Debug::GRAPHICS
, "LyX recognises the following image formats:");
93 vector
<string
>::const_iterator fbegin
= fmts
.begin();
94 vector
<string
>::const_iterator fend
= fmts
.end();
95 for (vector
<string
>::const_iterator fit
= fbegin
; fit
!= fend
; ++fit
) {
97 LYXERR(Debug::GRAPHICS
, ", ");
98 LYXERR(Debug::GRAPHICS
, *fit
);
100 LYXERR(Debug::GRAPHICS
, '\n');
107 void Cache::add(FileName
const & file
) const
109 // Is the file in the cache already?
111 LYXERR(Debug::GRAPHICS
, "Cache::add(" << file
<< "):\n"
112 << "The file is already in the cache.");
116 pimpl_
->cache
[file
] = ItemPtr(new CacheItem(file
));
120 void Cache::remove(FileName
const & file
) const
122 CacheType::iterator it
= pimpl_
->cache
.find(file
);
123 if (it
== pimpl_
->cache
.end())
126 ItemPtr
& item
= it
->second
;
128 if (item
.use_count() == 1) {
129 // The graphics file is in the cache, but nothing else
131 pimpl_
->cache
.erase(it
);
136 bool Cache::inCache(FileName
const & file
) const
138 return pimpl_
->cache
.find(file
) != pimpl_
->cache
.end();
142 Cache::ItemPtr
const Cache::item(FileName
const & file
) const
144 CacheType::const_iterator it
= pimpl_
->cache
.find(file
);
145 if (it
== pimpl_
->cache
.end())
151 } // namespace graphics