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 v5-v11 text document ( graphic part )
36  *
37  */
38 #ifndef CANVAS5_GRAPH
39 #  define CANVAS5_GRAPH
40 
41 #include <string>
42 #include <utility>
43 #include <vector>
44 
45 #include <librevenge/librevenge.h>
46 
47 #include "libmwaw_internal.hxx"
48 
49 #include "MWAWDebug.hxx"
50 #include "MWAWGraphicStyle.hxx"
51 #include "MWAWInputStream.hxx"
52 #include "MWAWPosition.hxx"
53 
54 #include "Canvas5StyleManager.hxx"
55 
56 class MWAWFont;
57 class MWAWParagraph;
58 
59 namespace Canvas5Structure
60 {
61 struct Stream;
62 }
63 
64 namespace Canvas5GraphInternal
65 {
66 struct Shape;
67 struct ShapeData;
68 struct State;
69 
70 struct PseudoShape;
71 
72 class SubDocument;
73 }
74 
75 class Canvas5Image;
76 
77 class Canvas5Parser;
78 
79 /** \brief the main class to read the graphic part of Canvas v5-v11 file
80  *
81  *
82  *
83  */
84 class Canvas5Graph
85 {
86   friend class Canvas5GraphInternal::SubDocument;
87   friend class Canvas5Image;
88   friend class Canvas5Parser;
89 
90 public:
91   //! constructor
92   explicit Canvas5Graph(Canvas5Parser &parser);
93   //! destructor
94   virtual ~Canvas5Graph();
95 
96   /** returns the file version */
97   int version() const;
98 
99   //! Internal: the local state of a Canvas5Graph
100   struct LocalState {
101     //! default constructor
LocalStateCanvas5Graph::LocalState102     LocalState(MWAWPosition const &pos=MWAWPosition(), MWAWGraphicStyle const &style=MWAWGraphicStyle::emptyStyle())
103       : m_position(pos)
104       , m_style(style)
105       , m_transform()
106     {
107     }
108     //! set the matrix transform
109     void multiplyMatrix(std::array<double,9> const &mat);
110     //! the shape position position
111     MWAWPosition m_position;
112     //! the shape style
113     MWAWGraphicStyle m_style;
114     //! the shape transformation
115     MWAWTransformation m_transform;
116   };
117 
118 
119 protected:
120 
121   // interface with main parser
122 
123   //! try to send a shape
124   bool sendShape(int sId);
125 
126   //
127   // Intermediate level
128   //
129 
130   //! try to find the list of data's shape zones
131   bool findShapeDataZones(std::shared_ptr<Canvas5Structure::Stream> stream);
132   //! try to read a shape data
133   bool readShapeData(int id, Canvas5GraphInternal::Shape const &shape);
134   //! try to read a special shape data
135   bool readSpecialData(std::shared_ptr<Canvas5Structure::Stream> stream, long len, Canvas5GraphInternal::ShapeData &data, std::string &extra);
136   //! try to read a special shape data (internal helper to understand vkfl structure)
137   std::shared_ptr<Canvas5GraphInternal::PseudoShape> readSpecialData(std::shared_ptr<Canvas5Structure::Stream> stream, long len, unsigned type, MWAWBox2f const &box, std::string &extra);
138   //! try to read the different shapes
139   bool readShapes(Canvas5Structure::Stream &stream, int numShapes);
140 
141   //! try to read the different matrix
142   bool readMatrices(std::shared_ptr<Canvas5Structure::Stream> stream);
143 
144   //! try to read a complementary styles zone: DeR3
145   bool readDeR3(std::shared_ptr<Canvas5Structure::Stream> stream, Canvas5StyleManager::StyleList &styles);
146 
147   //
148   // send data to the listener
149   //
150 
151   //! try to send a shape with a transformation
152   bool sendShape(int sId, LocalState const &local);
153   //! try to send a shape with a transformation
154   bool send(Canvas5GraphInternal::Shape const &shape, LocalState const &local);
155   //! try to send a special shape
156   bool sendSpecial(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
157                    LocalState const &local);
158   //! try to send a special shape
159   bool sendSpecial(MWAWListenerPtr listener, Canvas5GraphInternal::PseudoShape const &pseudoShape, LocalState const &local);
160 
161   //! try to send a text zone
162   bool sendText(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data);
163 
164   //! try to send a curve's text zone: CvTe
165   bool sendCurveText(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
166                      LocalState const &local);
167   //! tries to send the dimension line's special shape: DIMN
168   bool sendDimension(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
169                      LocalState const &local);
170   //! tries to send the dimension line's special shape: DIMN: v9
171   bool sendDimension9(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
172                       LocalState const &local);
173   //! tries to send the effect's special shape: effe
174   bool sendEffect(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
175                   LocalState const &local);
176   //! tries to send the extrude's special shape: Extr (pretty basic)
177   bool sendExtrude(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
178                    LocalState const &local);
179   //! tries to send the technical shape: Tech (v7)
180   bool sendTechnical(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
181                      LocalState const &local);
182   //! tries to send the gif's shape: AnGf (v7)
183   bool sendGIF(MWAWListenerPtr listener, Canvas5GraphInternal::Shape const &shape, Canvas5GraphInternal::ShapeData const &data,
184                LocalState const &local);
185 
186   //
187   // Low level
188   //
189 
190   //! tries to send a basic shape ( applying a transformation if need)
191   void send(MWAWListenerPtr listener, MWAWGraphicShape const &shape, MWAWTransformation const &transform,
192             MWAWGraphicStyle const &style);
193   //! tries to send a measure ( applying a transformation if need)
194   void send(MWAWListenerPtr listener, librevenge::RVNGString const &text, MWAWVec2f const &center,
195             MWAWTransformation const &transform, MWAWFont const &font, bool addFrame);
196 
197 private:
198   Canvas5Graph(Canvas5Graph const &orig) = delete;
199   Canvas5Graph &operator=(Canvas5Graph const &orig) = delete;
200 
201 protected:
202   //
203   // data
204   //
205   //! the parser state
206   MWAWParserStatePtr m_parserState;
207 
208   //! the state
209   std::shared_ptr<Canvas5GraphInternal::State> m_state;
210 
211   //! the main parser;
212   Canvas5Parser *m_mainParser;
213   //! the image parser
214   std::shared_ptr<Canvas5Image> m_imageParser;
215   //! the style manager
216   std::shared_ptr<Canvas5StyleManager> m_styleManager;
217 };
218 #endif
219 // vim: set filetype=cpp tabstop=2 shiftwidth=2 cindent autoindent smartindent noexpandtab:
220