]> git.lyx.org Git - features.git/commitdiff
Cleaned up cruft in InsetGraphics.
authorBaruch Even <baruch@lyx.org>
Thu, 8 Feb 2001 13:06:55 +0000 (13:06 +0000)
committerBaruch Even <baruch@lyx.org>
Thu, 8 Feb 2001 13:06:55 +0000 (13:06 +0000)
Added the auto-conversion of images to InsetGraphics, this adds support
for bitmap images.
Modified the mechanism of image loading for inline viewing - still not
working though.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1457 a592a061-630c-0410-9148-cb99ea01b6c8

15 files changed:
src/frontends/support/ChangeLog
src/frontends/support/LyXImage.C
src/frontends/support/LyXImage.h
src/frontends/support/LyXImage_X.C
src/frontends/support/LyXImage_X.h
src/graphics/ChangeLog
src/graphics/GraphicsCacheItem.C
src/graphics/GraphicsCacheItem.h
src/graphics/GraphicsCacheItem_pimpl.C
src/graphics/GraphicsCacheItem_pimpl.h
src/graphics/Makefile.am
src/insets/ChangeLog
src/insets/insetgraphics.C
src/insets/insetgraphics.h
src/insets/insetgraphicsParams.C

index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a0daf5e425df57bddecf6fa881ff8413a8a94c48 100644 (file)
@@ -0,0 +1,10 @@
+2001-01-21  Baruch Even  <baruch@ev-en.org>
+
+       * LyXImage.h:
+       * LyXImage.C: Removal of the #pragma interface/implementation because of
+       bad interaction with the inclusion of the real implementation, it resulted
+       in errors while linking.
+
+       * LyXImage_X.h:
+       * LyXImage_X.C: Stored the width and height of the image in the image
+       object.
index ba8a5a624ae5c3fc5b603d44be25db2887871dd4..42457faa060b7ef90873da448332701cc4983d85 100644 (file)
@@ -9,10 +9,6 @@
  *          This file Copyright 2000 Baruch Even
  * ================================================= */
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include <config.h>
 #include "LyXImage.h"
 
index 0c82a15e5a399f5b20f7fdf9cdd8ce8bbaf863c2..dd9fcd65c3ab3ee4e775f249bb322d92a0a907cf 100644 (file)
 #ifndef LYXIMAGE_H
 #define LYXIMAGE_H
 
-#ifdef __GNUG__
-#pragma interface
-#endif
-
 // We need it to know what version to use.
 #include <config.h>
 
index 727429b2e1489790e2c36f3738ec6df9c43e00ed..77a70db79c048f535d136c9c8029e6b4626f3cb7 100644 (file)
@@ -9,10 +9,6 @@
  *          This file Copyright 2000 Baruch Even
  * ================================================= */
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include <config.h>
 #include "LyXImage.h"
 
 #include "support/LAssert.h"
 
 LyXImage::LyXImage()
-       : pixmap_(0), pixmapInitialized(false)
+       : pixmap_(0), pixmapInitialized(false), width_(0), height_(0)
 {}
 
-LyXImage::LyXImage(Pixmap pixmap)
-       : pixmap_(pixmap), pixmapInitialized(true)
+LyXImage::LyXImage(Pixmap pixmap, unsigned int width, unsigned int height)
+       : pixmap_(pixmap), pixmapInitialized(true), width_(width), height_(height)
 {}
 
 LyXImage::~LyXImage()
index 575c64ebcf9d7c9ae18096f98e49c7c5abdfb2be..78773a0113f2800aef80aecd80de18a24e34108c 100644 (file)
 #ifndef LYXIMAGE_X_H
 #define LYXIMAGE_X_H
 
-#ifdef __GNUG__
-#pragma interface
-#endif
-
 #include "frontends/support/LyXImage.h"
 #include <X11/Xlib.h>
 
@@ -26,18 +22,28 @@ public:
        ///
        LyXImage();
        ///
-       LyXImage(Pixmap pixmap);
+       LyXImage(Pixmap pixmap, unsigned int width, unsigned int height);
        ///
        ~LyXImage();
 
        ///
        Pixmap getPixmap() const;
-
+       
+       /// Get the image width
+       unsigned int getWidth() const { return width_; }
+       
+       /// Get the image height
+       unsigned int getHeight() const { return height_; }
+       
 private:
        /// The pixmap itself.
        Pixmap pixmap_;
        /// Is the pixmap initialized?
        bool pixmapInitialized;
+       /// Width of the image
+       unsigned int width_;
+       /// Height of the image
+       unsigned int height_;
 };
 
 #endif
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f525104979ef4c550ff05f8f3f8c2daf653da42c 100644 (file)
@@ -0,0 +1,8 @@
+2001-01-21  Baruch Even  <baruch@ev-en.org>
+
+       * GraphicsCacheItem.[Ch]: Changes due to the storage of width and height
+       in the image itself and minor cleanups.
+
+       * GraphicsCacheItem_impl.[Ch]: Changes due to the switch to use a new
+       ImageLoader class instead of the older Renderer class. This means change
+       of responsibilities.
index c113ee620e5b4b199871b5018466101256cc470a..bc0ba27fea6b638d58697354e0c184040a97b1e1 100644 (file)
@@ -43,8 +43,9 @@ GraphicsCacheItem::setFilename(string const & filename)
 
 
 GraphicsCacheItem::GraphicsCacheItem(GraphicsCacheItem const & gci)
+       : pimpl(0)
 {
-       pimpl = 0;
+       // copy will set the actual value of the pimpl.
        copy(gci);
 }
 
@@ -88,7 +89,7 @@ GraphicsCacheItem::destroy()
                                // even before it is deleted.
                                GraphicsCacheItem_pimpl * temp = pimpl;
                                pimpl = 0;
-                               delete temp; 
+                               delete temp; temp = 0;
                        }
                        GraphicsCache * gc = GraphicsCache::getInstance();
                        gc->removeFile(filename_);
