1#ifndef _SVGVIEW_VIEW_H
2#define _SVGVIEW_VIEW_H
3
4// Standard Includes -----------------------------------------------------------
5#include <expat.h>
6
7// System Includes -------------------------------------------------------------
8#include <InterfaceKit.h>
9#include <SupportKit.h>
10#include <TranslationUtils.h>
11
12// Project Includes ------------------------------------------------------------
13#include "Matrix.h"
14
15// Local Includes --------------------------------------------------------------
16
17// Local Defines ---------------------------------------------------------------
18struct named_color {
19	const char  *name;
20	rgb_color   color;
21};
22
23struct named_gradient {
24	const char  *name;
25	rgb_color   color;
26	bool        started;
27};
28
29enum {
30	STROKE_FLAG			= 0x01,
31	FILL_FLAG			= 0x02,
32	STROKE_WIDTH_FLAG	= 0x04,
33	LINE_MODE_FLAG		= 0x08,
34	FONT_SIZE_FLAG		= 0x10,
35	MATRIX_FLAG			= 0x20,
36
37};
38
39struct _state_ {
40
41	_state_() { set_default_values(); }
42	_state_(_state_ &state) { *this = state; }
43	void set_default_values()
44	{
45		fFlags = 0;
46		fCurrentColor.red = 0; fCurrentColor.green = 0;
47		fCurrentColor.blue = 0; fCurrentColor.alpha = 255;
48		fStrokeColor.red = 0; fStrokeColor.green = 0;
49		fStrokeColor.blue = 0; fStrokeColor.alpha = 255;
50		fStroke = false;
51		fFillColor.red = 0; fFillColor.green = 0;
52		fFillColor.blue = 0; fFillColor.alpha = 255;
53		fFill = true;
54		fStrokeWidth = 1.0f;
55		fLineCap = B_BUTT_CAP;
56		fLineJoin = B_MITER_JOIN;
57		fLineMiterLimit = B_DEFAULT_MITER_LIMIT;
58		fFontSize = 9.0f;
59	}
60
61	uint32		fFlags;
62	rgb_color	fCurrentColor;
63	rgb_color	fStrokeColor;
64	bool		fStroke;
65	rgb_color	fFillColor;
66	bool		fFill;
67	float		fStrokeWidth;
68	cap_mode	fLineCap;
69	join_mode	fLineJoin;
70	float		fLineMiterLimit;
71	float		fFontSize;
72	BMatrix		fMatrix;
73};
74
75// Globals ---------------------------------------------------------------------
76
77// Svg2PictureView class -------------------------------------------------------
78class Svg2PictureView : public BView {
79
80public:
81				Svg2PictureView(BRect frame, const char *fileName);
82				~Svg2PictureView();
83
84	virtual void		AttachedToWindow();
85        virtual void    	Draw(BRect updateRect);
86
87private:
88        bool    HasAttribute(const XML_Char **attributes, const char *name);
89        float   GetFloatAttribute(const XML_Char **attributes, const char *name);
90        const char  *GetStringAttribute(const XML_Char **attributes, const char *name);
91        rgb_color   GetColorAttribute(const XML_Char **attributes, const char *name, uint8 alpha);
92        void    GetPolygonAttribute(const XML_Char **attributes, const char *name, BShape &shape);
93        void    GetMatrixAttribute(const XML_Char **attributes, const char *name, BMatrix *matrix);
94        void    GetShapeAttribute(const XML_Char **attributes, const char *name, BShape &shape);
95        void    CheckAttributes(const XML_Char **attributes);
96        void    StartElement(const XML_Char *name, const XML_Char **attributes);
97        void    EndElement(const XML_Char *name);
98        void    CharacterDataHandler(const XML_Char *s, int len);
99
100        void    Push();
101        void    Pop();
102
103static  void    _StartElement(Svg2PictureView *view, const XML_Char *name, const XML_Char **attributes);
104static  void    _EndElement(Svg2PictureView *view, const XML_Char *name);
105static  void    _CharacterDataHandler(Svg2PictureView *view, const XML_Char *s, int len);
106
107        _state_ fState;
108        BList   fStack;
109        named_gradient *fGradient;
110        BList   fGradients;
111        BPoint  fTextPosition;
112        BString fText;
113
114	BString fFileName;
115	BPicture *fPicture;
116};
117//------------------------------------------------------------------------------
118
119#endif // _SVGVIEW_VIEW_H
120