mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-10 20:04:46 +00:00
Cleaned up cruft in InsetGraphics.
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
This commit is contained in:
parent
f490ae76ab
commit
39b3fd44b9
@ -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.
|
@ -9,10 +9,6 @@
|
|||||||
* This file Copyright 2000 Baruch Even
|
* This file Copyright 2000 Baruch Even
|
||||||
* ================================================= */
|
* ================================================= */
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma implementation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include "LyXImage.h"
|
#include "LyXImage.h"
|
||||||
|
|
||||||
|
@ -12,10 +12,6 @@
|
|||||||
#ifndef LYXIMAGE_H
|
#ifndef LYXIMAGE_H
|
||||||
#define LYXIMAGE_H
|
#define LYXIMAGE_H
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma interface
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// We need it to know what version to use.
|
// We need it to know what version to use.
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
@ -9,10 +9,6 @@
|
|||||||
* This file Copyright 2000 Baruch Even
|
* This file Copyright 2000 Baruch Even
|
||||||
* ================================================= */
|
* ================================================= */
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma implementation
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include "LyXImage.h"
|
#include "LyXImage.h"
|
||||||
|
|
||||||
@ -21,11 +17,11 @@
|
|||||||
#include "support/LAssert.h"
|
#include "support/LAssert.h"
|
||||||
|
|
||||||
LyXImage::LyXImage()
|
LyXImage::LyXImage()
|
||||||
: pixmap_(0), pixmapInitialized(false)
|
: pixmap_(0), pixmapInitialized(false), width_(0), height_(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LyXImage::LyXImage(Pixmap pixmap)
|
LyXImage::LyXImage(Pixmap pixmap, unsigned int width, unsigned int height)
|
||||||
: pixmap_(pixmap), pixmapInitialized(true)
|
: pixmap_(pixmap), pixmapInitialized(true), width_(width), height_(height)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LyXImage::~LyXImage()
|
LyXImage::~LyXImage()
|
||||||
|
@ -12,10 +12,6 @@
|
|||||||
#ifndef LYXIMAGE_X_H
|
#ifndef LYXIMAGE_X_H
|
||||||
#define LYXIMAGE_X_H
|
#define LYXIMAGE_X_H
|
||||||
|
|
||||||
#ifdef __GNUG__
|
|
||||||
#pragma interface
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "frontends/support/LyXImage.h"
|
#include "frontends/support/LyXImage.h"
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
@ -26,18 +22,28 @@ public:
|
|||||||
///
|
///
|
||||||
LyXImage();
|
LyXImage();
|
||||||
///
|
///
|
||||||
LyXImage(Pixmap pixmap);
|
LyXImage(Pixmap pixmap, unsigned int width, unsigned int height);
|
||||||
///
|
///
|
||||||
~LyXImage();
|
~LyXImage();
|
||||||
|
|
||||||
///
|
///
|
||||||
Pixmap getPixmap() const;
|
Pixmap getPixmap() const;
|
||||||
|
|
||||||
|
/// Get the image width
|
||||||
|
unsigned int getWidth() const { return width_; }
|
||||||
|
|
||||||
|
/// Get the image height
|
||||||
|
unsigned int getHeight() const { return height_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// The pixmap itself.
|
/// The pixmap itself.
|
||||||
Pixmap pixmap_;
|
Pixmap pixmap_;
|
||||||
/// Is the pixmap initialized?
|
/// Is the pixmap initialized?
|
||||||
bool pixmapInitialized;
|
bool pixmapInitialized;
|
||||||
|
/// Width of the image
|
||||||
|
unsigned int width_;
|
||||||
|
/// Height of the image
|
||||||
|
unsigned int height_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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.
|
@ -43,8 +43,9 @@ GraphicsCacheItem::setFilename(string const & filename)
|
|||||||
|
|
||||||
|
|
||||||
GraphicsCacheItem::GraphicsCacheItem(GraphicsCacheItem const & gci)
|
GraphicsCacheItem::GraphicsCacheItem(GraphicsCacheItem const & gci)
|
||||||
|
: pimpl(0)
|
||||||
{
|
{
|
||||||
pimpl = 0;
|
// copy will set the actual value of the pimpl.
|
||||||
copy(gci);
|
copy(gci);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +89,7 @@ GraphicsCacheItem::destroy()
|
|||||||
// even before it is deleted.
|
// even before it is deleted.
|
||||||
GraphicsCacheItem_pimpl * temp = pimpl;
|
GraphicsCacheItem_pimpl * temp = pimpl;
|
||||||
pimpl = 0;
|
pimpl = 0;
|
||||||
delete temp;
|
delete temp; temp = 0;
|
||||||
}
|
}
|
||||||
GraphicsCache * gc = GraphicsCache::getInstance();
|
GraphicsCache * gc = GraphicsCache::getInstance();
|
||||||
gc->removeFile(filename_);
|
gc->removeFile(filename_);
|
||||||
@ -100,13 +101,5 @@ GraphicsCacheItem::destroy()
|
|||||||
GraphicsCacheItem::ImageStatus
|
GraphicsCacheItem::ImageStatus
|
||||||
GraphicsCacheItem::getImageStatus() const { return pimpl->imageStatus_; }
|
GraphicsCacheItem::getImageStatus() const { return pimpl->imageStatus_; }
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
GraphicsCacheItem::getHeight() const { return pimpl->height_; }
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
GraphicsCacheItem::getWidth() const { return pimpl->width_; }
|
|
||||||
|
|
||||||
LyXImage *
|
LyXImage *
|
||||||
GraphicsCacheItem::getImage() const { return pimpl->pixmap_; }
|
GraphicsCacheItem::getImage() const { return pimpl->getImage(); }
|
||||||
|
@ -49,12 +49,6 @@ public:
|
|||||||
/// Assignment operator.
|
/// Assignment operator.
|
||||||
GraphicsCacheItem & operator=(GraphicsCacheItem const &);
|
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.
|
/// Return a pixmap that can be displayed on X server.
|
||||||
LyXImage * getImage() const;
|
LyXImage * getImage() const;
|
||||||
///
|
///
|
||||||
|
@ -23,8 +23,7 @@
|
|||||||
#include "GraphicsCacheItem_pimpl.h"
|
#include "GraphicsCacheItem_pimpl.h"
|
||||||
|
|
||||||
#include "frontends/support/LyXImage.h"
|
#include "frontends/support/LyXImage.h"
|
||||||
#include "graphics/XPM_Renderer.h"
|
#include "ImageLoaderXPM.h"
|
||||||
#include "graphics/EPS_Renderer.h"
|
|
||||||
#include "support/filetools.h"
|
#include "support/filetools.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "support/LAssert.h"
|
#include "support/LAssert.h"
|
||||||
@ -34,24 +33,24 @@ using std::map;
|
|||||||
|
|
||||||
|
|
||||||
GraphicsCacheItem_pimpl::GraphicsCacheItem_pimpl()
|
GraphicsCacheItem_pimpl::GraphicsCacheItem_pimpl()
|
||||||
: height_(-1), width_(-1), imageStatus_(GraphicsCacheItem::Loading),
|
: imageStatus_(GraphicsCacheItem::Loading),
|
||||||
pixmap_(0), renderer(0), refCount(0)
|
image_(0), imageLoader(0), refCount(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
GraphicsCacheItem_pimpl::~GraphicsCacheItem_pimpl()
|
GraphicsCacheItem_pimpl::~GraphicsCacheItem_pimpl()
|
||||||
{
|
{
|
||||||
delete pixmap_;
|
delete image_; image_ = 0;
|
||||||
delete renderer;
|
delete imageLoader; imageLoader = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GraphicsCacheItem_pimpl::setFilename(string const & filename)
|
GraphicsCacheItem_pimpl::setFilename(string const & filename)
|
||||||
{
|
{
|
||||||
|
imageLoader = new ImageLoaderXPM();
|
||||||
imageStatus_ = GraphicsCacheItem::Loading;
|
imageStatus_ = GraphicsCacheItem::Loading;
|
||||||
|
|
||||||
renderer = new XPM_Renderer();
|
|
||||||
if (renderXPM(filename))
|
if (renderXPM(filename))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -66,7 +65,7 @@ static CallbackMap callbackMap;
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
callback(string cmd, int retval)
|
static callback(string cmd, int retval)
|
||||||
{
|
{
|
||||||
lyxerr << "callback, cmd=" << cmd << ", retval=" << retval << endl;
|
lyxerr << "callback, cmd=" << cmd << ", retval=" << retval << endl;
|
||||||
|
|
||||||
@ -83,6 +82,8 @@ GraphicsCacheItem_pimpl::imageConverted(int retval)
|
|||||||
lyxerr << "imageConverted, retval=" << retval << endl;
|
lyxerr << "imageConverted, retval=" << retval << endl;
|
||||||
|
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
lyxerr << "(GraphicsCacheItem_pimpl::imageConverter) "
|
||||||
|
"Error converting image." << endl;
|
||||||
imageStatus_ = GraphicsCacheItem::ErrorConverting;
|
imageStatus_ = GraphicsCacheItem::ErrorConverting;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -133,16 +134,14 @@ GraphicsCacheItem_pimpl::renderXPM(string const & filename)
|
|||||||
void
|
void
|
||||||
GraphicsCacheItem_pimpl::loadXPMImage()
|
GraphicsCacheItem_pimpl::loadXPMImage()
|
||||||
{
|
{
|
||||||
if (!renderer->setFilename(xpmfile)) {
|
lyxerr << "Loading XPM Image... ";
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (renderer->renderImage()) {
|
if (imageLoader->loadImage(xpmfile)) {
|
||||||
pixmap_ = renderer->getPixmap();
|
lyxerr << "Success." << endl;
|
||||||
width_ = renderer->getWidth();
|
image_ = imageLoader->getImage();
|
||||||
height_ = renderer->getHeight();
|
|
||||||
imageStatus_ = GraphicsCacheItem::Loaded;
|
imageStatus_ = GraphicsCacheItem::Loaded;
|
||||||
} else {
|
} else {
|
||||||
|
lyxerr << "Fail." << endl;
|
||||||
imageStatus_ = GraphicsCacheItem::ErrorReading;
|
imageStatus_ = GraphicsCacheItem::ErrorReading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
#include XPM_H_LOCATION
|
#include XPM_H_LOCATION
|
||||||
#include "LString.h"
|
#include "LString.h"
|
||||||
#include "graphics/Renderer.h"
|
#include "graphics/ImageLoader.h"
|
||||||
#include "support/syscall.h"
|
#include "support/syscall.h"
|
||||||
|
|
||||||
#include "sigc++/signal_system.h"
|
#include "sigc++/signal_system.h"
|
||||||
@ -38,14 +38,8 @@ public:
|
|||||||
/// d-tor, frees the image structures.
|
/// d-tor, frees the image structures.
|
||||||
~GraphicsCacheItem_pimpl();
|
~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.
|
/// Return a pixmap that can be displayed on X server.
|
||||||
LyXImage * getImage() const;
|
LyXImage * getImage() const { return image_; };
|
||||||
|
|
||||||
typedef GraphicsCacheItem::ImageStatus ImageStatus;
|
typedef GraphicsCacheItem::ImageStatus ImageStatus;
|
||||||
|
|
||||||
@ -74,16 +68,12 @@ private:
|
|||||||
|
|
||||||
/// The file name of the XPM file.
|
/// The file name of the XPM file.
|
||||||
string xpmfile;
|
string xpmfile;
|
||||||
/// The image height
|
|
||||||
int height_;
|
|
||||||
/// The image width
|
|
||||||
int width_;
|
|
||||||
/// Is the pixmap loaded?
|
/// Is the pixmap loaded?
|
||||||
ImageStatus imageStatus_;
|
ImageStatus imageStatus_;
|
||||||
/// The image pixmap
|
/// The image pixmap
|
||||||
LyXImage * pixmap_;
|
LyXImage * image_;
|
||||||
/// The rendering object.
|
/// The rendering object.
|
||||||
Renderer * renderer;
|
ImageLoader * imageLoader;
|
||||||
|
|
||||||
/// The system caller, runs the convertor.
|
/// The system caller, runs the convertor.
|
||||||
Systemcalls syscall;
|
Systemcalls syscall;
|
||||||
|
@ -8,15 +8,13 @@ BOOST_INCLUDES = -I$(top_srcdir)/boost
|
|||||||
INCLUDES = -I${srcdir}/../ $(SIGC_CFLAGS) $(BOOST_INCLUDES)
|
INCLUDES = -I${srcdir}/../ $(SIGC_CFLAGS) $(BOOST_INCLUDES)
|
||||||
|
|
||||||
libgraphics_la_SOURCES = \
|
libgraphics_la_SOURCES = \
|
||||||
Renderer.h \
|
|
||||||
Renderer.C \
|
|
||||||
XPM_Renderer.h \
|
|
||||||
XPM_Renderer.C \
|
|
||||||
EPS_Renderer.h \
|
|
||||||
EPS_Renderer.C \
|
|
||||||
GraphicsCache.h \
|
GraphicsCache.h \
|
||||||
GraphicsCache.C \
|
GraphicsCache.C \
|
||||||
GraphicsCacheItem.h \
|
GraphicsCacheItem.h \
|
||||||
GraphicsCacheItem.C \
|
GraphicsCacheItem.C \
|
||||||
GraphicsCacheItem_pimpl.h \
|
GraphicsCacheItem_pimpl.h \
|
||||||
GraphicsCacheItem_pimpl.C \
|
GraphicsCacheItem_pimpl.C \
|
||||||
|
ImageLoaderXPM.h \
|
||||||
|
ImageLoaderXPM.C \
|
||||||
|
ImageLoader.h \
|
||||||
|
ImageLoader.C
|
||||||
|
@ -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>
|
2001-01-31 Dekel Tsur <dekelts@tau.ac.il>
|
||||||
|
|
||||||
* insetbib.C (callback): Update citations if the key has changed.
|
* insetbib.C (callback): Update citations if the key has changed.
|
||||||
|
@ -17,9 +17,11 @@ How to use it for now:
|
|||||||
Immediate tasks:
|
Immediate tasks:
|
||||||
* Make the inline viewing work, there is a preliminary work going on,
|
* Make the inline viewing work, there is a preliminary work going on,
|
||||||
need to finish it up.
|
need to finish it up.
|
||||||
|
* Support automatic image format conversion, create both a PNG and EPS output.
|
||||||
|
|
||||||
* Polishing tasks:
|
* 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.
|
- Implemented, needs testing.
|
||||||
* Clean up GraphicsCacheItem(_pimpl)
|
* Clean up GraphicsCacheItem(_pimpl)
|
||||||
* Pop up a dialog if the widget version is higher than what we accept.
|
* 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
|
* Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then
|
||||||
pressing ok, it counts as if no real selection done. Apparently
|
pressing ok, it counts as if no real selection done. Apparently
|
||||||
when choosing a file it doesn't update the select file input line.
|
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:
|
disabled. To enable it enable the define:
|
||||||
INSETGRAPHICS_INLINE_VIEW
|
INSETGRAPHICS_INLINE_VIEW
|
||||||
|
* If we are trying to create a file in a read-only directory and there
|
||||||
Current PROBLEMS:
|
are graphics that need converting, the converting will fail because
|
||||||
|
it is done in-place, into the same directory as the original image.
|
||||||
* 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.
|
|
||||||
|
|
||||||
TODO Before initial production release:
|
TODO Before initial production release:
|
||||||
* Replace insetfig everywhere
|
* Replace insetfig everywhere
|
||||||
@ -77,13 +65,14 @@ TODO Before initial production release:
|
|||||||
TODO Extended features:
|
TODO Extended features:
|
||||||
|
|
||||||
* Advanced Latex tab folder.
|
* 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
|
* Support for complete control over the latex parameters for TeXperts
|
||||||
* What advanced features the users want to do?
|
* What advanced features the users want to do?
|
||||||
Implement them in a non latex dependent way, but a logical way.
|
Implement them in a non latex dependent way, but a logical way.
|
||||||
LyX should translate it to latex or any other fitting format.
|
LyX should translate it to latex or any other fitting format.
|
||||||
* Add a way to roll the image file into the file 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.
|
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.
|
* 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
|
* 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)
|
* 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>
|
#include <config.h>
|
||||||
|
|
||||||
#ifdef __GNUG__
|
#ifdef __GNUG__
|
||||||
#pragma implementation
|
#pragma implementation
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define INSETGRAPHICS_INLINE_VIEW
|
||||||
|
|
||||||
#include "insets/insetgraphics.h"
|
#include "insets/insetgraphics.h"
|
||||||
#include "insets/insetgraphicsParams.h"
|
#include "insets/insetgraphicsParams.h"
|
||||||
#include "graphics/GraphicsCache.h"
|
#include "graphics/GraphicsCache.h"
|
||||||
@ -177,29 +144,33 @@ TODO Extended features:
|
|||||||
#include "frontends/support/LyXImage.h"
|
#include "frontends/support/LyXImage.h"
|
||||||
#include "Painter.h"
|
#include "Painter.h"
|
||||||
#include "lyx_gui_misc.h"
|
#include "lyx_gui_misc.h"
|
||||||
#include "filedlg.h"
|
|
||||||
#include "support/FileInfo.h"
|
#include "support/FileInfo.h"
|
||||||
#include "support/filetools.h"
|
#include "support/filetools.h"
|
||||||
|
#include "support/lyxlib.h"
|
||||||
#include "lyxtext.h"
|
#include "lyxtext.h"
|
||||||
|
#include "lyxrc.h"
|
||||||
#include "font.h" // For the lyxfont class.
|
#include "font.h" // For the lyxfont class.
|
||||||
#include <algorithm> // For the std::max
|
#include <algorithm> // For the std::max
|
||||||
#include "lyxrc.h"
|
#include "support/lyxmanip.h"
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
extern string system_tempdir;
|
||||||
|
|
||||||
using std::ostream;
|
using std::ostream;
|
||||||
using std::endl;
|
using std::endl;
|
||||||
using std::max;
|
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.
|
// Initialize only those variables that do not have a constructor.
|
||||||
InsetGraphics::InsetGraphics()
|
InsetGraphics::InsetGraphics()
|
||||||
#ifdef IG_OLDPARAMS
|
: cacheHandle(0), pixmap(0), updateImage(false)
|
||||||
: 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)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
InsetGraphics::~InsetGraphics()
|
InsetGraphics::~InsetGraphics()
|
||||||
@ -214,26 +185,28 @@ InsetGraphics::statusMessage() const
|
|||||||
char const * msg = 0;
|
char const * msg = 0;
|
||||||
|
|
||||||
#ifdef INSETGRAPHICS_INLINE_VIEW
|
#ifdef INSETGRAPHICS_INLINE_VIEW
|
||||||
switch (status) {
|
if (cacheHandle) {
|
||||||
case GraphicsCacheItem::UnknownError:
|
switch (cacheHandle->getImageStatus()) {
|
||||||
msg = _("Unknown Error");
|
case GraphicsCacheItem::UnknownError:
|
||||||
break;
|
msg = _("Unknown Error");
|
||||||
|
break;
|
||||||
|
|
||||||
case GraphicsCacheItem::Loading:
|
case GraphicsCacheItem::Loading:
|
||||||
msg = _("Loading...");
|
msg = _("Loading...");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GraphicsCacheItem::ErrorReading:
|
case GraphicsCacheItem::ErrorReading:
|
||||||
msg = _("Error reading");
|
msg = _("Error reading");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GraphicsCacheItem::ErrorConverting:
|
case GraphicsCacheItem::ErrorConverting:
|
||||||
msg = _("Error converting");
|
msg = _("Error converting");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GraphicsCacheItem::Loaded:
|
case GraphicsCacheItem::Loaded:
|
||||||
// No message to write.
|
// No message to write.
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
msg = _("Inline view disabled");
|
msg = _("Inline view disabled");
|
||||||
@ -244,8 +217,8 @@ InsetGraphics::statusMessage() const
|
|||||||
|
|
||||||
int InsetGraphics::ascent(BufferView *, LyXFont const &) const
|
int InsetGraphics::ascent(BufferView *, LyXFont const &) const
|
||||||
{
|
{
|
||||||
if (pixmapInitialized)
|
if (pixmap)
|
||||||
return cacheHandle->getHeight();
|
return pixmap->getHeight();
|
||||||
else
|
else
|
||||||
return 50;
|
return 50;
|
||||||
}
|
}
|
||||||
@ -260,35 +233,46 @@ int InsetGraphics::descent(BufferView *, LyXFont const &) const
|
|||||||
|
|
||||||
int InsetGraphics::width(BufferView *, LyXFont const & font) const
|
int InsetGraphics::width(BufferView *, LyXFont const & font) const
|
||||||
{
|
{
|
||||||
if (pixmapInitialized)
|
if (pixmap)
|
||||||
return cacheHandle->getWidth();
|
return pixmap->getWidth();
|
||||||
else {
|
else {
|
||||||
char const * msg = statusMessage();
|
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);
|
return max(50, font_width + 15);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
|
void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
|
||||||
int baseline, float & x, bool) const
|
int baseline, float & x, bool) const
|
||||||
{
|
{
|
||||||
Painter & paint = bv->painter();
|
Painter & paint = bv->painter();
|
||||||
|
|
||||||
int lwidth = width(bv, font);
|
|
||||||
int ldescent = descent(bv, font);
|
int ldescent = descent(bv, font);
|
||||||
int lascent = ascent(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,
|
// This will draw the graphics. If the graphics has not been loaded yet,
|
||||||
// we draw just a rectangle.
|
// 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,
|
lwidth - 4, lascent + ldescent,
|
||||||
pixmap);
|
pixmap);
|
||||||
} else {
|
} else {
|
||||||
#ifdef INSETGRAPHICS_INLINE_VIEW
|
#ifdef INSETGRAPHICS_INLINE_VIEW
|
||||||
|
if (!updateImage) {
|
||||||
|
updateImage = true;
|
||||||
|
updateInset();
|
||||||
|
}
|
||||||
|
|
||||||
// Get the image status, default to unknown error.
|
// Get the image status, default to unknown error.
|
||||||
GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
|
GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
|
||||||
if (cacheHandle)
|
if (cacheHandle)
|
||||||
@ -298,7 +282,6 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
|
|||||||
if (status == GraphicsCacheItem::Loaded) {
|
if (status == GraphicsCacheItem::Loaded) {
|
||||||
// It is, get it and inform the world.
|
// It is, get it and inform the world.
|
||||||
pixmap = cacheHandle->getImage();
|
pixmap = cacheHandle->getImage();
|
||||||
pixmapInitialized = true;
|
|
||||||
|
|
||||||
// Tell BufferView we need to be updated!
|
// Tell BufferView we need to be updated!
|
||||||
bv->text->status = LyXText::CHANGED_IN_DRAW;
|
bv->text->status = LyXText::CHANGED_IN_DRAW;
|
||||||
@ -308,7 +291,7 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
|
|||||||
|
|
||||||
char const * msg = statusMessage();
|
char const * msg = statusMessage();
|
||||||
|
|
||||||
paint.rectangle(int(x) + 2, baseline - lascent,
|
paint.rectangle(int(old_x) + 2, baseline - lascent,
|
||||||
lwidth - 4,
|
lwidth - 4,
|
||||||
lascent + ldescent);
|
lascent + ldescent);
|
||||||
|
|
||||||
@ -318,22 +301,21 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
|
|||||||
msgFont.setFamily(LyXFont::SANS_FAMILY);
|
msgFont.setFamily(LyXFont::SANS_FAMILY);
|
||||||
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
|
||||||
string const justname = OnlyFilename (params.filename);
|
string const justname = OnlyFilename (params.filename);
|
||||||
paint.text(int(x + 8), baseline - lyxfont::maxAscent(msgFont) - 4,
|
paint.text(int(old_x) + 8,
|
||||||
justname, msgFont);
|
baseline - lyxfont::maxAscent(msgFont) - 4,
|
||||||
|
justname, msgFont);
|
||||||
|
|
||||||
msgFont.setSize(LyXFont::SIZE_TINY);
|
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)
|
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);
|
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)
|
void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
|
||||||
{
|
{
|
||||||
@ -432,7 +360,7 @@ void InsetGraphics::Read(Buffer const * buf, LyXLex & lex)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (! params.Read(buf, lex, token))
|
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,
|
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
|
// 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?
|
// we rotate before scale? Should we let the user decide?
|
||||||
// bool rot_before_scale; ?
|
// 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
|
// If there is no file specified, just output a message about it in
|
||||||
// the latex output.
|
// the latex output.
|
||||||
if (params.filename.empty()) {
|
if (params.filename.empty()) {
|
||||||
os << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
|
os << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
|
||||||
<< _("empty figure path")
|
<< _("empty figure path")
|
||||||
<< '}'
|
<< "}\n";
|
||||||
<< endl;
|
|
||||||
|
|
||||||
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
|
// Keep count of newlines that we issued.
|
||||||
// stream since we might have a trailing comma that we would like to remove
|
int newlines = 0;
|
||||||
// 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, ',');
|
|
||||||
|
|
||||||
|
// 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 it's not an inline image, surround it with the centering paragraph.
|
||||||
if (! params.inlineFigure) {
|
if (! params.inlineFigure) {
|
||||||
os << endl
|
before += "\n" "\\vspace{0.3cm}\n" "{\\par\\centering ";
|
||||||
<< "\\vspace{0.3cm}" << endl
|
after = " \\par}\n" "\\vspace{0.3cm}\n" + after;
|
||||||
<< "{\\par\\centering ";
|
newlines += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do we want subcaptions?
|
// Do we want subcaptions?
|
||||||
if (params.subcaption) {
|
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.
|
// We never use the starred form, we use the "clip" option instead.
|
||||||
os << "\\includegraphics";
|
os << before << "\\includegraphics";
|
||||||
|
|
||||||
|
// Write the options if there are any.
|
||||||
|
string const opts = createLatexOptions();
|
||||||
if (!opts.empty()) {
|
if (!opts.empty()) {
|
||||||
os << '[' << opts << ']';
|
os << '[' << opts << ']';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the filename relative to the lyx file
|
// 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
|
// and remove the extension so the LaTeX will use whatever is
|
||||||
// appropriate (when there are several versions in different formats)
|
// appropriate (when there are several versions in different formats)
|
||||||
filename = ChangeExtension(filename, string());
|
string const filename = prepareFile(buf);
|
||||||
|
|
||||||
os << '{' << filename << '}';
|
os << '{' << filename << '}' << after;
|
||||||
|
|
||||||
// Do we want a subcaption?
|
// Return how many newlines we issued.
|
||||||
if (params.subcaption) {
|
return newlines;
|
||||||
// Close the subcaption command
|
|
||||||
os << '}';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is this an inline graphics?
|
|
||||||
if (!params.inlineFigure) {
|
|
||||||
os << " \\par}" << endl
|
|
||||||
<< "\\vspace{0.3cm}" << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int InsetGraphics::Ascii(Buffer const *, ostream &, int) const
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -683,10 +548,19 @@ int InsetGraphics::Linuxdoc(Buffer const *, ostream &) const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For explanation on inserting graphics into DocBook checkout:
|
||||||
int InsetGraphics::DocBook(Buffer const *, ostream &) const
|
// 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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -707,18 +581,18 @@ void InsetGraphics::Validate(LaTeXFeatures & features) const
|
|||||||
// dialog.
|
// dialog.
|
||||||
void InsetGraphics::updateInset() const
|
void InsetGraphics::updateInset() const
|
||||||
{
|
{
|
||||||
// If file changed...
|
|
||||||
|
|
||||||
#ifdef INSETGRAPHICS_INLINE_VIEW
|
#ifdef INSETGRAPHICS_INLINE_VIEW
|
||||||
GraphicsCache * gc = GraphicsCache::getInstance();
|
if (updateImage) {
|
||||||
GraphicsCacheItem * temp = 0;
|
GraphicsCache * gc = GraphicsCache::getInstance();
|
||||||
|
GraphicsCacheItem * temp = 0;
|
||||||
|
|
||||||
if (!params.filename.empty()) {
|
if (!params.filename.empty()) {
|
||||||
temp = gc->addFile(params.filename);
|
temp = gc->addFile(params.filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete cacheHandle;
|
||||||
|
cacheHandle = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete cacheHandle;
|
|
||||||
cacheHandle = temp;
|
|
||||||
#else
|
#else
|
||||||
cacheHandle = 0;
|
cacheHandle = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -754,7 +628,7 @@ Inset * InsetGraphics::Clone(Buffer const &) const
|
|||||||
else
|
else
|
||||||
newInset->cacheHandle = 0;
|
newInset->cacheHandle = 0;
|
||||||
newInset->pixmap = pixmap;
|
newInset->pixmap = pixmap;
|
||||||
newInset->pixmapInitialized = pixmapInitialized;
|
newInset->updateImage = updateImage;
|
||||||
|
|
||||||
newInset->setParams(getParams());
|
newInset->setParams(getParams());
|
||||||
|
|
||||||
|
@ -106,6 +106,10 @@ private:
|
|||||||
void updateInset() const;
|
void updateInset() const;
|
||||||
/// Get the status message, depends on the image loading status.
|
/// Get the status message, depends on the image loading status.
|
||||||
char const * statusMessage() const;
|
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.
|
/// The graphics cache handle.
|
||||||
mutable GraphicsCacheItem * cacheHandle;
|
mutable GraphicsCacheItem * cacheHandle;
|
||||||
@ -113,105 +117,9 @@ private:
|
|||||||
/// The pixmap
|
/// The pixmap
|
||||||
mutable LyXImage * pixmap;
|
mutable LyXImage * pixmap;
|
||||||
/// is the pixmap initialized?
|
/// is the pixmap initialized?
|
||||||
mutable bool pixmapInitialized;
|
mutable bool updateImage;
|
||||||
|
|
||||||
InsetGraphicsParams params;
|
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
|
#endif
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
|
|
||||||
#include "support/LAssert.h"
|
#include "support/LAssert.h"
|
||||||
|
|
||||||
using std::endl;
|
|
||||||
|
|
||||||
/// This variable keeps a tab on whether the translator was set with the
|
/// This variable keeps a tab on whether the translator was set with the
|
||||||
/// translations.
|
/// translations.
|
||||||
static bool translatorsSet = false;
|
static bool translatorsSet = false;
|
||||||
@ -205,87 +203,14 @@ void writeResize(ostream & os, string const & key,
|
|||||||
os << ' ' << key << "Resize ";
|
os << ' ' << key << "Resize ";
|
||||||
|
|
||||||
os << resizeTranslator.find(resize);
|
os << resizeTranslator.find(resize);
|
||||||
#if 0
|
os << ' ' << key << ' ' << size << '\n';
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeOrigin(ostream & os,
|
static void writeOrigin(ostream & os,
|
||||||
InsetGraphicsParams::Origin origin)
|
InsetGraphicsParams::Origin origin)
|
||||||
{
|
{
|
||||||
os << " rotateOrigin " << originTranslator.find(origin);
|
os << " rotateOrigin " << originTranslator.find(origin);
|
||||||
|
os << '\n';
|
||||||
#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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
|
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()) {
|
if (! filename.empty()) {
|
||||||
os << "filename "
|
os << "filename "
|
||||||
<< MakeRelPath(filename, OnlyPath(buf->fileName()))
|
<< MakeRelPath(filename, OnlyPath(buf->fileName()))
|
||||||
<< endl;
|
<< '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the display type
|
// Save the display type
|
||||||
os << " display " << displayTranslator.find(display) << endl;
|
os << " display " << displayTranslator.find(display) << '\n';
|
||||||
#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
|
|
||||||
|
|
||||||
// Save the inline status
|
// Save the inline status
|
||||||
if (inlineFigure)
|
if (inlineFigure)
|
||||||
@ -329,14 +234,14 @@ void InsetGraphicsParams::Write(Buffer const * buf, ostream & os) const
|
|||||||
os << " subcaption";
|
os << " subcaption";
|
||||||
|
|
||||||
if (! subcaptionText.empty())
|
if (! subcaptionText.empty())
|
||||||
os << " subcaptionText \"" << subcaptionText << '\"' << endl;
|
os << " subcaptionText \"" << subcaptionText << '\"' << '\n';
|
||||||
|
|
||||||
writeResize(os, "width", widthResize, widthSize);
|
writeResize(os, "width", widthResize, widthSize);
|
||||||
writeResize(os, "height", heightResize, heightSize);
|
writeResize(os, "height", heightResize, heightSize);
|
||||||
|
|
||||||
writeOrigin(os, rotateOrigin);
|
writeOrigin(os, rotateOrigin);
|
||||||
if (rotateAngle != 0)
|
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;
|
InsetGraphicsParams::Resize resize = InsetGraphicsParams::DEFAULT_SIZE;
|
||||||
|
|
||||||
resize = resizeTranslator.find(token);
|
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)
|
if (height)
|
||||||
igp->heightResize = resize;
|
igp->heightResize = resize;
|
||||||
@ -394,21 +282,6 @@ bool InsetGraphicsParams::Read(Buffer const * buf, LyXLex & lex,
|
|||||||
string const type = lex.GetString();
|
string const type = lex.GetString();
|
||||||
|
|
||||||
display = displayTranslator.find(type);
|
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") {
|
} else if (token == "inline") {
|
||||||
inlineFigure = true;
|
inlineFigure = true;
|
||||||
} else if (token == "subcaption") {
|
} else if (token == "subcaption") {
|
||||||
|
Loading…
Reference in New Issue
Block a user