@@ -100,13 +101,5 @@ GraphicsCacheItem::destroy()
 GraphicsCacheItem::ImageStatus 
 GraphicsCacheItem::getImageStatus() const { return pimpl->imageStatus_; }
 
-
-int 
-GraphicsCacheItem::getHeight() const { return pimpl->height_; }        
-
-
-int 
-GraphicsCacheItem::getWidth() const { return pimpl->width_; }
-
 LyXImage * 
-GraphicsCacheItem::getImage() const { return pimpl->pixmap_; }
+GraphicsCacheItem::getImage() const { return pimpl->getImage(); }
index 0157d35c97b20698f25bdf50d921466ba266e652..52d710cc08b502b1a964facccde2890ec4012195 100644 (file)
@@ -49,12 +49,6 @@ public:
        /// Assignment operator.
        GraphicsCacheItem & operator=(GraphicsCacheItem const &);
        
-       /// Get the height of the image. Returns -1 on error.
-       int getHeight() const; 
-       
-       /// Get the width of the image. Returns -1 on error.
-       int getWidth() const; 
-
        /// Return a pixmap that can be displayed on X server.
        LyXImage * getImage() const; 
        ///
index 60b675056b5ec7de90963c5225857f78c3913db0..1a3a58b6dde7aa1ce766877a67511e2d071eddaf 100644 (file)
@@ -23,8 +23,7 @@
 #include "GraphicsCacheItem_pimpl.h"
 
 #include "frontends/support/LyXImage.h"
-#include "graphics/XPM_Renderer.h"
-#include "graphics/EPS_Renderer.h"
+#include "ImageLoaderXPM.h"
 #include "support/filetools.h"
 #include "debug.h"
 #include "support/LAssert.h"
@@ -34,24 +33,24 @@ using std::map;
 
 
 GraphicsCacheItem_pimpl::GraphicsCacheItem_pimpl()
