Implemented synchronous inline image viewing for InsetGraphics.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1561 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Baruch Even 2001-02-20 09:08:56 +00:00
parent 8d7fe83bf5
commit 9a70b28af5
7 changed files with 61 additions and 64 deletions

View File

@ -1,3 +1,13 @@
2001-02-20 Baruch Even <baruch@ev-en.org>
* GraphicsCache.C: Cleared up the confusion on when and how it is
emptied.
* GraphicsCacheItem.C: Indentation change.
* GraphicsCacheItem_pimpl.C: Fixed the loading logic so that it will
figure correctly when the image has been loaded successfully.
2001-02-08 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
* ImageLoader.C: add a "using" directive.

View File

@ -36,14 +36,8 @@ GraphicsCache::getInstance()
GraphicsCache::~GraphicsCache()
{
// Free the map.
//std::foreach(map.begin(), map.end(), ...);
//#warning This is a bogus reason to not clean up after your self. (Lgb)
// TODO: Clean up here (BE)
// This is not really needed, it will only happen on program close and in
// any case the OS will release those resources (not doing it may have
// a good effect on closing time).
// The map elements should have already been eliminated.
Assert(cache.empty());
delete singleton;
}
@ -78,6 +72,7 @@ GraphicsCache::removeFile(string const & filename)
// We do not destroy the GraphicsCacheItem since we are here because
// the last copy of it is being erased.
if (cache.find(filename) != cache.end())
cache.erase(filename);
CacheType::iterator it = cache.find(filename);
if (it != cache.end())
cache.erase(it);
}

View File

@ -82,20 +82,18 @@ GraphicsCacheItem::copy(GraphicsCacheItem const & gci)
void
GraphicsCacheItem::destroy()
{
if (pimpl) {
if (!pimpl)
return;
--(pimpl->refCount);
if (pimpl->refCount == 0) {
{ // We are deleting the pimpl but we want to mark it deleted
// even before it is deleted.
GraphicsCacheItem_pimpl * temp = pimpl;
delete pimpl;
pimpl = 0;
delete temp; temp = 0;
}
GraphicsCache * gc = GraphicsCache::getInstance();
gc->removeFile(filename_);
}
}
}
GraphicsCacheItem::ImageStatus

View File

