class OutputFile { public: OutputFile(FILE* out) { outfile = out; tabs = 0; tabStr[0] = '\0'; } ~OutputFile() { if (outfile) { fflush(outfile); fclose(outfile); } } static OutputFile* CreateOutputFile(LPTSTR filename); virtual VOID GraphicsProcedure() = 0; virtual VOID GraphicsDeclaration() = 0; virtual VOID PointDeclaration(LPCTSTR pointName, Point* pts, INT count = -1) = 0; virtual VOID ColorDeclaration(LPCTSTR colorName, ARGB* argb, INT count = -1) = 0; virtual VOID RectangleDeclaration(LPCTSTR rectName, ERectangle& rect) = 0; virtual VOID Declaration(LPCTSTR type, LPCTSTR object, LPCTSTR argList, ...) = 0; // set matrix, do nothing if identity matrix virtual VOID SetPointDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, Point* pts, INT count = -1, BOOL ref = FALSE) = 0; virtual VOID SetColorDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, ARGB* colors, INT count = -1, BOOL ref = FALSE) = 0; virtual VOID SetMatrixDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, Matrix* matrix) = 0; virtual VOID SetBlendDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, REAL* blend, INT count) = 0; virtual VOID GraphicsCommand(LPCTSTR command, LPCTSTR argList, ...) = 0; virtual VOID ObjectCommand(LPCTSTR object, LPCTSTR command, LPCTSTR argList, ...) = 0; virtual VOID BeginIndent() = 0; virtual VOID EndIndent() = 0; virtual VOID BlankLine() = 0; virtual LPTSTR Ref(LPCTSTR) = 0; virtual LPTSTR RefArray(LPCTSTR refStr) = 0; virtual LPTSTR WStr(LPCTSTR) = 0; protected: FILE* outfile; INT tabs; TCHAR tabStr[MAX_PATH]; }; class CPPOutputFile : public OutputFile { public: CPPOutputFile(FILE* out) : OutputFile(out) {} virtual VOID GraphicsProcedure(); virtual VOID GraphicsDeclaration(); virtual VOID PointDeclaration(LPCTSTR pointName, Point* pts, INT count = -1); virtual VOID ColorDeclaration(LPCTSTR colorName, ARGB* argb, INT count = -1); virtual VOID RectangleDeclaration(LPCTSTR rectName, ERectangle& rect); virtual VOID Declaration(LPCTSTR type, LPCTSTR object, LPCTSTR argList, ...); // set matrix, do nothing if identity matrix virtual VOID SetPointDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, Point* pts, INT count = -1, BOOL ref = FALSE); virtual VOID SetColorDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, ARGB* colors, INT count = -1, BOOL ref = FALSE); virtual VOID SetMatrixDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, Matrix* matrix); virtual VOID SetBlendDeclaration(LPCTSTR object, LPCTSTR command, LPCTSTR varName, REAL* blend, INT count); virtual VOID GraphicsCommand(LPCTSTR command, LPCTSTR argList, ...); virtual VOID ObjectCommand(LPCTSTR object, LPCTSTR command, LPCTSTR argList, ...); virtual VOID BeginIndent(); virtual VOID EndIndent(); virtual VOID BlankLine(); // add '&' to constant virtual LPTSTR Ref(LPCTSTR refStr); // add '&' name '[x]' virtual LPTSTR RefArray(LPCTSTR refStr); // Add 'L' to constant virtual LPTSTR WStr(LPCTSTR refStr); }; class JavaOutputFile : public CPPOutputFile { public: JavaOutputFile(FILE* out) : CPPOutputFile(out) {}; }; class VMLOutputFile : public CPPOutputFile { public: VMLOutputFile(FILE* out) : CPPOutputFile(out) {}; };