-       : height_(-1), width_(-1), imageStatus_(GraphicsCacheItem::Loading),
-         pixmap_(0), renderer(0), refCount(0)
+       : imageStatus_(GraphicsCacheItem::Loading),
+         image_(0), imageLoader(0), refCount(0)
 {}
 
 
 GraphicsCacheItem_pimpl::~GraphicsCacheItem_pimpl()
 {
-       delete pixmap_;
-       delete renderer;
+       delete image_; image_ = 0;
+       delete imageLoader; imageLoader = 0;
 }
 
 
 bool
 GraphicsCacheItem_pimpl::setFilename(string const & filename)
 {
+       imageLoader = new ImageLoaderXPM();
        imageStatus_ = GraphicsCacheItem::Loading;
-
-       renderer = new XPM_Renderer();
+       
        if (renderXPM(filename))
                return true;
        
@@ -66,7 +65,7 @@ static CallbackMap callbackMap;
 
 
 void
-callback(string cmd, int retval)
+static callback(string cmd, int retval)
 {
        lyxerr << "callback, cmd=" << cmd << ", retval=" << retval << endl;
 
@@ -83,6 +82,8 @@ GraphicsCacheItem_pimpl::imageConverted(int retval)
        lyxerr << "imageConverted, retval=" << retval << endl;
 
        if (retval) {
+               lyxerr << "(GraphicsCacheItem_pimpl::imageConverter) "
+                       "Error converting image." << endl;
                imageStatus_ = GraphicsCacheItem::ErrorConverting;
                return;
        }
@@ -133,16 +134,14 @@ GraphicsCacheItem_pimpl::renderXPM(string const & filename)
 void
 GraphicsCacheItem_pimpl::loadXPMImage()
 {
-       if (!renderer->setFilename(xpmfile)) {
-               return;
-       }
-
-       if (renderer->renderImage()) {
-               pixmap_ = renderer->getPixmap();
-               width_ = renderer->getWidth();
-               height_ = renderer->getHeight();
+       lyxerr << "Loading XPM Image... ";
+       
+       if (imageLoader->loadImage(xpmfile)) {
+               lyxerr << "Success." << endl;
+               image_ = imageLoader->getImage();
                imageStatus_ = GraphicsCacheItem::Loaded;
        } else {
+               lyxerr << "Fail." << endl;
                imageStatus_ = GraphicsCacheItem::ErrorReading;
        }
 
index b32fc47dc7af714ac944e9c7114209806a46f4e7..84098bccf58e3a05908dfa6e720254f4be57d505 100644 (file)
@@ -22,7 +22,7 @@
 
 #include XPM_H_LOCATION
 #include "LString.h"
-#include "graphics/Renderer.h"
+#include "graphics/ImageLoader.h"
 #include "support/syscall.h"
 
 #include "sigc++/signal_system.h"
@@ -38,14 +38,8 @@ public:
        /// d-tor, frees the image structures.
        ~GraphicsCacheItem_pimpl();
        
-       /// Get the height of the image. Returns -1 on error.
-       int getHeight() const; 
-       
-       /// Get the width of the image. Returns -1 on error.
-       int getWidth() const;
-
        /// Return a pixmap that can be displayed on X server.
-       LyXImage * getImage() const
+       LyXImage * getImage() const { return image_; };
 
        typedef GraphicsCacheItem::ImageStatus ImageStatus;
        
@@ -74,16 +68,12 @@ private:
 
        /// The file name of the XPM file.
        string xpmfile;
-       /// The image height
-       int height_;
-       /// The image width
-       int width_;
        /// Is the pixmap loaded?
        ImageStatus imageStatus_;
        /// The image pixmap
-       LyXImage * pixmap_;
+       LyXImage * image_;
        /// The rendering object.
-       Renderer * renderer;
+       ImageLoader * imageLoader;
 
        /// The system caller, runs the convertor.
        Systemcalls syscall;
index 1224ae7256429543286eac1a6f090670ed22d3a9..6ac35a3759937d488c19e27bceb85af3580f7608 100644 (file)
@@ -8,15 +8,13 @@ BOOST_INCLUDES = -I$(top_srcdir)/boost
 INCLUDES = -I${srcdir}/../ $(SIGC_CFLAGS) $(BOOST_INCLUDES)
 
 libgraphics_la_SOURCES = \
-       Renderer.h \
-       Renderer.C \
-       XPM_Renderer.h \
-       XPM_Renderer.C \
-       EPS_Renderer.h \
-       EPS_Renderer.C \
        GraphicsCache.h \
        GraphicsCache.C \
        GraphicsCacheItem.h \
        GraphicsCacheItem.C \
        GraphicsCacheItem_pimpl.h \
        GraphicsCacheItem_pimpl.C \
+       ImageLoaderXPM.h \
+       ImageLoaderXPM.C \
+       ImageLoader.h \
+       ImageLoader.C 
index dd163d6d39b6c5f4991449d0d33870cb16653301..997cefc1868ab650830f22ece79f562632cc6aac 100644 (file)
@@ -1,3 +1,19 @@
+2001-02-05  Baruch Even  <baruch.even@writeme.com>
+
+       * insetgraphics.C: Updated automatic image conversion, it now goes into
+       temporary directory instead of with the image itself.
+
+2001-01-21  Baruch Even  <baruch@ev-en.org>
+
+       * insetgraphics.C: Added Docbook support. Added Automatic image conversion
+       to EPS or PNG when needed (support bitmap graphics).
+
+2000-11-02  Baruch Even  <baruch@ev-en.org>
+
+       * insetgraphics.C:
+       * insetgraphiscParams.C: Some cleaning up, changing from std::endl to '\n'
+       and removal of commented out code.
+
 2001-01-31  Dekel Tsur  <dekelts@tau.ac.il>
 
        * insetbib.C (callback): Update citations if the key has changed.
index fe979c1779995c44950d2a0e5fce06352bc314ae..a5e6b8adea3fd6f310773229a38147dbf2ac10d6 100644 (file)
@@ -17,9 +17,11 @@ How to use it for now:
 Immediate tasks:
        * Make the inline viewing work, there is a preliminary work going on,
                need to finish it up.
+       * Support automatic image format conversion, create both a PNG and EPS output.
 
        * Polishing tasks:
-               * Add messages in the empty rectangle to say how are we doing.
+               * Add messages in the empty rectangle (in the buffer view) to say how are 
+                 we doing.
                        - Implemented, needs testing.
                * Clean up GraphicsCacheItem(_pimpl)
        * Pop up a dialog if the widget version is higher than what we accept.
@@ -40,26 +42,12 @@ 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 no 
+       * Inline viewing is still not completely operational, in fact it is now
                disabled. To enable it enable the define:
                INSETGRAPHICS_INLINE_VIEW
-Current PROBLEMS:
-    
-    * How to support both PDF and PS output, should we do the conversion
-        or should we just give the bounding box and tell latex how to do the
-        conversion itself?
-        I (Baruch Even) tend towards doing the conversion ourselves, otherwise
-        we need to give latex quite a few translation commands and from the
-        graphicx package docs it appears that it takes quite a bit of memory
-        on the side of TeXing.
-       
-TODO Basics:
-    * Add support for more features so that it will be better than insetfig.
-        * Keep aspect ratio radio button
-    * Work on inline viewing of image.
+       * 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.
  
 TODO Before initial production release:
     * Replace insetfig everywhere
@@ -77,13 +65,14 @@ TODO Before initial production release:
 TODO Extended features:
  
     * Advanced Latex tab folder.
-    * Add even more options to make it better than insetfig.
+    * Add support for more features so that it will be better than insetfig.
+        * Keep aspect ratio radio button
         * Support for complete control over the latex parameters for TeXperts
         * What advanced features the users want to do?
             Implement them in a non latex dependent way, but a logical way.
             LyX should translate it to latex or any other fitting format.
     * Add a way to roll the image file into the file format.
-    * When loading if the image is not found in the expected place, try
+    * When loading, if the image is not found in the expected place, try
        to find it in the clipart, or in the same directory with the image.
     * Keep a tab on the image file, if it changes, update the lyx view.
        * The image choosing dialog could show thumbnails of the image formats
@@ -134,36 +123,14 @@ TODO Extended features:
  *  documents (i.e. prefer imagemagick eps2png over eps2pdf)
  */
 
-/* Current Stage:
- *  Embryonic.
- *
- * PLAN:
- *  Finish basic support:
- *      Inline image viewing
- *
- *  Do Release quality support:
- *      Allow to change display depth
- *      Make default figure instead of InsetFig
- *      Add to LyX (probably after 1.1.6 is released)
- *      
- *  Extended features:
- *      Output format conversion
- *      Print depth changes
- *      Image file tracking of changes.
- *
- *  Extended^2:
- *      Image roll-in (how? when? why?)
- *          This means to add the image inside the LyX file, usefull when
- *          transferring the file around.
- */
-
-
 #include <config.h> 
 
 #ifdef __GNUG__
 #pragma implementation
 #endif 
 
+#define INSETGRAPHICS_INLINE_VIEW
+
 #include "insets/insetgraphics.h"
 #include "insets/insetgraphicsParams.h"
 #include "graphics/GraphicsCache.h"
@@ -177,29 +144,33 @@ TODO Extended features:
 #include "frontends/support/LyXImage.h"
 #include "Painter.h"
 #include "lyx_gui_misc.h"
-#include "filedlg.h"
 #include "support/FileInfo.h"
 #include "support/filetools.h"
+#include "support/lyxlib.h"
 #include "lyxtext.h"
+#include "lyxrc.h"
 #include "font.h" // For the lyxfont class.
 #include <algorithm> // For the std::max
-#include "lyxrc.h"
-
+#include "support/lyxmanip.h"
 #include "debug.h"
 
+extern string system_tempdir;
 
 using std::ostream;
 using std::endl;
 using std::max;
 
+// This function is a utility function
+inline
+string const RemoveExtension(string const & filename)
+{
+       return ChangeExtension(filename, string());
+}
+
+
 // Initialize only those variables that do not have a constructor.
 InsetGraphics::InsetGraphics()
-#ifdef IG_OLDPARAMS
-       : use_bb(false), hiresbb(false), angle(0.0), origin(DEFAULT)
-       , keepaspectratio(false), scale(0.0), clip(false), draft(false)
-       , cacheHandle(0)
-#endif 
-       : cacheHandle(0), pixmap(0), pixmapInitialized(false)
+       : cacheHandle(0), pixmap(0), updateImage(false)
 {}
 
 InsetGraphics::~InsetGraphics()
@@ -213,27 +184,29 @@ InsetGraphics::statusMessage() const
 {
        char const * msg = 0;
 
-#ifdef INSETGRAPHICS_INLINE_VIEW               
-       switch (status) {
-       case GraphicsCacheItem::UnknownError:
-               msg = _("Unknown Error");
-               break;
+#ifdef INSETGRAPHICS_INLINE_VIEW
+       if (cacheHandle) {
+               switch (cacheHandle->getImageStatus()) {
+               case GraphicsCacheItem::UnknownError:
+                       msg = _("Unknown Error");
+                       break;
 
-       case GraphicsCacheItem::Loading:
-               msg = _("Loading...");
-               break;
+               case GraphicsCacheItem::Loading:
+                       msg = _("Loading...");
+                       break;
 
-       case GraphicsCacheItem::ErrorReading:
-               msg = _("Error reading");
-               break;
+               case GraphicsCacheItem::ErrorReading:
+                       msg = _("Error reading");
+                       break;
 
-       case GraphicsCacheItem::ErrorConverting:
-               msg = _("Error converting");
-               break;
+               case GraphicsCacheItem::ErrorConverting:
+                       msg = _("Error converting");
+                       break;
 
-       case GraphicsCacheItem::Loaded:
-               // No message to write.
-               break;
+               case GraphicsCacheItem::Loaded:
+                       // No message to write.
+                       break;
+               }
        }
 #else
        msg = _("Inline view disabled");
@@ -244,8 +217,8 @@ InsetGraphics::statusMessage() const
 
 int InsetGraphics::ascent(BufferView *, LyXFont const &) const
 {
-       if (pixmapInitialized)
-               return cacheHandle->getHeight();
+       if (pixmap)
+               return pixmap->getHeight();
        else
                return 50;
 }
@@ -260,35 +233,46 @@ int InsetGraphics::descent(BufferView *, LyXFont const &) const
 
 int InsetGraphics::width(BufferView *, LyXFont const & font) const
 {
-       if (pixmapInitialized)
-               return cacheHandle->getWidth();
+       if (pixmap)
+               return pixmap->getWidth();
        else {
                char const * msg = statusMessage();
-               int font_width = lyxfont::width(msg, font);
+               int font_width = 0;
+               
+               if (msg)
+                       font_width = lyxfont::width(msg, font);
                
                return max(50, font_width + 15);
        }
 }
 
-
 void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
                          int baseline, float & x, bool) const
 {
        Painter & paint = bv->painter();
 
-       int lwidth = width(bv, font);
        int ldescent = descent(bv, font);
        int lascent = ascent(bv, font);
+       int lwidth = width(bv, font);
+
+       // Make sure x is updated upon exit from this routine
+       float old_x = x;
+       x += lwidth;
 
        // This will draw the graphics. If the graphics has not been loaded yet,
        // we draw just a rectangle.
-       if (pixmapInitialized) {
+       if (pixmap) {
 
-               paint.image(int(x) + 2, baseline - lascent,
+               paint.image(int(old_x) + 2, baseline - lascent,
                             lwidth - 4, lascent + ldescent,
                             pixmap);
        } else {
-#ifdef INSETGRAPHICS_INLINE_VIEW               
+#ifdef INSETGRAPHICS_INLINE_VIEW
+               if (!updateImage) {
+                       updateImage = true;
+                       updateInset();
+               }
+               
                // Get the image status, default to unknown error.
                GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
                if (cacheHandle)
@@ -298,7 +282,6 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
                if (status == GraphicsCacheItem::Loaded) {
                        // It is, get it and inform the world.
                        pixmap = cacheHandle->getImage();
-                       pixmapInitialized = true;
 
                        // Tell BufferView we need to be updated!
                        bv->text->status = LyXText::CHANGED_IN_DRAW;
@@ -308,7 +291,7 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
 
                char const * msg = statusMessage();
                
-               paint.rectangle(int(x) + 2, baseline - lascent,
+               paint.rectangle(int(old_x) + 2, baseline - lascent,
                                lwidth - 4,
                                lascent + ldescent);
 
@@ -318,22 +301,21 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
                        msgFont.setFamily(LyXFont::SANS_FAMILY);
                        msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
                        string const justname = OnlyFilename (params.filename);
-                       paint.text(int(x + 8), baseline - lyxfont::maxAscent(msgFont) - 4,
-                                 justname, msgFont);
+                       paint.text(int(old_x) + 8, 
+                                       baseline - lyxfont::maxAscent(msgFont) - 4,
+                                   justname, msgFont);
 
                        msgFont.setSize(LyXFont::SIZE_TINY);
-                       paint.text(int(x + 8), baseline - 4, msg, strlen(msg), msgFont);
+                       paint.text(int(old_x) + 8, baseline - 4, 
+                                       msg, strlen(msg), msgFont);
                }
        }
-
-       // Add the image width to the row width.
-       x += lwidth;
 }
 
 
 void InsetGraphics::Edit(BufferView *bv, int, int, unsigned int)
 {
-       bv->owner()->getDialogs() -> showGraphics(this);
+       bv->owner()->getDialogs()->showGraphics(this);
 }
 
 
@@ -350,60 +332,6 @@ void InsetGraphics::Write(Buffer const * buf, ostream & os) const
        params.Write(buf, os);
 }
 
-#if 0
-// Baruch Even 2000-07-08
-
-// A Thought for another way to read the file...
-// The map should be a static part of the object or a static part of this
-// file and should be filled during program start.
-// The questions are:
-// 1. Is this cleaner?
-// 2. Is there no hidden performance costs?
-//
-// Regarding 2 I can already see that we will have two copies of the strings
-// one in the data part of the program and one in the map, but that won't be
-// more than say 2K (overestimation here), there is no real benefit to put
-// it in the map since there aren't that many configuration items that will
-// make it a faster solution, it might just be a bit cleaner.
-// (a map stores either in a hash or a kind of a balanced tree).
-
-void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
-{
-       typedef map < string, enum TOKENS > ReadActionMap;
-       static ReadActionMap const readMap;
-
-       bool finished = false;
-
-       while (lex.IsOK() && !finished) {
-               lex.next();
-
-               string const token = lex.GetString();
-               lyxerr.debug() << "Token: '" << token << '\'' << endl;
-
-               if (token.empty())
-                       continue;
-
-               ReadActionMap::const_iterator it =
-                   readMap.find(token);
-
-               if (it == readMap.end()) {
-                       lyxerr << "Unknown keyword, skipping." << endl;
-                       continue;
-               }
-
-               switch (it.second) {
-               case FILENAME_TOKEN:
-                       break;
-               case VERSION_TOKEN:
-                       break;
-               default:
-                       break;
-               }
-
-
-       }
-}
-#endif 
 
 void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
 {
@@ -432,7 +360,7 @@ void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
                }
                else {
                        if (! params.Read(buf, lex, token))
-                               lyxerr << "Unknown token, " << token << ",skipping." << endl;
+                               lyxerr << "Unknown token, " << token << ", skipping." << endl;
                }
        }
 
@@ -466,11 +394,80 @@ void formatResize(ostream & os, string const & key,
        }
 }
 
+string const
+InsetGraphics::createLatexOptions() const
+{
+       // Calculate the options part of the command, we must do it to a string
+       // stream since we might have a trailing comma that we would like to remove
+       // before writing it to the output stream.
+       std::ostringstream options;
+
+       formatResize(options, "width", params.widthResize, params.widthSize);
+       formatResize(options, "height", params.heightResize, params.heightSize);
+
+       if (params.rotateAngle != 0) {
+               options << "angle="
+                       << params.rotateAngle << ',';
+       }
+
+       string opts = options.str().c_str();
+       opts = strip(opts, ',');
+
+       return opts;
+}
+
+
+
+string const 
+InsetGraphics::prepareFile(Buffer const *buf) const
+{
+
+       // do_convert = Do we need to convert the file?
+       // nice = Do we create a nice version?
+       //        This is used when exporting the latex file only.
+       // 
+       // 
+       // if (!do_convert)
+       //   return original filename
+       // 
+       // if (!nice)
+       //   convert_place = temp directory
+       //   return new filename in temp directory
+       // else
+       //   convert_place = original file directory
+       //   return original filename without the extension
+       //
+       
+       // Get the extension (format) of the original file.
+       string const extension = GetExtension(params.filename);
+       
+       // Are we creating a PDF or a PS file?
+       // (Should actually mean, are we usind latex or pdflatex).
+       string const image_target = (lyxrc.pdf_mode ? "png" : "eps");
+
+       if (extension == image_target)
+               return params.filename;
+
+       string outfile;
+       if (!buf->niceFile) {
+               string const temp = AddName(buf->tmppath, params.filename);
+               outfile = RemoveExtension(temp);
+       } else {
+               string const path = OnlyPath(buf->fileName());
+               string const relname = MakeRelPath(params.filename, path);
+               outfile = RemoveExtension(relname);
+       }
+
+       converters.Convert(buf, params.filename, outfile, extension, image_target);
+       
+       return outfile;
+}
+
 int InsetGraphics::Latex(Buffer const *buf, ostream & os,
-                         bool /*fragile*/, bool/*fs*/) const
+               bool /*fragile*/, bool/*fs*/) const
 {
        // MISSING: We have to decide how to do the order of the options
-       // that is dependent of order, like witdth, height, angle. Should
+       // that is dependent of order, like width, height, angle. Should
        // we rotate before scale? Should we let the user decide?
        // bool rot_before_scale; ?
 
@@ -484,195 +481,63 @@ int InsetGraphics::Latex(Buffer const *buf, ostream & os,
        // If there is no file specified, just output a message about it in
        // the latex output.
        if (params.filename.empty()) {
-               os << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
-               << _("empty figure path")
-               << '}'
-               << endl;
+               os  << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
+                       << _("empty figure path")
+                       << "}\n";
 
-               return 1;
+               return 1; // One end of line marker added to the stream.
        }
 
-       // Calculate the options part of the command, we must do it to a string
-       // stream since we might have a trailing comma that we would like to remove
-       // before writing it to the output stream.
-       std::ostringstream options;
-
-       formatResize(options, "width", params.widthResize, params.widthSize);
-       formatResize(options, "height", params.heightResize, params.heightSize);
-
-       if (params.rotateAngle != 0) {
-               options << "angle="
-               << params.rotateAngle << ',';
-       }
-
-#ifdef IG_OLDPARAMS
-       if (bb.isSet() && use_bb) {
-               options << "bb="
-               << bb.llx << ' ' << bb.lly << ' '
-               << bb.urx << ' ' << bb.ury << ',';
-       }
-       if (hiresbb) {
-               options << "hiresbb,";
-       }
-       if (viewport.isSet()) {
-               options << "viewport="
-               << viewport.llx << ' ' << viewport.lly << ' '
-               << viewport.urx << ' ' << viewport.ury << ',';
-       }
-       if (trim.isSet()) {
-               options << "trim="
-               << trim.llx << ' ' << trim.lly << ' '
-               << trim.urx << ' ' << trim.ury << ',';
-       }
-       if (natheight.value() != 0) {
-               options << "natheight=" << natheight.asString() << ',';
-       }
-       if (natwidth.value() != 0) {
-               options << "natwidth=" << natwidth.asString() << ',';
-       }
-       if (angle != 0.0) {
-               options << "angle=" << angle << ',';
-       }
-       if (origin != DEFAULT) {
-               switch (origin) {
-               case DEFAULT: break;
-               case LEFTTOP:
-                       options << "origin=lt,";
-                       break;
-               case LEFTCENTER:
-                       options << "origin=lc,";
-                       break;
-               case LEFTBASELINE:
-                       options << "origin=lB,";
-                       break;
-               case LEFTBOTTOM:
-                       options << "origin=lb,";
-                       break;
-               case CENTERTOP:
-                       options << "origin=ct,";
-                       break;
-               case CENTER:
-                       options << "origin=c,";
-                       break;
-               case CENTERBASELINE:
-                       options << "origin=cB,";
-                       break;
-               case CENTERBOTTOM:
-                       options << "origin=cb,";
-                       break;
-               case RIGHTTOP:
-                       options << "origin=rt,";
-                       break;
-               case RIGHTCENTER:
-                       options << "origin=rc,";
-                       break;
-               case RIGHTBASELINE:
-                       options << "origin=rB,";
-                       break;
-               case RIGHTBOTTOM:
-                       options << "origin=rb,";
-                       break;
-               }
-       }
-       if (g_width.value() != 0) {
-               options << "width=" << g_width.asString() << ',';
-       }
-       if (g_height.value() != 0) {
-               options << "height=" << g_height.asString() << ',';
-       }
-       if (totalheight.value() != 0) {
-               options << "totalheight=" << totalheight.asString() << ',';
-       }
-       if (keepaspectratio) {
-               options << "keepaspectratio,";
-       }
-       if (scale != 0.0) {
-               options << "scale=" << scale << ',';
-       }
-       if (clip) {
-               options << "clip,";
-       }
-       if (draft) {
-               options << "draft,";
-       }
-       if (!type.empty()) {
-               options << "type=" << type << ',';
-
-               // These should be present only when type is used.
-               if (!ext.empty()) {
-                       options << "ext=" << type << ',';
-               }
-               if (!read.empty()) {
-                       options << "read=" << type << ',';
-               }
-               if (!command.empty()) {
-                       options << "command=" << type << ',';
-               }
-       }
-#endif 
-
-       string opts(options.str().c_str());
-       opts = strip(opts, ',');
+       // Keep count of newlines that we issued.
+       int newlines = 0;
 
+       // This variables collect all the latex code that should be before and
+       // after the actual includegraphics command.
+       string before;
+       string after;
 
        // If it's not an inline image, surround it with the centering paragraph.
        if (! params.inlineFigure) {
-               os << endl
-               << "\\vspace{0.3cm}" << endl
-               << "{\\par\\centering ";
+               before += "\n" "\\vspace{0.3cm}\n" "{\\par\\centering ";
+               after = " \\par}\n" "\\vspace{0.3cm}\n" + after;
+               newlines += 4;
        }
 
        // Do we want subcaptions?
        if (params.subcaption) {
-               os << "\\subfigure[" << params.subcaptionText << "]{";
+               before += "\\subfigure[" + params.subcaptionText + "]{";
+               after = '}' + after;
        }
 
-       // We never used the starred form, we use the "clip" option instead.
-       os << "\\includegraphics";
+       // We never use the starred form, we use the "clip" option instead.
+       os << before << "\\includegraphics";
 
+       // Write the options if there are any.
+       string const opts = createLatexOptions();
        if (!opts.empty()) {
                os << '[' << opts << ']';
        }
 
        // Make the filename relative to the lyx file
-       string filename = MakeRelPath(params.filename, OnlyPath(buf->fileName()));
-
        // and remove the extension so the LaTeX will use whatever is
        // appropriate (when there are several versions in different formats)
-       filename = ChangeExtension(filename, string());
-
-       os << '{' << filename << '}';
-
-       // Do we want a subcaption?
-       if (params.subcaption) {
-               // Close the subcaption command
-               os << '}';
-       }
-
-       // Is this an inline graphics?
-       if (!params.inlineFigure) {
-               os << " \\par}" << endl
-               << "\\vspace{0.3cm}" << endl;
-       }
+       string const filename = prepareFile(buf);
+       
+       os << '{' << filename << '}' << after;
 
-       // How do we decide to what format should we export?
-       string extension = GetExtension(params.filename);
-       if (lyxrc.pdf_mode) {
-               if (extension != "jpg")
-                       converters.Convert(buf,
-                                          params.filename, params.filename,
-                                          extension, "png");
-       } else
-               converters.Convert(buf, params.filename, params.filename,
-                                  extension, "eps");
-
-       return 1;
+       // Return how many newlines we issued.
+       return newlines;
 }
 
 
 int InsetGraphics::Ascii(Buffer const *, ostream &, int) const
 {
-       // No graphics in ascii output.
+       // No graphics in ascii output. Possible to use gifscii to convert
+       // images to ascii approximation.
+       
+       // 1. Convert file to ascii using gifscii
+       // 2. Read ascii output file and add it to the output stream.
+       
        return 0;
 }
 
@@ -683,10 +548,19 @@ int InsetGraphics::Linuxdoc(Buffer const *, ostream &) const
        return 0;
 }
 
-
-int InsetGraphics::DocBook(Buffer const *, ostream &) const
+// For explanation on inserting graphics into DocBook checkout:
+// http://linuxdoc.org/LDP/LDP-Author-Guide/inserting-pictures.html
+// See also the docbook guide at http://www.docbook.org/
+int InsetGraphics::DocBook(Buffer const * buf, ostream & os) const
 {
-       // No graphics in DocBook output. Should check how/what to add.
+       // Change the path to be relative to the main file.
+       string const buffer_dir = OnlyPath(buf->fileName());
+       string const filename = RemoveExtension(MakeRelPath(params.filename, buffer_dir));
+
+       // In DocBook v5.0, the graphic tag will be eliminated from DocBook, will 
+       // need to switch to MediaObject. However, for now this is sufficient and 
+       // easier to use.
+       os << "<graphic fileref=\"" << filename << "\"></graphic>";
        return 0;
 }
 
@@ -707,18 +581,18 @@ void InsetGraphics::Validate(LaTeXFeatures & features) const
 // dialog.
 void InsetGraphics::updateInset() const
 {
-       // If file changed...
-
 #ifdef INSETGRAPHICS_INLINE_VIEW       
-       GraphicsCache * gc = GraphicsCache::getInstance();
-       GraphicsCacheItem * temp = 0;
+       if (updateImage) {
+               GraphicsCache * gc = GraphicsCache::getInstance();
+               GraphicsCacheItem * temp = 0;
 
-       if (!params.filename.empty()) {
-               temp = gc->addFile(params.filename);
-       }
+               if (!params.filename.empty()) {
+                       temp = gc->addFile(params.filename);
+               }
 
-       delete cacheHandle;
-       cacheHandle = temp;
+               delete cacheHandle;
+               cacheHandle = temp;
+       }
 #else
        cacheHandle = 0;
 #endif
@@ -754,7 +628,7 @@ Inset * InsetGraphics::Clone(Buffer const &) const
        else
                newInset->cacheHandle = 0;
        newInset->pixmap = pixmap;
-       newInset->pixmapInitialized = pixmapInitialized;
+       newInset->updateImage = updateImage;
 
        newInset->setParams(getParams());
 
index 8e17277614f475544dbd345955ec29f8767d1a18..52d0da7a3a827e58181e48e03d4dbe2a531931d3 100644 (file)
@@ -106,6 +106,10 @@ private:
        void updateInset() const;
        /// Get the status message, depends on the image loading status.
        char const * statusMessage() const;
+       /// Create the options for the latex command.
+       string const createLatexOptions() const;
+       /// Convert the file if needed, and return the location of the file.
+       string const prepareFile(Buffer const * buf) const;
 
        /// The graphics cache handle.
        mutable GraphicsCacheItem * cacheHandle;
@@ -113,105 +117,9 @@ private:
        /// The pixmap
        mutable LyXImage * pixmap;
        /// is the pixmap initialized?
-       mutable bool pixmapInitialized;
+       mutable bool updateImage;
 
        InsetGraphicsParams params;
-
-       // Baruch Even (baruch.even@writeme.com) 2000-07-17
-       // This was the intended way however it is not flexible enough and
-       // only provides for LaTeX output.
-#ifdef IG_OLDPARAMS
-       // We need variables to store the size of the boundingbox and
-       // to store a pointer to the pixmap in.. The question is if
-       // these should be in a "pixmap" class.
-       // We also need to have variables about rotation and scaling,
-       // width and height. in effect all the paramters that
-       // \includegraphics can handle. (the graphix.sty package)
-
-       /** The "bounding box" of the graphics image. Its value field
-           must contain four dimensions, separated by spaces.  */
-       BoundingBox bb;
-       /** The bounding box above is used for display and file both.
-           But we need this variable below to know if we shall use the
-           bounding box in the LaTex command or not. (i.e. if the user
-           has manually set the bb.) */
-       bool use_bb;
-
-       /** When a graphics file is parsed we first check for BoundingBox
-           and then for HiResBoundingBox, and set hiresbb depending on this.
-           This key makes LaTeX search for %%HiResBoundingBox comments
-           instead of the normal %%BoundingBox. Some applications use
-           this to specify more precise bounding boxes, becase the numbers
-           can normally only have integer values. It is a Boolean, either
-           "true" or "false". */
-       bool hiresbb;
-
-       /** This key takes four arguments (like bb), but in this case the
-           origin is taken with respect to the bounding box specified in
-           the file. So to view a 20 bp square at the lower left-hand corner
-           of the picture, specify viewport=0 0 20 20. */
-       BoundingBox viewport;
-
-       /** Similar to the viewport key, but the four dimensions correspond
-           to the amount of space to be trimmed (cut off) at the left-hand
-           side, bottom, right-hand side and top of the included graphics. */
-       BoundingBox trim;
-
-       /// Natural height of figure
-       LyXLength natheight;
-
-       /// Natural width of figure.
-       LyXLength natwidth;
-
-       /// Rotation angle (in degrees, counterclockwise).
-       float angle;
-
-       /** Origin for rotation, similar to the origin parameter of
-           the \rotatebox command described on p.46 and Fig. 2.2 on p.46. */
-       Origin origin;
-
-       /// Required width (the width of the image is scaled to that value).
-       LyXLength g_width;
-
-       /// Required height (the height of the image is scaled to that value).
-       LyXLength g_height;
-
-       /** Required total height (the total height of the image is scaled
-           to that value). This key should be used instead of height if
-           images are rotated over 90 degrees, since the height can
-           disappear (and become the depth) and LaTeX will have difficulties
-           satisfying the user's request. */
-       LyXLength totalheight;
-
-       /** Boolean variable that can have the values "true" and "false"
-           (se above for defaults). When true, specifying both width and
-           height parameters does not distort the picture, but the image
-           is scaled so that neither of the width of height exceeds the
-           given dimensions. */
-       bool keepaspectratio;
-
-       /// Scale factor
-       float scale;
-
-       /** Clip the graphic to the bounding box. It is a Boolean, either
-           "true" or "false". */
-       bool clip;
-
-       /// Locally switch to draft mode. A Boolean valued key, like clip.
-       bool draft;
-
-       /// The graphics type.
-       string type;
-
-       /// The file extension of the file containing the image data.
-       string ext;
-
-       /// The file extension of the file "read" by LaTeX.
-       string read;
-
-       /// Any command to be applied to the file.
-       string command;
-#endif 
 };
 
 #endif 
index c9a14418fd57678548f3b453d286aeacd2adc5bd..ef72e27307d5acf5f51b783aa6f298db5eb02b21 100644 (file)
@@ -22,8 +22,6 @@
 
 #include "support/LAssert.h"
 
-using std::endl;
-
 /// This variable keeps a tab on whether the translator was set with the
 /// translations.
 static bool translatorsSet = false;
@@ -205,87 +203,14 @@ void writeResize(ostream & os, string const & key,
        os << ' ' << key << "Resize ";
 
        os << resizeTranslator.find(resize);
-#if 0
-       // Old code, before using translators
-       switch (resize) {
-       case InsetGraphicsParams::DEFAULT_SIZE:
-               os << "default";
-               break;
-
-       case InsetGraphicsParams::CM:
-               os << "cm";
-               break;
-
-       case InsetGraphicsParams::INCH:
-               os << "inch";
-               break;
-
-       case InsetGraphicsParams::PERCENT_PAGE:
-               os << "percentOfPage";
-               break;
-
-       case InsetGraphicsParams::PERCENT_COLUMN:
-               os << "percentOfColumnt";
-               break;
-       }
-#endif 
-       os << ' ' << key << ' ' << size << endl;
+       os << ' ' << key << ' ' << size << '\n';
 }
 
 static void writeOrigin(ostream & os,
                         InsetGraphicsParams::Origin origin)
 {
        os << " rotateOrigin " << originTranslator.find(origin);
-
-#if 0
-       // Old method.
-       switch (origin) {
-       case InsetGraphicsParams:: DEFAULT:
-               os << "default";
-               break;
-       case InsetGraphicsParams::      LEFTTOP:
-               os << "LeftTop";
-               break;
-       case InsetGraphicsParams::      LEFTCENTER:
-               os << "LeftCenter";
-               break;
-       case InsetGraphicsParams::      LEFTBASELINE:
-               os << "LeftBaseLine";
-               break;
-       case InsetGraphicsParams::      LEFTBOTTOM:
-               os << "LeftBottom";
-               break;
-       case InsetGraphicsParams::      CENTERTOP:
-               os << "CenterTop";
-               break;
-       case InsetGraphicsParams::      CENTER:
-               os << "Center";
-               break;
-       case InsetGraphicsParams::      CENTERBASELINE:
-               os << "CenterBaseLine";
-               break;
-       case InsetGraphicsParams::      CENTERBOTTOM:
-               os << "CenterBottom";
-               break;
-       case InsetGraphicsParams::      RIGHTTOP:
-               os << "RightTop";
-               break;
-       case InsetGraphicsParams::      RIGHTCENTER:
-               os << "RightCenter";
-               break;
-       case InsetGraphicsParams::      RIGHTBASELINE:
-               os << "RightBaseLine";
-               break;
-       case InsetGraphicsParams::      RIGHTBOTTOM:
-               os << "RightBottom";
-               break;
-               // Current REFERENCE_POINT is aliased to LEFTBASELINE
-               //    case InsetGraphicsParams::        REFERENCE_POINT:
-       }
-
-#endif 
-
-       os << endl;
+       os << '\n';
 }
 
 void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
@@ -294,31 +219,11 @@ void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
        if (! filename.empty()) {
                os << "filename "
                << MakeRelPath(filename, OnlyPath(buf->fileName()))
-               << endl;
+               << '\n';
        }
 
        // Save the display type
-       os << " display " << displayTranslator.find(display) << endl;
-#if 0
-       switch (display) {
-       case COLOR:
-               os << "color";
-               break;
-
-       case GRAYSCALE:
-               os << "grayscale";
-               break;
-
-       case MONOCHROME:
-               os << "monochrome";
-               break;
-
-       case NONE:
-               os << "none";
-               break;
-       }
-       os << endl;
-#endif 
+       os << " display " << displayTranslator.find(display) << '\n';
 
        // Save the inline status
        if (inlineFigure)
@@ -329,14 +234,14 @@ void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
                os << " subcaption";
 
        if (! subcaptionText.empty())
-               os << " subcaptionText \"" << subcaptionText << '\"' << endl;
+               os << " subcaptionText \"" << subcaptionText << '\"' << '\n';
 
        writeResize(os, "width", widthResize, widthSize);
        writeResize(os, "height", heightResize, heightSize);
 
        writeOrigin(os, rotateOrigin);
        if (rotateAngle != 0)
-               os << " rotateAngle " << rotateAngle << endl;
+               os << " rotateAngle " << rotateAngle << '\n';
 }
 
 
@@ -347,23 +252,6 @@ void readResize(InsetGraphicsParams * igp, bool height,
        InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
 
        resize = resizeTranslator.find(token);
-#if 0
-       // Old code, before translator.
-       if (token == "default")
-               resize = InsetGraphicsParams::DEFAULT_SIZE;
-       else if (token == "cm")
-               resize = InsetGraphicsParams::CM;
-       else if (token == "inch")
-               resize = InsetGraphicsParams::INCH;
-       else if (token == "percentOfPage")
-               resize = InsetGraphicsParams::PERCENT_PAGE;
-       else if (token == "percentOfColumn")
-               resize = InsetGraphicsParams::PERCENT_COLUMN;
-       else {
-               lyxerr << "BUG: When reading resize value of InsetGraphicsParam"
-               " unknown token found '" << token << '\'' << endl;
-       }
-#endif 
 
        if (height)
                igp->heightResize = resize;
@@ -394,21 +282,6 @@ bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex,
                string const type = lex.GetString();
 
                display = displayTranslator.find(type);
-#if 0
-               if (type == "color")
-                       display = COLOR;
-               else if (type == "grayscale")
-                       display = GRAYSCALE;
-               else if (type == "monochrome")
-                       display = MONOCHROME;
-               else if (type == "none")
-                       display = NONE;
-               else {
-                       display = MONOCHROME;
-                       lyxerr << "BUG: When reading InsetGraphicsParams"
-                       " display has an unknown type " << type << endl;
-               }
-#endif 
        } else if (token == "inline") {
                inlineFigure = true;
        } else if (token == "subcaption") {