@ -108,8 +108,8 @@ GraphicsCacheItem_pimpl::renderXPM(string const & filename)
temp = ChangeExtension(filename, string());
// Add some stuff to have it a unique temp file.
// This tempfile is deleted in loadXPMImage after it is loaded to memory.
xpmfile = lyx::tempName(string(), temp);
#warning When is this tempfile unlinked? (Lgb)
xpmfile = ChangeExtension(xpmfile, ".xpm");
command += xpmfile;
@ -136,7 +136,7 @@ GraphicsCacheItem_pimpl::loadXPMImage()
{
lyxerr << "Loading XPM Image... ";
if (imageLoader->loadImage(xpmfile)) {
if (imageLoader->loadImage(xpmfile) == ImageLoader::OK) {
lyxerr << "Success." << endl;
image_ = imageLoader->getImage();
imageStatus_ = GraphicsCacheItem::Loaded;

View File

@ -1,3 +1,9 @@
2001-02-20 Baruch Even <baruch@ev-en.org>
* insetgraphics.h:
* insetgraphisc.C: Changed to use better semantics when loading images
for inline view. Now it doesn't keep the pixmap itself but it's holder.
2001-02-19 Angus Leeming <a.leeming@ic.ac.uk>
* insetcommand.h:

View File

@ -42,12 +42,10 @@ Known BUGS:
* Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then
pressing ok, it counts as if no real selection done. Apparently
when choosing a file it doesn't update the select file input line.
* Inline viewing is still not completely operational, in fact it is now
disabled. To enable it enable the define:
INSETGRAPHICS_INLINE_VIEW
* If we are trying to create a file in a read-only directory and there
are graphics that need converting, the converting will fail because
it is done in-place, into the same directory as the original image.
This needs to be fixed in the src/converter.C file
TODO Before initial production release:
* Replace insetfig everywhere
@ -61,6 +59,7 @@ TODO Before initial production release:
* Extract the general logic of the dialog in order to allow easier porting
to Gnome/KDE, and put the general logic in frontends and the inherited
platform dependent code in the appropriate dirs.
(Something of this kind is getting done by the GUII guys)
TODO Extended features:
@ -129,8 +128,6 @@ TODO Extended features:
#pragma implementation
#endif
#define INSETGRAPHICS_INLINE_VIEW
#include "insets/insetgraphics.h"
#include "insets/insetgraphicsParams.h"
#include "graphics/GraphicsCache.h"
@ -170,7 +167,7 @@ string const RemoveExtension(string const & filename)
// Initialize only those variables that do not have a constructor.
InsetGraphics::InsetGraphics()
: cacheHandle(0), pixmap(0), updateImage(false)
: cacheHandle(0), imageLoaded(false)
{}
InsetGraphics::~InsetGraphics()
@ -184,7 +181,6 @@ InsetGraphics::statusMessage() const
{
char const * msg = 0;
#ifdef INSETGRAPHICS_INLINE_VIEW
if (cacheHandle) {
switch (cacheHandle->getImageStatus()) {
case GraphicsCacheItem::UnknownError:
@ -208,16 +204,14 @@ InsetGraphics::statusMessage() const
break;
}
}
#else
msg = _("Inline view disabled");
#endif
return msg;
}
int InsetGraphics::ascent(BufferView *, LyXFont const &) const
{
if (pixmap)
LyXImage * pixmap = 0;
if (cacheHandle && (pixmap = cacheHandle->getImage()))
return pixmap->getHeight();
else
return 50;
@ -233,7 +227,9 @@ int InsetGraphics::descent(BufferView *, LyXFont const &) const
int InsetGraphics::width(BufferView *, LyXFont const & font) const
{
if (pixmap)
LyXImage * pixmap = 0;
if (cacheHandle && (pixmap = cacheHandle->getImage()))
return pixmap->getWidth();
else {
char const * msg = statusMessage();
@ -261,17 +257,12 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
// This will draw the graphics. If the graphics has not been loaded yet,
// we draw just a rectangle.
if (pixmap) {
if (imageLoaded) {
paint.image(int(old_x) + 2, baseline - lascent,
lwidth - 4, lascent + ldescent,
pixmap);
cacheHandle->getImage());
} else {
#ifdef INSETGRAPHICS_INLINE_VIEW
if (!updateImage) {
updateImage = true;
updateInset();
}
// Get the image status, default to unknown error.
GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
@ -280,14 +271,12 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
// Check if the image is now ready.
if (status == GraphicsCacheItem::Loaded) {
// It is, get it and inform the world.
pixmap = cacheHandle->getImage();
imageLoaded = true;
// Tell BufferView we need to be updated!
bv->text->status = LyXText::CHANGED_IN_DRAW;
return;
}
#endif
char const * msg = statusMessage();
@ -452,6 +441,11 @@ InsetGraphics::prepareFile(Buffer const *buf) const
if (!buf->niceFile) {
string const temp = AddName(buf->tmppath, params.filename);
outfile = RemoveExtension(temp);
//lyxerr << "buf::tmppath = " << buf->tmppath << "\n";
//lyxerr << "filename = " << params.filename << "\n";
//lyxerr << "temp = " << temp << "\n";
//lyxerr << "outfile = " << outfile << endl;
} else {
string const path = OnlyPath(buf->fileName());
string const relname = MakeRelPath(params.filename, path);
@ -581,8 +575,6 @@ void InsetGraphics::Validate(LaTeXFeatures & features) const
// dialog.
void InsetGraphics::updateInset() const
{
#ifdef INSETGRAPHICS_INLINE_VIEW
if (updateImage) {
GraphicsCache * gc = GraphicsCache::getInstance();
GraphicsCacheItem * temp = 0;
@ -590,13 +582,12 @@ void InsetGraphics::updateInset() const
temp = gc->addFile(params.filename);
}
// Mark the image as unloaded so that it gets updated.
imageLoaded = false;
delete cacheHandle;
cacheHandle = temp;
}
#else
cacheHandle = 0;
#endif
}
bool InsetGraphics::setParams(InsetGraphicsParams const & params)
{
@ -627,8 +618,7 @@ Inset * InsetGraphics::Clone(Buffer const &) const
newInset->cacheHandle = cacheHandle->Clone();
else
newInset->cacheHandle = 0;
newInset->pixmap = pixmap;
newInset->updateImage = updateImage;
newInset->imageLoaded = imageLoaded;
newInset->setParams(getParams());

View File

@ -115,10 +115,8 @@ private:
/// The graphics cache handle.
mutable GraphicsCacheItem * cacheHandle;
/// The pixmap
mutable LyXImage * pixmap;
/// is the pixmap initialized?
mutable bool updateImage;
mutable bool imageLoaded;
InsetGraphicsParams params;
};