aboutsummaryrefslogtreecommitdiff
path: root/engines/sword25/gfx/image/vectorimage.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sword25/gfx/image/vectorimage.h')
-rwxr-xr-xengines/sword25/gfx/image/vectorimage.h167
1 files changed, 167 insertions, 0 deletions
diff --git a/engines/sword25/gfx/image/vectorimage.h b/engines/sword25/gfx/image/vectorimage.h
new file mode 100755
index 0000000000..74f6c860d9
--- /dev/null
+++ b/engines/sword25/gfx/image/vectorimage.h
@@ -0,0 +1,167 @@
+// -----------------------------------------------------------------------------
+// This file is part of Broken Sword 2.5
+// Copyright (c) Malte Thiesen, Daniel Queteschiner and Michael Elsdörfer
+//
+// Broken Sword 2.5 is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// Broken Sword 2.5 is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Broken Sword 2.5; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+// -----------------------------------------------------------------------------
+
+#ifndef BS_VECTORIMAGE_H
+#define BS_VECTORIMAGE_H
+
+// -----------------------------------------------------------------------------
+// Includes
+// -----------------------------------------------------------------------------
+
+#include "kernel/common.h"
+#include "gfx/image/image.h"
+#include "math/rect.h"
+
+#include <vector>
+#include "agg_path_storage.h"
+#include "agg_color_rgba.h"
+
+
+class BS_VectorImage;
+
+/**
+ @brief Pfadinformationen zu BS_VectorImageElement Objekten
+
+ Jedes BS_VectorImageElement besteht aus Kantenzügen, oder auch Pfaden. Jeder dieser Pfad hat Eigenschaften, die in Objekten diesen Typs
+ gespeichert werden.
+*/
+
+class BS_VectorPathInfo
+{
+public:
+ BS_VectorPathInfo(unsigned int ID, unsigned int LineStyle, unsigned int FillStyle0, unsigned int FillStyle1) :
+ m_ID(ID), m_LineStyle(LineStyle), m_FillStyle0(FillStyle0), m_FillStyle1(FillStyle1) {};
+
+ unsigned int GetID() const { return m_ID; }
+ unsigned int GetLineStyle() const { return m_LineStyle; }
+ unsigned int GetFillStyle0() const { return m_FillStyle0; }
+ unsigned int GetFillStyle1() const { return m_FillStyle1; }
+
+private:
+ unsigned int m_ID;
+ unsigned int m_LineStyle;
+ unsigned int m_FillStyle0;
+ unsigned int m_FillStyle1;
+};
+
+
+/**
+ @brief Ein Element eines Vektorbild. Ein BS_VectorImage besteht aus diesen Elementen, die jeweils einen Teil der Graphik definieren.
+ Werden alle Elemente eines Vektorbildes übereinandergelegt, ergibt sich das komplette Bild.
+*/
+class BS_VectorImageElement
+{
+friend BS_VectorImage;
+public:
+ const agg::path_storage & GetPaths() const { return m_Paths; }
+ unsigned int GetPathCount() const { return m_PathInfos.size(); }
+ const BS_VectorPathInfo & GetPathInfo(unsigned int PathNr) const { BS_ASSERT(PathNr < GetPathCount()); return m_PathInfos[PathNr]; }
+
+ double GetLineStyleWidth(unsigned int LineStyle) const
+ {
+ BS_ASSERT(LineStyle < m_LineStyles.size());
+ return m_LineStyles[LineStyle].Width;
+ }
+
+ unsigned int GetLineStyleCount() const { return m_LineStyles.size(); }
+
+ const agg::rgba8 & GetLineStyleColor(unsigned int LineStyle) const
+ {
+ BS_ASSERT(LineStyle < m_LineStyles.size());
+ return m_LineStyles[LineStyle].Color;
+ }
+
+ unsigned int GetFillStyleCount() const { return m_FillStyles.size(); }
+
+ const agg::rgba8 & GetFillStyleColor(unsigned int FillStyle) const
+ {
+ BS_ASSERT(FillStyle < m_FillStyles.size());
+ return m_FillStyles[FillStyle];
+ }
+
+ const BS_Rect & GetBoundingBox() const { return m_BoundingBox; }
+
+private:
+ struct LineStyleType
+ {
+ LineStyleType(double Width_, const agg::rgba8 & Color_) : Width(Width_), Color(Color_) {};
+ double Width;
+ agg::rgba8 Color;
+ };
+
+ agg::path_storage m_Paths;
+ std::vector<BS_VectorPathInfo> m_PathInfos;
+ std::vector<LineStyleType> m_LineStyles;
+ std::vector<agg::rgba8> m_FillStyles;
+ BS_Rect m_BoundingBox;
+};
+
+
+/**
+ @brief Eine Vektorgraphik
+
+ Objekte dieser Klasse enthalten die Informationen eines SWF-Shapes.
+*/
+
+class BS_VectorImage : public BS_Image
+{
+public:
+ BS_VectorImage(const unsigned char * pFileData, unsigned int FileSize, bool & Success);
+
+ unsigned int GetElementCount() const { return m_Elements.size(); }
+ const BS_VectorImageElement & GetElement(unsigned int ElementNr) const
+ {
+ BS_ASSERT(ElementNr < m_Elements.size());
+ return m_Elements[ElementNr];
+ }
+ const BS_Rect & GetBoundingBox() const { return m_BoundingBox; }
+
+ //
+ // Die abstrakten Methoden von BS_Image
+ //
+ virtual int GetWidth() const { return m_BoundingBox.GetWidth(); }
+ virtual int GetHeight() const { return m_BoundingBox.GetHeight(); }
+ virtual BS_GraphicEngine::COLOR_FORMATS GetColorFormat() const { return BS_GraphicEngine::CF_ARGB32; }
+ virtual bool Fill(const BS_Rect* pFillRect = 0, unsigned int Color = BS_RGB(0, 0, 0));
+ virtual unsigned int GetPixel(int X, int Y);
+ virtual bool IsBlitSource() const { return true; }
+ virtual bool IsBlitTarget() const { return false; }
+ virtual bool IsScalingAllowed() const { return true; }
+ virtual bool IsFillingAllowed() const { return false; }
+ virtual bool IsAlphaAllowed() const { return true; }
+ virtual bool IsColorModulationAllowed() const { return true; }
+ virtual bool IsSetContentAllowed() const { return false; }
+ virtual bool SetContent(const std::vector<unsigned char> & Pixeldata, unsigned int Offset, unsigned int Stride);
+ virtual bool Blit(int PosX = 0, int PosY = 0,
+ int Flipping = FLIP_NONE,
+ BS_Rect* pPartRect = NULL,
+ unsigned int Color = BS_ARGB(255, 255, 255, 255),
+ int Width = -1, int Height = -1);
+
+ class SWFBitStream;
+
+private:
+ bool ParseDefineShape(unsigned int ShapeType, SWFBitStream & bs);
+ bool ParseStyles(unsigned int ShapeType, SWFBitStream & bs, unsigned int & NumFillBits, unsigned int & NumLineBits);
+
+ std::vector<BS_VectorImageElement> m_Elements;
+ BS_Rect m_BoundingBox;
+};
+
+#endif