summaryrefslogtreecommitdiff
path: root/osframework/source/SexyAppFramework/Graphics.h
diff options
context:
space:
mode:
Diffstat (limited to 'osframework/source/SexyAppFramework/Graphics.h')
-rw-r--r--osframework/source/SexyAppFramework/Graphics.h200
1 files changed, 200 insertions, 0 deletions
diff --git a/osframework/source/SexyAppFramework/Graphics.h b/osframework/source/SexyAppFramework/Graphics.h
new file mode 100644
index 0000000..8b731fd
--- /dev/null
+++ b/osframework/source/SexyAppFramework/Graphics.h
@@ -0,0 +1,200 @@
+#ifndef __GRAPHICS_H__
+#define __GRAPHICS_H__
+
+#include "Common.h"
+#include "Rect.h"
+#include "Color.h"
+#include "Image.h"
+#include "TriVertex.h"
+
+namespace Sexy
+{
+
+class Font;
+class SexyMatrix3;
+class Transform;
+
+const int MAX_TEMP_SPANS = 8192;
+
+struct Edge
+{
+ double mX;
+ double mDX;
+ int i;
+ double b;
+};
+
+class Graphics;
+
+class GraphicsState
+{
+public:
+ static Image mStaticImage;
+ Image* mDestImage;
+ float mTransX;
+ float mTransY;
+ float mScaleX;
+ float mScaleY;
+ float mScaleOrigX;
+ float mScaleOrigY;
+ Rect mClipRect;
+ Color mColor;
+ Font* mFont;
+ int mDrawMode;
+ bool mColorizeImages;
+ bool mFastStretch;
+ bool mWriteColoredString;
+ bool mLinearBlend;
+ bool mIs3D;
+
+public:
+ void CopyStateFrom(const GraphicsState* theState);
+};
+
+typedef std::list<GraphicsState> GraphicsStateList;
+
+class Graphics : public GraphicsState
+{
+public:
+ enum
+ {
+ DRAWMODE_NORMAL,
+ DRAWMODE_ADDITIVE
+ };
+
+ Edge* mPFActiveEdgeList;
+ int mPFNumActiveEdges;
+ static const Point* mPFPoints;
+ int mPFNumVertices;
+
+ GraphicsStateList mStateStack;
+
+protected:
+ static int PFCompareInd(const void* u, const void* v);
+ static int PFCompareActive(const void* u, const void* v);
+ void PFDelete(int i);
+ void PFInsert(int i, int y);
+
+ void DrawImageTransformHelper(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x, float y, bool useFloat);
+
+public:
+ Graphics(const Graphics& theGraphics);
+ Graphics(Image* theDestImage = NULL);
+ virtual ~Graphics();
+
+ void PushState();
+ void PopState();
+
+ Graphics* Create();
+
+ void SetFont(Font* theFont);
+ Font* GetFont();
+
+ void SetColor(const Color& theColor);
+ const Color& GetColor();
+
+ void SetDrawMode(int theDrawMode);
+ int GetDrawMode();
+
+ void SetColorizeImages(bool colorizeImages);
+ bool GetColorizeImages();
+
+ void SetFastStretch(bool fastStretch);
+ bool GetFastStretch();
+
+ void SetLinearBlend(bool linear); // for DrawImageMatrix, DrawImageTransform, etc...
+ bool GetLinearBlend();
+
+ void FillRect(int theX, int theY, int theWidth, int theHeight);
+ void FillRect(const Rect& theRect);
+ void DrawRect(int theX, int theY, int theWidth, int theHeight);
+ void DrawRect(const Rect& theRect);
+ void ClearRect(int theX, int theY, int theWidth, int theHeight);
+ void ClearRect(const Rect& theRect);
+ void DrawString(const SexyString& theString, int theX, int theY);
+
+private:
+ bool DrawLineClipHelper(double* theStartX, double* theStartY, double *theEndX, double* theEndY);
+public:
+ void DrawLine(int theStartX, int theStartY, int theEndX, int theEndY);
+ void DrawLineAA(int theStartX, int theStartY, int theEndX, int theEndY);
+ void PolyFill(const Point *theVertexList, int theNumVertices, bool convex = false);
+ void PolyFillAA(const Point *theVertexList, int theNumVertices, bool convex = false);
+
+ void DrawImage(Image* theImage, int theX, int theY);
+ void DrawImage(Image* theImage, int theX, int theY, const Rect& theSrcRect);
+ void DrawImage(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect);
+ void DrawImage(Image* theImage, int theX, int theY, int theStretchedWidth, int theStretchedHeight);
+ void DrawImageF(Image* theImage, float theX, float theY);
+ void DrawImageF(Image* theImage, float theX, float theY, const Rect& theSrcRect);
+
+ void DrawImageMirror(Image* theImage, int theX, int theY, bool mirror = true);
+ void DrawImageMirror(Image* theImage, int theX, int theY, const Rect& theSrcRect, bool mirror = true);
+ void DrawImageMirror(Image* theImage, const Rect& theDestRect, const Rect& theSrcRect, bool mirror = true);
+
+ void DrawImageRotated(Image* theImage, int theX, int theY, double theRot, const Rect *theSrcRect = NULL);
+ void DrawImageRotated(Image* theImage, int theX, int theY, double theRot, int theRotCenterX, int theRotCenterY, const Rect *theSrcRect = NULL);
+ void DrawImageRotatedF(Image* theImage, float theX, float theY, double theRot, const Rect *theSrcRect = NULL);
+ void DrawImageRotatedF(Image* theImage, float theX, float theY, double theRot, float theRotCenterX, float theRotCenterY, const Rect *theSrcRect = NULL);
+
+ void DrawImageMatrix(Image* theImage, const SexyMatrix3 &theMatrix, float x = 0, float y = 0);
+ void DrawImageMatrix(Image* theImage, const SexyMatrix3 &theMatrix, const Rect &theSrcRect, float x = 0, float y = 0);
+ void DrawImageTransform(Image* theImage, const Transform &theTransform, float x = 0, float y = 0);
+ void DrawImageTransform(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x = 0, float y = 0);
+ void DrawImageTransformF(Image* theImage, const Transform &theTransform, float x = 0, float y = 0);
+ void DrawImageTransformF(Image* theImage, const Transform &theTransform, const Rect &theSrcRect, float x = 0, float y = 0);
+ void DrawTriangleTex(Image *theTexture, const TriVertex &v1, const TriVertex &v2, const TriVertex &v3);
+ void DrawTrianglesTex(Image *theTexture, const TriVertex theVertices[][3], int theNumTriangles);
+
+ void DrawImageCel(Image* theImageStrip, int theX, int theY, int theCel);
+ void DrawImageCel(Image* theImageStrip, const Rect& theDestRect, int theCel);
+ void DrawImageCel(Image* theImageStrip, int theX, int theY, int theCelCol, int theCelRow);
+ void DrawImageCel(Image* theImageStrip, const Rect& theDestRect, int theCelCol, int theCelRow);
+
+ void DrawImageAnim(Image* theImageAnim, int theX, int theY, int theTime);
+
+ void ClearClipRect();
+ void SetClipRect(int theX, int theY, int theWidth, int theHeight);
+ void SetClipRect(const Rect& theRect);
+ void ClipRect(int theX, int theY, int theWidth, int theHeight);
+ void ClipRect(const Rect& theRect);
+ void Translate(int theTransX, int theTransY);
+ void TranslateF(float theTransX, float theTransY);
+
+ // In progress: Only affects DrawImage
+ void SetScale(float theScaleX, float theScaleY, float theOrigX, float theOrigY);
+
+ int StringWidth(const SexyString& theString);
+ void DrawImageBox(const Rect& theDest, Image* theComponentImage);
+ void DrawImageBox(const Rect& theSrc, const Rect& theDest, Image* theComponentImage);
+
+ int WriteString(const SexyString& theString, int theX, int theY, int theWidth = -1, int theJustification = 0, bool drawString = true, int theOffset = 0, int theLength = -1, int theOldColor = -1);
+ int WriteWordWrapped(const Rect& theRect, const SexyString& theLine, int theLineSpacing = -1, int theJustification = -1, int *theMaxWidth = NULL, int theMaxChars = -1, int* theLastWidth = NULL);
+ int DrawStringColor(const SexyString& theString, int theX, int theY, int theOldColor = -1); //works like DrawString but can have color tags like ^ff0000^.
+ int DrawStringWordWrapped(const SexyString& theLine, int theX, int theY, int theWrapWidth = 10000000, int theLineSpacing = -1, int theJustification = -1, int *theMaxWidth = NULL); //works like DrawString but also word wraps
+ int GetWordWrappedHeight(int theWidth, const SexyString& theLine, int theLineSpacing = -1, int *theMaxWidth = NULL);
+
+ bool Is3D() { return mIs3D; }
+};
+
+class GraphicsAutoState
+{
+public:
+ Graphics* mG;
+
+public:
+
+ GraphicsAutoState(Graphics* theG) : mG(theG)
+ {
+ mG->PushState();
+ }
+
+ ~GraphicsAutoState()
+ {
+ mG->PopState();
+ }
+};
+
+}
+
+#endif //__GRAPHICS_H__