1 /* -*- Mode: C++; c-default-style: "k&r"; indent-tabs-mode: nil; tab-width: 2; c-basic-offset: 2 -*- */
2 
3 /* libmwaw
4 * Version: MPL 2.0 / LGPLv2+
5 *
6 * The contents of this file are subject to the Mozilla Public License Version
7 * 2.0 (the "License"); you may not use this file except in compliance with
8 * the License or as specified alternatively below. You may obtain a copy of
9 * the License at http://www.mozilla.org/MPL/
10 *
11 * Software distributed under the License is distributed on an "AS IS" basis,
12 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13 * for the specific language governing rights and limitations under the
14 * License.
15 *
16 * Major Contributor(s):
17 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
18 * Copyright (C) 2002,2004 Marc Maurer (uwog@uwog.net)
19 * Copyright (C) 2004-2006 Fridrich Strba (fridrich.strba@bluewin.ch)
20 * Copyright (C) 2006, 2007 Andrew Ziem
21 * Copyright (C) 2011, 2012 Alonso Laurent (alonso@loria.fr)
22 *
23 *
24 * All Rights Reserved.
25 *
26 * For minor contributions see the git repository.
27 *
28 * Alternatively, the contents of this file may be used under the terms of
29 * the GNU Lesser General Public License Version 2 or later (the "LGPLv2+"),
30 * in which case the provisions of the LGPLv2+ are applicable
31 * instead of those above.
32 */
33 
34 /*
35  * Parser to Canvas text document ( graphic part )
36  *
37  */
38 #ifndef CANVAS_GRAPH
39 #  define CANVAS_GRAPH
40 
41 #include <string>
42 #include <vector>
43 
44 #include <librevenge/librevenge.h>
45 
46 #include "libmwaw_internal.hxx"
47 
48 #include "MWAWDebug.hxx"
49 #include "MWAWGraphicStyle.hxx"
50 #include "MWAWInputStream.hxx"
51 #include "MWAWPosition.hxx"
52 
53 namespace CanvasGraphInternal
54 {
55 struct LocalTransform;
56 struct Shape;
57 struct State;
58 
59 class SubDocument;
60 }
61 
62 class CanvasParser;
63 class CanvasStyleManager;
64 
65 /** \brief the main class to read the graphic part of Canvas file
66  *
67  *
68  *
69  */
70 class CanvasGraph
71 {
72   friend class CanvasGraphInternal::SubDocument;
73   friend class CanvasParser;
74 
75 public:
76   //! constructor
77   explicit CanvasGraph(CanvasParser &parser);
78   //! destructor
79   virtual ~CanvasGraph();
80 
81   /** returns the file version */
82   int version() const;
83 
84 protected:
85   /** store the actual input */
86   void setInput(MWAWInputStreamPtr &input);
87   /** returns the current input */
88   MWAWInputStreamPtr &getInput();
89 
90   // interface with main parser
91 
92   //! tries to send a shape with id
93   bool sendShape(int id);
94 
95   //
96   // Intermediate level
97   //
98 
99   //! try to read the shapes: in fact, the compression header + the list of shapes
100   bool readShapes(int numShapes, unsigned long shapeLength, unsigned long dataLength);
101   //! try to read a shape: to do
102   bool readShape(int n, std::vector<MWAWEntry> const &dataZonesList);
103   //! try to read the shapes data
104   bool readShapeData(CanvasGraphInternal::Shape &shape);
105 
106   //! tries to read a bitmap stored in the rectangle's data
107   bool getBitmapBW(CanvasGraphInternal::Shape const &shape, MWAWEmbeddedObject &obj);
108   //! tries to read the color bitmap stored in 55's shape: v3.5
109   bool getBitmap(CanvasGraphInternal::Shape const &shape, MWAWEmbeddedObject &obj);
110   //! tries to read the file bitmap: windows v3.5
111   bool readFileBitmap(long length);
112   //! tries to read a picture stored in the picture's data
113   bool getPicture(CanvasGraphInternal::Shape const &shape, MWAWEmbeddedObject &obj);
114 
115   //
116   // send data to the listener
117   //
118 
119   //! updates the style corresponding to a shape
120   void update(CanvasGraphInternal::Shape const &shape, MWAWGraphicStyle &style) const;
121   //! tries to send a shape
122   bool send(CanvasGraphInternal::Shape const &shape, CanvasGraphInternal::LocalTransform const *local=nullptr);
123   //! tries the dimension line's special shape: DIMN
124   bool sendDimension(CanvasGraphInternal::Shape const &shape, CanvasGraphInternal::LocalTransform const &local);
125   //! tries the multiligne's special shape: Palm
126   bool sendMultiLines(CanvasGraphInternal::Shape const &shape, CanvasGraphInternal::LocalTransform const &local);
127   //! tries to send the special content
128   bool sendSpecial(CanvasGraphInternal::Shape const &shape, CanvasGraphInternal::LocalTransform const &local);
129   //! tries to send the text of a text's shape
130   bool sendText(CanvasGraphInternal::Shape const &shape);
131   //! tries to send the text of a text's shape given a zone id
132   bool sendText(int zId);
133 
134   //
135   // Low level
136   //
137 
138   //! mark the id's shape as read in debug mode
139   void markSent(int id);
140   //! look for unsent shapes in debug mode
141   void checkUnsent() const;
142 
143 private:
144   CanvasGraph(CanvasGraph const &orig) = delete;
145   CanvasGraph &operator=(CanvasGraph const &orig) = delete;
146 
147 protected:
148   //
149   // data
150   //
151   //! the parser state
152   MWAWParserStatePtr m_parserState;
153 
154   //! the state
155   std::shared_ptr<CanvasGraphInternal::State> m_state;
156 
157   //! the main parser;
158   CanvasParser *m_mainParser;
159   //! the style manager
160   std::shared_ptr<CanvasStyleManager> m_styleManager;
161 };
162 #endif
163 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
164