]> git.lyx.org Git - features.git/commitdiff
Implemented synchronous inline image viewing for InsetGraphics.
authorBaruch Even <baruch@lyx.org>
Tue, 20 Feb 2001 09:08:56 +0000 (09:08 +0000)
committerBaruch Even <baruch@lyx.org>
Tue, 20 Feb 2001 09:08:56 +0000 (09:08 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1561 a592a061-630c-0410-9148-cb99ea01b6c8

src/graphics/ChangeLog
src/graphics/GraphicsCache.C
src/graphics/GraphicsCacheItem.C
src/graphics/GraphicsCacheItem_pimpl.C
src/insets/ChangeLog
src/insets/insetgraphics.C
src/insets/insetgraphics.h

index 546b3ea8d655020784b6b193f368d546f3e08b21..699d200b08cd41de2cb924d14a936faaf93fc39c 100644 (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.
index af2233cfb8784e4206a9caee5ede1de3e0256251..a2956ddf6e12091584b365cacc58b0c9905754b3 100644 (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);
 }
index bc0ba27fea6b638d58697354e0c184040a97b1e1..be2f9bc1f2107eb4ad80a3b10513b8658d482c48 100644 (file)
@@ -82,18 +82,16 @@ GraphicsCacheItem::copy(GraphicsCacheItem const & gci)
 void
 GraphicsCacheItem::destroy()
 {
-       if (pimpl) {
-               --(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;
-                               pimpl = 0;
-                               delete temp; temp = 0;
-                       }
-                       GraphicsCache * gc = GraphicsCache::getInstance();
-                       gc->removeFile(filename_);
-               }
+       if (!pimpl) 
+               return;
+
+       --(pimpl->refCount);
+       if (pimpl->refCount == 0) {
+               delete pimpl;
+               pimpl = 0;
+
+               GraphicsCache * gc = GraphicsCache::getInstance();
+               gc->removeFile(filename_);
        }
 }
 
index c176a02aa38c131c8cfdb3fbff56f3b8851719f8..ccc7b39caf76fb4036114c6a58a818e88cf5f754 100644 (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;
index d763a57c635ebe1230494bf617a438231158f21d..1eed64e4268d3bc10911da52bf141f99e46450ef 100644 (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:
index 77bfa69b7a8b32f5974c3e97945467ad176e4716..4f89710b3ef60583db815dec28ba08367d4f9cf7 100644 (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,21 +575,18 @@ void InsetGraphics::Validate(LaTeXFeatures & features) const
 // dialog.
 void InsetGraphics::updateInset() const
 {
-#ifdef INSETGRAPHICS_INLINE_VIEW       
-       if (updateImage) {
-               GraphicsCache * gc = GraphicsCache::getInstance();
-               GraphicsCacheItem * temp = 0;
+       GraphicsCache * gc = GraphicsCache::getInstance();
+       GraphicsCacheItem * temp = 0;
 
-               if (!params.filename.empty()) {
-                       temp = gc->addFile(params.filename);
-               }
-
-               delete cacheHandle;
-               cacheHandle = temp;
+       if (!params.filename.empty()) {
+               temp = gc->addFile(params.filename);
        }
-#else
-       cacheHandle = 0;
-#endif
+
+       // Mark the image as unloaded so that it gets updated.
+       imageLoaded = false;
+
+       delete cacheHandle;
+       cacheHandle = temp;
 }
 
 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());
 
index d0c9925b4703a7dcc866f8852444548efaab0c87..a481b83f798171b768a5c6b4bc820e1872ea8bda 100644 (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;
 };