]> git.lyx.org Git - lyx.git/blob - src/graphics/GraphicsImage.h
hand-crafted LyXErr
[lyx.git] / src / graphics / GraphicsImage.h
1 // -*- C++ -*-
2 /**
3  * \file GraphicsImage.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Baruch Even
8  * \author Angus Leeming
9  *
10  * Full author contact details are available in file CREDITS.
11  *
12  * An abstract base class for the images themselves.
13  * Allows the user to retrieve the pixmap, once loaded and to issue commands
14  * to modify it.
15  *
16  * The boost::functions newImage and loadableFormats are connected to the
17  * appropriate derived classes elsewhere, allowing the graphics cache to
18  * access them without knowing anything about their instantiation.
19  *
20  * The loading process can be asynchronous, but cropping, rotating and
21  * scaling block execution.
22  */
23
24 #ifndef GRAPHICSIMAGE_H
25 #define GRAPHICSIMAGE_H
26
27 #include "Dimension.h"
28
29 #include <boost/function.hpp>
30 #include <boost/signal.hpp>
31
32 #include <vector>
33
34 namespace lyx {
35
36 namespace support { class FileName; }
37
38 namespace graphics {
39
40 class Params;
41
42 class Image {
43 public:
44         /** This is to be connected to a function that will return a new
45          *  instance of a viable derived class.
46          */
47         static boost::function<Image *()> newImage;
48
49         ///
50         typedef std::vector<std::string> FormatList;
51         /// Return the list of loadable formats.
52         static boost::function<FormatList()> loadableFormats;
53
54         ///
55         virtual ~Image() {}
56
57         /// Create a copy
58         virtual Image * clone() const = 0;
59
60         /// Get the image width
61         virtual unsigned int width() const = 0;
62
63         /// Get the image height
64         virtual unsigned int height() const = 0;
65
66         /// Is the image drawable ?
67         virtual bool isDrawable() const = 0;
68
69         /** At the end of the loading process inform the outside world
70          *  by emitting a signal
71          */
72         typedef boost::signal<void(bool)> SignalType;
73         ///
74         SignalType finishedLoading;
75
76         /** Start loading the image file.
77          *  The caller should expect this process to be asynchronous and
78          *  so should connect to the "finished" signal above.
79          */
80         virtual void load(support::FileName const & filename) = 0;
81
82         /** Generate the pixmap.
83          *  Uses the params to decide on color, grayscale etc.
84          *  Returns true if the pixmap is created.
85          */
86         virtual bool setPixmap(Params const & params) = 0;
87
88         /// Clip the image using params.
89         virtual void clip(Params const & params) = 0;
90
91         /// Rotate the image using params.
92         virtual void rotate(Params const & params) = 0;
93
94         /// Scale the image using params.
95         virtual void scale(Params const & params) = 0;
96
97 protected:
98         /// Must define default c-tor explicitly as we define a copy c-tor.
99         Image() {}
100         /// Don't copy the signal finishedLoading
101         Image(Image const &) {}
102
103         /** Uses the params to ascertain the dimensions of the scaled image.
104          *  Returned as Dimension(width, height, 0 descend).
105          *  If something goes wrong, returns make_pair(getWidth(), getHeight(), 0)
106          */
107         Dimension scaledDimension(Params const & params) const;
108 };
109
110
111 } // namespace graphics
112 } // namespace lyx
113
114 #endif // GRAPHICSIMAGE_H