diff trunk/src/Modules/Output/Graphics/Devices/GraphicsOutputDeviceCairo.h @ 397:7a573750b186

- First add of a lot of graphics code from the old version. Not working yet, not even compiling yet.
author tomwalters
date Fri, 15 Oct 2010 05:40:53 +0000
parents
children 3ee03a6b95a0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/src/Modules/Output/Graphics/Devices/GraphicsOutputDeviceCairo.h	Fri Oct 15 05:40:53 2010 +0000
@@ -0,0 +1,133 @@
+// Copyright 2007, Thomas Walters
+//
+// AIM-C: A C++ implementation of the Auditory Image Model
+// http://www.acousticscale.org/AIMC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/*!
+ * \file
+ * \brief Output device for output to a graphics file using cairo
+ *
+ * \author Tom Walters <tom@acousticscale.org> and Willem van Engen <cnbh@willem.engen.nl>
+ * \date created 2007/09/17
+ * \version \$Header: $
+ */
+
+#ifndef __GRAPHICS_OUTPUT_DEVICE_CAIRO_H__
+#define __GRAPHICS_OUTPUT_DEVICE_CAIRO_H__
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "cairo.h"
+
+#include "Modules/Output/Graphics/Devices/GraphicsOutputDevice.h"
+
+/*!
+ * \class GraphicsOutputDeviceCairo "Output/GraphicsOutputDeviceCairo.h"
+ * \brief Output class for output to a graphics file using Cairo
+ *
+ * This class outputs a graphics operation to file. It only supports 2d though,
+ * so the z-component is ignored.
+ */
+class GraphicsOutputDeviceCairo : public GraphicsOutputDevice
+{
+ public:
+  GraphicsOutputDeviceCairo(AimParameters *pParam);
+  virtual ~GraphicsOutputDeviceCairo();
+
+	/*! \brief Initializes this output device, prepares plotting tools.
+	 *  \param sDir Directory or filename where to put images, max length is
+   *         _MAX_PATH. Must end with slash!!!
+	 *  \return true on success, false on failure.
+	 *
+	 *  sDir can be either a filename, in which case the output will be
+	 *  to that file, or a directory, in which case it will be filled
+	 *  with 6-digit numbered files. A new file is then created at every
+	 *  call to gGrab().
+	 *
+	 *  As usual, make sure to call this function before any other. If this
+	 *  Initialize() failed, you shouldn't try the other functions either.
+	 */
+	bool Initialize(const char *sDir);
+	bool Initialize();
+  void gGrab();
+  void gBeginLineStrip();
+  void gBeginQuadStrip();
+	using GraphicsOutputDevice::gVertex3f; // Because we overload it
+	void gVertex3f(float x, float y, float z);
+	void gColor3f(float r, float g, float b);
+  void gEnd();
+	void gText3f(float x, float y, float z, const char *sStr, bool bRotated = false);
+	void gRelease();
+	unsigned char* GetBuffer();
+	int GetPixelFormat();
+ protected:
+  /*! \brief Internal initialisation
+   *
+   */
+  void Init();
+
+	/*! \brief Open the file with given index for output
+	 *  \param index File number to open
+	 *  \return true on success, false on error
+	 *
+	 *  This opens a file for output and sets up the plotting library.
+	 */
+	bool OpenFile(unsigned int index);
+
+	//! \brief Closes a plot output file, if any is open.
+	void CloseFile();
+
+	//! \brief Set to true if the input file can be written to
+	bool m_bOutputFile;
+	//! \brief The Cairo plotter
+	int m_iPlotHandle;
+	//! \brief Output directory
+	char m_sDir[PATH_MAX];
+	//! \brief Current file number
+	unsigned int m_iFileNumber;
+	//! \brief true if this is the first vertex after gBegin()
+	bool m_bIsFirstVertex;
+
+	enum VertexType {
+		VertexTypeNone,
+    VertexTypeLine,
+    VertexTypeQuad
+	};
+	//! \brief The current vertex type
+	VertexType m_iVertexType;
+	//! \brief Begin vertex of current quad
+	float m_aPrevX[3], m_aPrevY[3];
+	//! \brief Current number of quad vertices stored
+	unsigned int m_iPrevVertexCount;
+
+	//! \brief Whether to invert the colors or not
+	bool m_bInvertColors;
+
+  //! \brief Cairo Drawing Surface
+  cairo_surface_t *m_cSurface;
+
+  //! \brief Cairo Context
+	cairo_t *m_cCr;
+
+  //! \brief Internal store for the input filename
+	char m_sFilename[PATH_MAX];
+
+	unsigned int m_iWidth;
+	unsigned int m_iHeight;
+	bool m_bUseMemoryBuffer;
+};
+
+#endif /* __GRAPHICS_OUTPUT_DEVICE_CAIRO_H__ */