/* * Copyright (C) 2012 Advanced Software Engineering Limited. * * This file is part of the ChartDirector software. Usage of this file is * subjected to the ChartDirector license agreement. See the LICENSE.TXT * file that comes with the ChartDirector software release, or visit * Advanced Software Engineering's web site at www.advsofteng.com or * email to support@advsofteng.com for information. * */ #ifndef CCHARTDIR_HDR #define CCHARTDIR_HDR #include #include "bchartdir.h" #include "memblock.h" class AutoDestroy { public : virtual ~AutoDestroy() {} }; class GarbagePtr { private : AutoDestroy *ptr; public : GarbagePtr(AutoDestroy *ptr, GarbagePtr *next) : ptr(ptr), next(next) {} ~GarbagePtr() { delete ptr; } GarbagePtr *next; }; class GarbageContainer { private : GarbagePtr *root; public : GarbageContainer() : root(0) {} virtual ~GarbageContainer() { while (0 != root) { GarbagePtr *temp = root; root = root->next; delete temp; } } void reg(AutoDestroy *g) { root = new GarbagePtr(g, root); } }; // // Utility to convert from WCHAR string to UTF8 string // class WCHARtoUTF8 { public : WCHARtoUTF8(const wchar_t *w_string) : utf8_string(0) { if (0 == w_string) utf8_string = 0; else { int string_len = 0; while (w_string[string_len]) ++string_len; char *ptr = utf8_string = new char[string_len * 3 + 1]; for (int w = *w_string; w != 0; w = *(++w_string)) { // only support 16 bit unicode int uw = w & 0xffff; if (uw < 0x80) *(ptr++) = (char)uw; else if (uw < 0x800) { *(ptr++) = (char)(0xC0 | (uw >> 6)); *(ptr++) = (char)(0x80 | (uw & 0x3F)); } else { *(ptr++) = (char)(0xE0 | (uw >> 12)); *(ptr++) = (char)(0x80 | ((uw >> 6) & 0x3F)); *(ptr++) = (char)(0x80 | (uw & 0x3F)); } } *ptr = 0; } } operator const char*() { return utf8_string; } ~WCHARtoUTF8() { delete[] utf8_string; } private : char *utf8_string; //disable assignment WCHARtoUTF8(const WCHARtoUTF8 &rhs); WCHARtoUTF8 &operator=(const WCHARtoUTF8 &rhs); }; // // Utility to convert from UTF8 string to WCHAR string // class UTF8toWCHAR { public : UTF8toWCHAR(const char *utf8_string) : w_string(0) { if (0 == utf8_string) w_string = 0; else { int string_len = 0; while (utf8_string[string_len]) ++string_len; wchar_t *ptr = w_string = new wchar_t[string_len + 1]; for (int i = 0; i < string_len; ++i) { int c = utf8_string[i]; if (((c & 0xf0) == 0xe0) && (i + 2 < string_len)) { *ptr = (wchar_t)(((c & 0xf) << 12) | ((utf8_string[++i] & 0x3f) << 6)); *ptr = (*ptr) | (utf8_string[++i] & 0x3f); ++ptr; } else if (((c & 0xe0) == 0xc0) && (i + 1 < string_len)) *(ptr++) = (wchar_t)(((c & 0x1f) << 6) | ((utf8_string[++i] & 0x3f) << 6)); else *(ptr++) = (wchar_t)c; } *ptr = 0; } } operator const wchar_t*() { return w_string; } ~UTF8toWCHAR() { delete[] w_string; } private : wchar_t *w_string; //disable assignment UTF8toWCHAR(const UTF8toWCHAR &rhs); UTF8toWCHAR &operator=(const UTF8toWCHAR &rhs); }; /////////////////////////////////////////////////////////////////////////////////////// // constants /////////////////////////////////////////////////////////////////////////////////////// namespace Chart { static const double NoValue = 1.7e308; static const double LogTick = 1.6e308; static const double LinearTick = 1.5e308; static const double TickInc = 1.0e200; static const double MinorTickOnly = -1.7e308; static const double MicroTickOnly = -1.6e308; enum { AutoGrid = -2 }; static const double TouchBar = -1.7E-100; static const double DataBound = -1.7E-100; enum Alignment { TopLeft = 7, TopCenter = 8, TopRight = 9, Left = 4, Center = 5, Right = 6, BottomLeft = 1, BottomCenter = 2, BottomRight = 3, Top = TopCenter, Bottom = BottomCenter, TopLeft2 = 10, TopRight2 = 11, BottomLeft2 = 12, BottomRight2 = 13 }; enum { DashLine = 0x0505, DotLine = 0x0202, DotDashLine = 0x05050205, AltDashLine = 0x0A050505 }; static const int goldGradient[] = {0, 0xFFE743, 0x60, 0xFFFFE0, 0xB0, 0xFFF0B0, 0x100, 0xFFE743}; static const int silverGradient[] = {0, 0xC8C8C8, 0x60, 0xF8F8F8, 0xB0, 0xE0E0E0, 0x100, 0xC8C8C8}; static const int redMetalGradient[] = {0, 0xE09898, 0x60, 0xFFF0F0, 0xB0, 0xF0D8D8, 0x100, 0xE09898}; static const int blueMetalGradient[] = {0, 0x9898E0, 0x60, 0xF0F0FF, 0xB0, 0xD8D8F0, 0x100, 0x9898E0}; static const int greenMetalGradient[] = {0, 0x98E098, 0x60, 0xF0FFF0, 0xB0, 0xD8F0D8, 0x100, 0x98E098}; static inline int metalColor(int c, int angle = 90) { return CChart_metalColor(c, angle); } static inline int goldColor(int angle = 90) { return metalColor(0xffee44, angle); } static inline int silverColor(int angle = 90) { return metalColor(0xdddddd, angle); } static inline int brushedMetalColor(int c, int texture = 2, int angle = 90) { return metalColor(c, angle) | ((texture & 0x3) << 18); } static inline int brushedSilverColor(int texture = 2, int angle = 90) {return brushedMetalColor(0xdddddd, texture, angle); } static inline int brushedGoldColor(int texture = 2, int angle = 90) {return brushedMetalColor(0xffee44, texture, angle); } enum AntiAliasMode { NoAntiAlias, AntiAlias, AutoAntiAlias, ClearType, CompatAntiAlias = 6 }; enum PaletteMode { TryPalette, ForcePalette, NoPalette }; enum DitherMethod { Quantize, OrderedDither, ErrorDiffusion }; enum CDFilterType { BoxFilter, LinearFilter, QuadraticFilter, BSplineFilter, HermiteFilter, CatromFilter, MitchellFilter, SincFilter, LanczosFilter, GaussianFilter, HanningFilter, HammingFilter, BlackmanFilter, BesselFilter }; enum { Transparent = 0xff000000, Palette = 0xffff0000, BackgroundColor = 0xffff0000, LineColor = 0xffff0001, TextColor = 0xffff0002, DataColor = 0xffff0008, SameAsMainColor = 0xffff0007 }; enum ImgFormat { PNG, GIF, JPG, WMP, BMP, SVG, SVGZ }; static const int oldDefaultPalette[] = { 0xffffff, 0x000000, 0x000000, 0x808080, 0x808080, 0x808080, 0x808080, 0x808080, 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x66ffff, 0xffcc33, 0xcccccc, 0x9966ff, 0x339966, 0x999900, 0xcc3300, 0x99cccc, 0x006600, 0x660066, 0xcc9999, -1 }; static const int defaultPalette[] = { 0xffffff, 0x000000, 0x000000, 0x808080, 0x808080, 0x808080, 0x808080, 0x808080, 0xff3333, 0x33ff33, 0x6666ff, 0xffff00, 0xff66ff, 0x99ffff, 0xffcc33, 0xcccccc, 0xcc9999, 0x339966, 0x999900, 0xcc3300, 0x669999, 0x993333, 0x006600, 0x990099, 0xff9966, 0x99ff99, 0x9999ff, 0xcc6600, 0x33cc33, 0xcc99ff, 0xff6666, 0x99cc66, 0x009999, 0xcc3333, 0x9933ff, 0xff0000, 0x0000ff, 0x00ff00, 0xffcc99, 0x999999, -1 }; static const int whiteOnBlackPalette[] = { 0x000000, 0xffffff, 0xffffff, 0x808080, 0x808080, 0x808080, 0x808080, 0x808080, 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xff00ff, 0x66ffff, 0xffcc33, 0xcccccc, 0x9966ff, 0x339966, 0x999900, 0xcc3300, 0x99cccc, 0x006600, 0x660066, 0xcc9999, 0xff9966, 0x99ff99, 0x9999ff, 0xcc6600, 0x33cc33, 0xcc99ff, 0xff6666, 0x99cc66, 0x009999, 0xcc3333, 0x9933ff, 0xff0000, 0x0000ff, 0x00ff00, 0xffcc99, 0x999999, -1 }; static const int transparentPalette[] = { 0xffffff, 0x000000, 0x000000, 0x808080, 0x808080, 0x808080, 0x808080, 0x808080, 0x80ff0000, 0x8000ff00, 0x800000ff, 0x80ffff00, 0x80ff00ff, 0x8066ffff, 0x80ffcc33, 0x80cccccc, 0x809966ff, 0x80339966, 0x80999900, 0x80cc3300, 0x8099cccc, 0x80006600, 0x80660066, 0x80cc9999, 0x80ff9966, 0x8099ff99, 0x809999ff, 0x80cc6600, 0x8033cc33, 0x80cc99ff, 0x80ff6666, 0x8099cc66, 0x80009999, 0x80cc3333, 0x809933ff, 0x80ff0000, 0x800000ff, 0x8000ff00, 0x80ffcc99, 0x80999999, -1 }; enum { SideLayout, CircleLayout }; enum { DefaultShading = 0, FlatShading = 1, LocalGradientShading = 2, GlobalGradientShading = 3, ConcaveShading = 4, RoundedEdgeNoGlareShading = 5, RoundedEdgeShading = 6, RadialShading = 7, RingShading = 8 }; enum SymbolType { NoSymbol = 0, SquareSymbol = 1, DiamondSymbol = 2, TriangleSymbol = 3, RightTriangleSymbol = 4, LeftTriangleSymbol = 5, InvertedTriangleSymbol = 6, CircleSymbol = 7, CrossSymbol = 8, Cross2Symbol = 9, ChartDir_PolygonSymbol = 11, ChartDir_Polygon2Symbol = 12, ChartDir_StarSymbol = 13, ChartDir_CustomSymbol = 14 }; enum { NoShape = 0, SquareShape = 1, DiamondShape = 2, TriangleShape = 3, RightTriangleShape = 4, LeftTriangleShape = 5, InvertedTriangleShape = 6, CircleShape = 7, CircleShapeNoShading = 10, GlassSphereShape = 15, GlassSphere2Shape = 16, SolidSphereShape = 17 }; static inline int CrossShape(double width = 0.5) { return CrossSymbol | (((int)(((width < 0) ? 0 : ((width > 1) ? 1 : width)) * 4095 + 0.5)) << 12); } static inline int Cross2Shape(double width = 0.5) { return Cross2Symbol | (((int)(((width < 0) ? 0 : ((width > 1) ? 1 : width)) * 4095 + 0.5)) << 12); } static inline int PolygonShape(int side) { return ChartDir_PolygonSymbol | (((side < 0) ? 0 : ((side > 100) ? 100 : side)) << 12); } static inline int Polygon2Shape(int side) { return ChartDir_Polygon2Symbol | (((side < 0) ? 0 : ((side > 100) ? 100 : side)) << 12); } static inline int StarShape(int side) { return ChartDir_StarSymbol | (((side < 0) ? 0 : ((side > 100) ? 100 : side)) << 12); } enum DataCombineMethod { Overlay, Stack, Depth, Side, Percentage }; enum LegendMode { NormalLegend, ReverseLegend, NoLegend }; enum ScaleType { PixelScale, XAxisScale, YAxisScale, EndPoints, AngularAxisScale = XAxisScale, RadialAxisScale = YAxisScale }; enum { MonotonicNone = 0, MonotonicX = 1, MonotonicY = 2, MonotonicXY = 3, MonotonicAuto = 4 }; enum { ConstrainedLinearRegression = 0, LinearRegression = 1, ExponentialRegression = -1, LogarithmicRegression = -2 }; static inline int PolynomialRegression(int n) { return n; } enum { HLOCDefault, HLOCOpenClose, HLOCUpDown }; enum { DiamondPointer, TriangularPointer, ArrowPointer, ArrowPointer2, LinePointer, PencilPointer }; enum { SmoothShading = 0, TriangularShading = 1, RectangularShading = 2, TriangularFrame = 3, RectangularFrame = 4 }; enum { ChartBackZ = 0x100, ChartFrontZ = 0xffff, PlotAreaZ = 0x1000, GridLinesZ = 0x2000 }; enum { XAxisSymmetric = 1, XAxisSymmetricIfNeeded = 2, YAxisSymmetric = 4, YAxisSymmetricIfNeeded = 8, XYAxisSymmetric = 16, XYAxisSymmetricIfNeeded = 32 }; enum { XAxisAtOrigin = 1, YAxisAtOrigin = 2, XYAxisAtOrigin = 3 }; enum { ChartDir_StartOfHourFilterTag = 1, ChartDir_StartOfDayFilterTag = 2, ChartDir_StartOfWeekFilterTag = 3, ChartDir_StartOfMonthFilterTag = 4, ChartDir_StartOfYearFilterTag = 5, ChartDir_RegularSpacingFilterTag = 6, ChartDir_AllPassFilterTag = 7, ChartDir_NonePassFilterTag = 8, ChartDir_SelectItemFilterTag = 9 }; static inline int StartOfHourFilter(int labelStep = 1, double initialMargin = 0.05) { return CChart_encodeFilter(ChartDir_StartOfHourFilterTag, labelStep, initialMargin); } static inline int StartOfDayFilter(int labelStep = 1, double initialMargin = 0.05) { return CChart_encodeFilter(ChartDir_StartOfDayFilterTag, labelStep, initialMargin); } static inline int StartOfWeekFilter(int labelStep = 1, double initialMargin = 0.05) { return CChart_encodeFilter(ChartDir_StartOfWeekFilterTag, labelStep, initialMargin); } static inline int StartOfMonthFilter(int labelStep = 1, double initialMargin = 0.05) { return CChart_encodeFilter(ChartDir_StartOfMonthFilterTag, labelStep, initialMargin); } static inline int StartOfYearFilter(int labelStep = 1, double initialMargin = 0.05) { return CChart_encodeFilter(ChartDir_StartOfYearFilterTag, labelStep, initialMargin); } static inline int RegularSpacingFilter(int labelStep = 1, int initialMargin = 0) { return CChart_encodeFilter(ChartDir_RegularSpacingFilterTag, labelStep, initialMargin / 4095.0); } static inline int AllPassFilter() { return CChart_encodeFilter(ChartDir_AllPassFilterTag, 0, 0); } static inline int NonePassFilter() { return CChart_encodeFilter(ChartDir_NonePassFilterTag, 0, 0); } static inline int SelectItemFilter(int item) { return CChart_encodeFilter(ChartDir_SelectItemFilterTag, item, 0); } static inline int getVersion() { return CChart_getVersion(); } static inline const char *getDescription() { return CChart_getDescription(); } static inline const char *getCopyright() { return CChart_getCopyright(); } static inline void getBootLog(char *buffer) { CChart_getBootLog(buffer); } static inline bool testFont(const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, char *buffer) { return CChart_testFont(font, fontIndex, fontHeight, fontWidth, angle, buffer); } static inline bool isLicensed() { return CChart_isLicensed(); } static inline bool getLicenseAttr(const char *key, char *buffer) { return CChart_getLicenseAttr(key, buffer); } static inline bool setLicenseFile(const char *filename = 0, char *buffer = 0) { return CChart_setLicenseFile(filename, buffer); } static inline bool setLicenseCode(const char *licCode, char *buffer = 0) { return CChart_setLicenseCode(licCode, buffer); } static inline double chartTime(int y, int m, int d, int h = 0, int n = 0, int s = 0) { return CChart_chartTime(y, m, d, h, n, s); } static inline double chartTime2(int t) { return CChart_chartTime2(t); } static inline int getChartYMD(double t) { return CChart_getChartYMD(t); } static inline int getChartWeekDay(double t) { return ((int)(t / 86400 + 1)) % 7; } enum { NormalGlare = 3, ReducedGlare = 2, NoGlare = 1 }; static inline int glassEffect(int glareSize = Chart::NormalGlare, int glareDirection = Chart::Top, int raisedEffect = 5) { return CChart_glassEffect(glareSize, glareDirection, raisedEffect); } static inline int softLighting(int direction = Chart::Top, int raisedEffect = 4) { return CChart_softLighting(direction, raisedEffect); } static inline int barLighting(double startBrightness = 0.75, double endBrightness = 1.5) { return CChart_barLighting(startBrightness, endBrightness); } static inline int cylinderEffect(int orientation = Chart::Center, double ambientIntensity = 0.5, double diffuseIntensity = 0.5, double specularIntensity = 0.75, int shininess = 8) { return CChart_cylinderEffect(orientation, ambientIntensity, diffuseIntensity, specularIntensity, shininess); } enum { AggregateSum = 0, AggregateAvg = 1, AggregateStdDev = 2, AggregateMin = 3, AggregateMed = 4, AggregateMax = 5, AggregatePercentile = 6, AggregateFirst = 7, AggregateLast = 8, AggregateCount = 9 }; enum { DirectionHorizontal = 0, DirectionVertical = 1, DirectionHorizontalVertical = 2 }; // // Ver 5.1 // static inline double bSearch(DoubleArray a, double v) { return CChart_bSearch(a.data, a.len, v); } static inline int ClearTypeMono(double gamma = 0) { return CChart_ClearTypeMono(gamma); } static inline int ClearTypeColor(double gamma = 0) { return CChart_ClearTypeColor(gamma); } static inline int phongLighting(double ambientIntensity = 0.5, double diffuseIntensity = 0.5, double specularIntensity = 0.75, int shininess = 8) { return CChart_phongLighting(ambientIntensity, diffuseIntensity, specularIntensity, shininess); } } //namespace Chart /////////////////////////////////////////////////////////////////////////////////////// // Class wrappers /////////////////////////////////////////////////////////////////////////////////////// class TTFText { private : //disable copying TTFText(const TTFText &rhs); TTFText &operator=(const TTFText &rhs); TTFTextInternal *ptr; public : //obsoleted - for compatibility only enum AntiAliasMode { NoAntiAlias, AntiAlias, AutoAntiAlias }; //obsoleted - for compatibility only static void destroy(TTFText *t) { t->destroy(); } TTFText(TTFTextInternal *ptr) : ptr(ptr) {} ~TTFText() { CTTFText_destroy(ptr); } void destroy() { delete this; } int getWidth() const { return CTTFText_getWidth(ptr); } int getHeight() const { return CTTFText_getHeight(ptr); } int getLineHeight() const { return CTTFText_getLineHeight(ptr); } int getLineDistance() const { return CTTFText_getLineDistance(ptr); } void draw(int x, int y, int color, int alignment = Chart::TopLeft) const { CTTFText_draw(ptr, x, y, color, alignment); } }; class DrawArea : public AutoDestroy { private : //disable copying DrawArea(const DrawArea &rhs); DrawArea &operator=(const DrawArea &rhs); DrawAreaInternal *ptr; bool own_this; public : //obsoleted constants - for compatibility only enum PaletteMode { TryPalette, ForcePalette, NoPalette }; //obsoleted constants - for compatibility only enum DitherMethod { Quantize, OrderedDither, ErrorDiffusion }; DrawArea() : ptr(CDrawArea_create()), own_this(true) {} static DrawArea* create() { return new DrawArea(); } DrawArea(DrawAreaInternal *ptr) : ptr(ptr), own_this(false) {} ~DrawArea() { if (own_this) CDrawArea_destroy(ptr); } void destroy() { delete this; } DrawAreaInternal *getInternalPtr() { return ptr; } const DrawAreaInternal *getInternalPtr() const { return ptr; } void enableVectorOutput() { CDrawArea_enableVectorOutput(ptr); } void setSize(int width, int height, int bgColor = 0xffffff) { CDrawArea_setSize(ptr, width, height, bgColor); } void resize(int newWidth, int newHeight, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_resize(ptr, newWidth, newHeight, filter, blur); } int getWidth() const { return CDrawArea_getWidth(ptr); } int getHeight() const { return CDrawArea_getHeight(ptr); } void setClipRect(int left, int top, int right, int bottom) { CDrawArea_setClipRect(ptr, left, top, right, bottom); } void setBgColor(int c) { CDrawArea_setBgColor(ptr, c); } void move(double xOffset, double yOffset, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_move(ptr, xOffset, yOffset, bgColor, filter, blur); } void rotate(double angle, int bgColor = 0xffffff, double cx = -1, double cy = -1, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_rotate(ptr, angle, bgColor, cx, cy, filter, blur); } void hFlip() { CDrawArea_hFlip(ptr); } void vFlip() { CDrawArea_vFlip(ptr); } void clone(DrawArea *d, int x, int y, int align, int newWidth = -1, int newHeight = -1, int filter = Chart::LinearFilter, double blur = 1) const { CDrawArea_clone(ptr, d->ptr, x, y, align, newWidth, newHeight, filter, blur); } void pixel(int x, int y, int c) { CDrawArea_pixel(ptr, x, y, c); } int getPixel(int x, int y) const { return CDrawArea_getPixel(ptr, x, y); } void hline(int x1, int x2, int y, int c) { CDrawArea_hline(ptr, x1, x2, y, c); } void vline(int y1, int y2, int x, int c) { CDrawArea_vline(ptr, y1, y2, x, c); } void line(double x1, double y1, double x2, double y2, int c, int lineWidth = 1) { CDrawArea_line(ptr, x1, y1, x2, y2, c, lineWidth); } void arc(int cx, int cy, int rx, int ry, double a1, double a2, int c) { CDrawArea_arc(ptr, cx, cy, rx, ry, a1, a2, c); } void rect(int x1, int y1, int x2, int y2, int edgeColor, int fillColor, int raisedEffect = 0) { CDrawArea_rect(ptr, x1, y1, x2, y2, edgeColor, fillColor, raisedEffect); } void polygon(const int *x, const int *y, int noOfPoints, int edgeColor, int fillColor) { polygon(IntArray(x, noOfPoints), IntArray(y, noOfPoints), edgeColor, fillColor); } void polygon(IntArray x, IntArray y, int edgeColor, int fillColor) { CDrawArea_polygon2(ptr, x.data, x.len, y.data, y.len, edgeColor, fillColor); } void polygon(DoubleArray x, DoubleArray y, int edgeColor, int fillColor) { CDrawArea_polygon(ptr, x.data, x.len, y.data, y.len, edgeColor, fillColor); } void surface(double x1, double y1, double x2, double y2, int depthX, int depthY, int edgeColor, int fillColor) { CDrawArea_surface(ptr, x1, y1, x2, y2, depthX, depthY, edgeColor, fillColor); } void sector(int cx, int cy, int rx, int ry, double a1, double a2, int edgeColor, int fillColor) { CDrawArea_sector(ptr, cx, cy, rx, ry, a1, a2, edgeColor, fillColor); } void cylinder(int cx, int cy, int rx, int ry, double a1, double a2, int depthX, int depthY, int edgeColor, int fillColor) { CDrawArea_cylinder(ptr, cx, cy, rx, ry, a1, a2, depthX, depthY, edgeColor, fillColor); } void circle(int cx, int cy, int rx, int ry, int edgeColor, int fillColor) { CDrawArea_circle(ptr, cx, cy, rx, ry, edgeColor, fillColor); } void ringSector(int cx, int cy, int rx, int ry, int rx2, int ry2, double a1, double a2, int edgeColor, int fillColor) { CDrawArea_ringSector(ptr, cx, cy, rx, ry, rx2, ry2, a1, a2, edgeColor, fillColor); } void ring(int cx, int cy, int rx, int ry, int rx2, int ry2, int edgeColor, int fillColor) { CDrawArea_ring(ptr, cx, cy, rx, ry, rx2, ry2, edgeColor, fillColor); } void fill(int x, int y, int color) { CDrawArea_fill(ptr, x, y, color); } void fill(int x, int y, int color, int borderColor) { CDrawArea_fill2(ptr, x, y, color, borderColor); } void text(const char *str, const char *font, double fontSize, int x, int y, int color) { CDrawArea_text(ptr, str, font, fontSize, x, y, color); } void text(const wchar_t *str, const char *font, double fontSize, int x, int y, int color) { CDrawArea_textw(ptr, str, font, fontSize, x, y, color); } void text(const char *str, const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, bool vertical, int x, int y, int color, int alignment = Chart::TopLeft) { CDrawArea_text2(ptr, str, font, fontIndex, fontHeight, fontWidth, angle, vertical, x, y, color, alignment); } void text(const wchar_t *str, const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, bool vertical, int x, int y, int color, int alignment = Chart::TopLeft) { CDrawArea_text2w(ptr, str, font, fontIndex, fontHeight, fontWidth, angle, vertical, x, y, color, alignment); } TTFText* text(const char *str, const char *font, double fontSize) { return new TTFText(CDrawArea_text3(ptr, str, font, fontSize)); } TTFText* text(const wchar_t *str, const char *font, double fontSize) { return new TTFText(CDrawArea_text3w(ptr, str, font, fontSize)); } TTFText* text(const wchar_t *text, const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, bool vertical) { return new TTFText(CDrawArea_text4w(ptr, text, font, fontIndex, fontHeight, fontWidth, angle, vertical)); } TTFText* text(const char *text, const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, bool vertical) { return new TTFText(CDrawArea_text4(ptr, text, font, fontIndex, fontHeight, fontWidth, angle, vertical)); } void close(TTFText *text) { delete text; } void merge(const DrawArea *d, int x, int y, int align, int transparency) { CDrawArea_merge(ptr, d->ptr, x, y, align, transparency); } void tile(const DrawArea *d, int transparency) { CDrawArea_tile(ptr, d->ptr, transparency); } void setSearchPath(const char *path) { CDrawArea_setSearchPath(ptr, path); } bool loadGIF(const char *filename) { return CDrawArea_loadGIF(ptr, filename); } bool loadPNG(const char *filename) { return CDrawArea_loadPNG(ptr, filename); } bool loadJPG(const char *filename) { return CDrawArea_loadJPG(ptr, filename); } bool loadWMP(const char *filename) { return CDrawArea_loadWMP(ptr, filename); } bool load(const char *filename) { return CDrawArea_load(ptr, filename); } void rAffineTransform(double a, double b, double c, double d, double e, double f, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_rAffineTransform(ptr, a, b, c, d, e, f, bgColor, filter, blur); } void affineTransform(double a, double b, double c, double d, double e, double f, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_affineTransform(ptr, a, b, c, d, e, f, bgColor, filter, blur); } void sphereTransform(int xDiameter, int yDiameter, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_sphereTransform(ptr, xDiameter, yDiameter, bgColor, filter, blur); } void hCylinderTransform(int yDiameter, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_hCylinderTransform(ptr, yDiameter, bgColor, filter, blur); } void vCylinderTransform(int xDiameter, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_vCylinderTransform(ptr, xDiameter, bgColor, filter, blur); } void vTriangleTransform(int tHeight = -1, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_vTriangleTransform(ptr, tHeight, bgColor, filter, blur); } void hTriangleTransform(int tWidth = -1, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_hTriangleTransform(ptr, tWidth, bgColor, filter, blur); } void shearTransform(double xShear, double yShear = 0, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_shearTransform(ptr, xShear, yShear, bgColor, filter, blur); } void waveTransform(int period, double amplitude, double direction = 0, double startAngle = 0, bool longitudinal = false, int bgColor = 0xffffff, int filter = Chart::LinearFilter, double blur = 1) { CDrawArea_waveTransform(ptr, period, amplitude, direction, startAngle, longitudinal, bgColor, filter, blur); } bool out(const char *filename) { return CDrawArea_out(ptr, filename); } bool outGIF(const char *filename) { return CDrawArea_outGIF(ptr, filename); } bool outPNG(const char *filename) { return CDrawArea_outPNG(ptr, filename); } bool outJPG(const char *filename, int quality = 80) { return CDrawArea_outJPG(ptr, filename, quality); } bool outWMP(const char *filename) { return CDrawArea_outWMP(ptr, filename); } bool outBMP(const char *filename) { return CDrawArea_outBMP(ptr, filename); } bool outSVG(const char *filename, const char *options = 0) { return CDrawArea_outSVG(ptr, filename, options); } bool outGIF(const char **data, int *len) { return CDrawArea_outGIF2(ptr, data, len); } bool outPNG(const char **data, int *len) { return CDrawArea_outPNG2(ptr, data, len); } bool outJPG(const char **data, int *len, int quality = 80) { return CDrawArea_outJPG2(ptr, data, len, quality); } bool outWMP(const char **data, int *len) { return CDrawArea_outWMP2(ptr, data, len); } bool outBMP(const char **data, int *len) { return CDrawArea_outBMP2(ptr, data, len); } MemBlock outGIF() { const char *data; int len; outGIF(&data, &len); return MemBlock(data, len); } MemBlock outPNG() { const char *data; int len; outPNG(&data, &len); return MemBlock(data, len); } MemBlock outJPG(int quality = 80) { const char *data; int len; outJPG(&data, &len, quality); return MemBlock(data, len); } MemBlock outWMP() { const char *data; int len; outWMP(&data, &len); return MemBlock(data, len); } MemBlock outBMP() { const char *data; int len; outBMP(&data, &len); return MemBlock(data, len); } MemBlock outSVG2(const char *options = 0) { const char *data; int len; CDrawArea_outSVG2(ptr, &data, &len, options); return MemBlock(data, len); } MemBlock outSVG() { return outSVG2(); } void setPaletteMode(int p) { CDrawArea_setPaletteMode(ptr, p); } void setDitherMethod(int m) { CDrawArea_setDitherMethod(ptr, m); } void setTransparentColor(int c) { CDrawArea_setTransparentColor(ptr, c); } void setAntiAliasText(int a) { CDrawArea_setAntiAliasText(ptr, a); } void setAntiAlias(bool shapeAntiAlias = true, int textAntiAlias = Chart::AutoAntiAlias) { CDrawArea_setAntiAlias(ptr, shapeAntiAlias, textAntiAlias); } void setInterlace(bool i) { CDrawArea_setInterlace(ptr, i); } void setColorTable(const int *colors, int noOfColors, int offset) { CDrawArea_setColorTable(ptr, colors, noOfColors, offset); } void setColorTable(IntArray colors, int offset) { setColorTable(colors.data, colors.len, offset); } int getARGBColor(int c) { return CDrawArea_getARGBColor(ptr, c); } int halfColor(int c) { return CDrawArea_halfColor(ptr, c); } int adjustBrightness(int c, double brightness) { return CDrawArea_adjustBrightness(ptr, c, brightness); } int dashLineColor(int color, int patternCode = Chart::DashLine) { return CDrawArea_dashLineColor(ptr, color, patternCode); } int patternColor(const int *c, int w, int h, int startX = 0, int startY = 0) { return patternColor(IntArray(c, w * h), startX, startY); } int patternColor(IntArray colorArray, int height, int startX = 0, int startY = 0) { return CDrawArea_patternColor(ptr, colorArray.data, colorArray.len, height, startX, startY); } int patternColor(const char *filename, int startX = 0, int startY = 0) { return CDrawArea_patternColor2(ptr, filename, startX, startY); } int gradientColor(int startX, int startY, int endX, int endY, int startColor, int endColor) { return CDrawArea_gradientColor(ptr, startX, startY, endX, endY, startColor, endColor); } int gradientColor(IntArray colorArray, double angle = 90, double scale = 1.0, int startX = 0, int startY = 0) { return CDrawArea_gradientColor2(ptr, colorArray.data, colorArray.len, angle, scale, startX, startY); } int gradientColor(const int *c, double angle = 90, double scale = 1, int startX = 0, int startY = 0) { return CDrawArea_gradientColor2a(ptr, c, angle, scale, startX, startY); } int linearGradientColor(int startX, int startY, int endX, int endY, int startColor, int endColor, bool periodic = false) { return CDrawArea_linearGradientColor(ptr, startX, startY, endX, endY, startColor, endColor, periodic); } int linearGradientColor(int startX, int startY, int endX, int endY, IntArray c, bool periodic = false) { return CDrawArea_linearGradientColor2(ptr, startX, startY, endX, endY, c.data, c.len, periodic); } int radialGradientColor(int cx, int cy, int rx, int ry, int startColor, int endColor, bool periodic = false) { return CDrawArea_radialGradientColor(ptr, cx, cy, rx, ry, startColor, endColor, periodic); } int radialGradientColor(int cx, int cy, int rx, int ry, IntArray c, bool periodic = false) { return CDrawArea_radialGradientColor2(ptr, cx, cy, rx, ry, c.data, c.len, periodic); } int reduceColors(int colorCount, bool blackAndWhite = false) { return CDrawArea_reduceColors(ptr, colorCount, blackAndWhite); } void setDefaultFonts(const char *normal, const char *bold = 0, const char *italic = 0, const char *boldItalic = 0) { CDrawArea_setDefaultFonts(ptr, normal, bold, italic, boldItalic); } void setFontTable(int index, const char *font) { CDrawArea_setFontTable(ptr, index, font); } // // Ver 5.1 // void initDynamicLayer() { CDrawArea_initDynamicLayer(ptr); } void removeDynamicLayer(bool keepOriginal = false) { CDrawArea_removeDynamicLayer(ptr, keepOriginal); } }; class DrawObj : public AutoDestroy { private : //disable copying DrawObj(const DrawObj &rhs); DrawObj &operator=(const DrawObj &rhs); DrawObjInternal *ptr; public : DrawObj(DrawObjInternal *ptr) : ptr(ptr) {} void destroy() { delete this; } DrawObjInternal *getInternalPtr() { return ptr; } void setZOrder(int z) { CDrawObj_setZOrder(ptr, z); } void paint(DrawArea *d) { CDrawObj_paint(ptr, d->getInternalPtr()); } }; class Box : public DrawObj { private : //disable copying Box(const Box &rhs); Box &operator=(const Box &rhs); BoxInternal *ptr; public : Box(BoxInternal *ptr) : DrawObj(Box2DrawObj(ptr)), ptr(ptr) {} ~Box() {} void setPos(int x, int y) { CBox_setPos(ptr, x, y); } void setSize(int w, int h) { CBox_setSize(ptr, w, h); } void setBackground(int color, int edgeColor = -1, int raisedEffect = 0) { CBox_setBackground(ptr, color, edgeColor, raisedEffect); } void setRoundedCorners(int r1 = 10, int r2 = -1, int r3 = -1, int r4 = -1) { CBox_setRoundedCorners(ptr, r1, r2, r3, r4); } int getLeftX() const { return CBox_getLeftX(ptr); } int getTopY() const { return CBox_getTopY(ptr); } int getWidth() const { return CBox_getWidth(ptr); } int getHeight() const { return CBox_getHeight(ptr); } const char *getImageCoor(int offsetX = 0, int offsetY = 0) { return CBox_getImageCoor(ptr, offsetX, offsetY); } }; class TextBox : public Box { private : //disable copying TextBox(const TextBox &rhs); TextBox &operator=(const TextBox &rhs); TextBoxInternal *ptr; public : TextBox(TextBoxInternal *ptr) : Box(TextBox2Box(ptr)), ptr(ptr) {} ~TextBox() {} void setText(const char *text) { CTextBox_setText(ptr, text); } void setAlignment(int a) { CTextBox_setAlignment(ptr, a); } void setFontStyle(const char *font, int fontIndex = 0) { CTextBox_setFontStyle(ptr, font, fontIndex); } void setFontSize(double fontHeight, double fontWidth = 0) { CTextBox_setFontSize(ptr, fontHeight, fontWidth); } void setFontAngle(double angle, bool vertical = false) { CTextBox_setFontAngle(ptr, angle, vertical); } void setFontColor(int color) { CTextBox_setFontColor(ptr, color); } void setMargin(int m) { CTextBox_setMargin(ptr, m); } void setMargin(int leftMargin, int rightMargin, int topMargin, int bottomMargin) { CTextBox_setMargin2(ptr, leftMargin, rightMargin, topMargin, bottomMargin); } void setWidth(int width) { CTextBox_setWidth(ptr, width); } void setHeight(int height) { CTextBox_setHeight(ptr, height); } void setMaxWidth(int maxWidth) { CTextBox_setMaxWidth(ptr, maxWidth); } void setTruncate(int maxWidth, int maxLines = 1) { CTextBox_setTruncate(ptr, maxWidth, maxLines); } }; //for compatibility with ChartDirector Ver 1.5 C++ code typedef TextBox TextStyle; class Line : public DrawObj { private : //disable copying Line(const Line &rhs); Line &operator=(const Line &rhs); LineInternal *ptr; public : Line(LineInternal *ptr) : DrawObj(Line2DrawObj(ptr)), ptr(ptr) {} ~Line() {} void setPos(int x1, int y1, int x2, int y2) { CLine_setPos(ptr, x1, y1, x2, y2); } void setColor(int c) { CLine_setColor(ptr, c); } void setWidth(int w) { CLine_setWidth(ptr, w); }; }; class CDMLTable : public DrawObj, protected GarbageContainer { private : //disable copying CDMLTable(const CDMLTable &rhs); CDMLTable &operator=(const CDMLTable &rhs); CDMLTableInternal *ptr; TextBox *makeTextBox(TextBoxInternal *p) { if (!p) return 0; TextBox *ret = new TextBox(p); reg(ret); return ret; } public : CDMLTable(CDMLTableInternal *ptr) : DrawObj(CDMLTable2DrawObj(ptr)), ptr(ptr) {} ~CDMLTable() {} void setPos(int x, int y, int alignment = Chart::TopLeft) { CCDMLTable_setPos(ptr, x, y, alignment); } TextBox *insertCol(int col) { return makeTextBox(CCDMLTable_insertCol(ptr, col)); } TextBox *appendCol() { return makeTextBox(CCDMLTable_appendCol(ptr)); } int getColCount() const { return CCDMLTable_getColCount(ptr); } TextBox *insertRow(int row) { return makeTextBox(CCDMLTable_insertRow(ptr, row)); } TextBox *appendRow() { return makeTextBox(CCDMLTable_appendRow(ptr)); } int getRowCount() const { return CCDMLTable_getRowCount(ptr); } TextBox *setText(int col, int row, const char *text) { return makeTextBox(CCDMLTable_setText(ptr, col, row, text)); } TextBox *setCell(int col, int row, int width, int height, const char *text) { return makeTextBox(CCDMLTable_setCell(ptr, col, row, width, height, text)); } TextBox *getCell(int col, int row) { return makeTextBox(CCDMLTable_getCell(ptr, col, row)); } TextBox *getColStyle(int col) { return makeTextBox(CCDMLTable_getColStyle(ptr, col)); } TextBox *getRowStyle(int row) { return makeTextBox(CCDMLTable_getRowStyle(ptr, row)); } TextBox *getStyle() { return makeTextBox(CCDMLTable_getStyle(ptr)); } void layout() { CCDMLTable_layout(ptr); } int getColWidth(int col) const { return CCDMLTable_getColWidth(ptr, col); } int getRowHeight(int row) const { return CCDMLTable_getRowHeight(ptr, row); } int getWidth() const { return CCDMLTable_getWidth(ptr); } int getHeight() const { return CCDMLTable_getHeight(ptr); } }; class LegendBox : public TextBox { private : //disable copying LegendBox(const LegendBox &rhs); LegendBox &operator=(const LegendBox &rhs); LegendBoxInternal *ptr; public : LegendBox(LegendBoxInternal *ptr) : TextBox(LegendBox2TextBox(ptr)), ptr(ptr) {} ~LegendBox() {} void setCols(int noOfCols) { CLegendBox_setCols(ptr, noOfCols); } void setReverse(bool b = true) { CLegendBox_setReverse(ptr, b); } void setLineStyleKey(bool b = true) { CLegendBox_setLineStyleKey(ptr, b); } void addKey(const char *text, int color, int lineWidth = 0, const DrawArea *drawarea = 0) { CLegendBox_addKey(ptr, text, color, lineWidth, drawarea ? drawarea->getInternalPtr() : 0); } void addKey(int pos, const char *text, int color, int lineWidth = 0, const DrawArea *drawarea = 0) { CLegendBox_addKey2(ptr, pos, text, color, lineWidth, drawarea ? drawarea->getInternalPtr() : 0); } void setKeySize(int width, int height = -1, int gap = -1) { CLegendBox_setKeySize(ptr, width, height, gap); } void setKeySpacing(int keySpacing, int lineSpacing = -1) { CLegendBox_setKeySpacing(ptr, keySpacing, lineSpacing); } void setKeyBorder(int edgeColor, int raisedEffect = 0) { CLegendBox_setKeyBorder(ptr, edgeColor, raisedEffect); } const char *getImageCoor(int dataItem, int offsetX = 0, int offsetY = 0) { return CLegendBox_getImageCoor(ptr, dataItem, offsetX, offsetY); } const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) { return CLegendBox_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } }; class BaseChart : protected GarbageContainer { private : //disable copying BaseChart(const BaseChart &rhs); BaseChart &operator=(const BaseChart &rhs); BaseChartInternal *ptr; int *refCount; DrawArea *dynamicLayerCache; public : //obsoleted constants - for compatibility only enum ImgFormat {PNG, GIF, JPG, WMP}; BaseChart() : ptr(0), refCount(new int), dynamicLayerCache(0) { *refCount = 1; } BaseChart(BaseChart *rhs) : ptr(rhs->ptr), refCount(rhs->refCount), dynamicLayerCache(0) { ++(*refCount); } void init(BaseChartInternal *ptr) { this->ptr = ptr; } ~BaseChart() { if (--(*refCount) == 0) { CBaseChart_destroy(ptr); delete refCount; } } void destroy() { delete this; } BaseChartInternal *getInternalPtr() { return ptr; } const BaseChartInternal *getInternalPtr() const { return ptr; } void enableVectorOutput() { CBaseChart_enableVectorOutput(ptr); } ////////////////////////////////////////////////////////////////////////////////////// // set overall chart ////////////////////////////////////////////////////////////////////////////////////// void setSize(int width, int height) { CBaseChart_setSize(ptr, width, height); } int getWidth() const { return CBaseChart_getWidth(ptr); } int getHeight() const { return CBaseChart_getHeight(ptr); } void setBackground(int color, int edgeColor = Chart::Transparent, int raisedEffect = 0) { CBaseChart_setBackground(ptr, color, edgeColor, raisedEffect); } void setBorder(int color) //deprecated - use setBackground { CBaseChart_setBorder(ptr, color); } void setRoundedFrame(int extColor = 0xffffff, int r1 = 10, int r2 = -1, int r3 = -1, int r4 = -1) { CBaseChart_setRoundedFrame(ptr, extColor, r1, r2, r3, r4); } void setWallpaper(const char *img) { CBaseChart_setWallpaper(ptr, img); } void setBgImage(const char *img, int align = Chart::Center) { CBaseChart_setBgImage(ptr, img, align); } void setDropShadow(int color = 0xaaaaaa, int offsetX = 5, int offsetY = 0x7fffffff, int blurRadius = 5) { CBaseChart_setDropShadow(ptr, color, offsetX, offsetY, blurRadius) ; } void setTransparentColor(int c) { CBaseChart_setTransparentColor(ptr, c); } void setAntiAlias(bool shapeAntiAlias = true, int textAntiAlias = Chart::AutoAntiAlias) { CBaseChart_setAntiAlias(ptr, shapeAntiAlias, textAntiAlias); } void setSearchPath(const char *path) { CBaseChart_setSearchPath(ptr, path); } TextBox *addTitle(const char *text, const char *font = 0, double fontSize = 12, int fontColor = Chart::TextColor, int bgColor = Chart::Transparent, int edgeColor = Chart::Transparent) { TextBox *ret = new TextBox(CBaseChart_addTitle(ptr, text, font, fontSize, fontColor, bgColor, edgeColor)); reg(ret); return ret;} TextBox *addTitle(int alignment, const char *text, const char *font = 0, double fontSize = 12, int fontColor = Chart::TextColor, int bgColor = Chart::Transparent, int edgeColor = Chart::Transparent) { TextBox *ret = new TextBox(CBaseChart_addTitle2(ptr, alignment, text, font, fontSize, fontColor, bgColor, edgeColor)); reg(ret); return ret; } LegendBox *addLegend(int x, int y, bool vertical = true, const char *font = 0, double fontSize = 10) { LegendBox *ret = new LegendBox(CBaseChart_addLegend(ptr, x, y, vertical, font, fontSize)); reg(ret); return ret; } LegendBox *addLegend2(int x, int y, int noOfCols, const char *font = 0, double fontSize = 10) { LegendBox *ret = new LegendBox(CBaseChart_addLegend2(ptr, x, y, noOfCols, font, fontSize)); reg(ret); return ret; } LegendBox *getLegend() { LegendBox *ret = new LegendBox(CBaseChart_getLegend(ptr)); reg(ret); return ret; } ////////////////////////////////////////////////////////////////////////////////////// // drawing primitives ////////////////////////////////////////////////////////////////////////////////////// DrawArea *getDrawArea() { DrawArea *ret = new DrawArea(CBaseChart_getDrawArea(ptr)); reg(ret); return ret; } TextBox *addText(int x, int y, const char *text, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, int alignment = Chart::TopLeft, double angle = 0, bool vertical = false) { TextBox *ret = new TextBox(CBaseChart_addText(ptr, x, y, text, font, fontSize, fontColor, alignment, angle, vertical)); reg(ret); return ret; } Line *addLine(int x1, int y1, int x2, int y2, int color = Chart::LineColor, int lineWidth = 1) { Line *ret = new Line(CBaseChart_addLine(ptr, x1, y1, x2, y2, color, lineWidth)); reg(ret); return ret; } CDMLTable *addTable(int x, int y, int alignment, int col, int row) { CDMLTable *ret = new CDMLTable(CBaseChart_addTable(ptr, x, y, alignment, col, row)); reg(ret); return ret; } void addExtraField(StringArray texts) { CBaseChart_addExtraField(ptr, texts.data, texts.len); } void addExtraField(DoubleArray numbers) { CBaseChart_addExtraField2(ptr, numbers.data, numbers.len); } ////////////////////////////////////////////////////////////////////////////////////// // color management methods ////////////////////////////////////////////////////////////////////////////////////// void setColor(int paletteEntry, int color) { setColors(paletteEntry, IntArray(&color, 1)); } void setColors(int paletteEntry, const int *colors) { for (int i = 0; i < 0xffff; ++i) if (colors[i] == -1) { setColors(paletteEntry, IntArray(colors, i)); return; } } void setColors(int paletteEntry, IntArray colors) { CBaseChart_setColors(ptr, paletteEntry, colors.data, colors.len); } void setColors(const int *colors) { setColors(0, colors); } void setColors(IntArray colors) { setColors(0, colors); } int getColor(int paletteEntry) { return CBaseChart_getColor(ptr, paletteEntry); } int halfColor(int c) { return CBaseChart_halfColor(ptr, c); } int adjustBrightness(int c, double brightness) { return CBaseChart_adjustBrightness(ptr, c, brightness); } int dashLineColor(int color, int patternCode = Chart::DashLine) { return CBaseChart_dashLineColor(ptr, color, patternCode); } int patternColor(const int *c, int w, int h, int startX = 0, int startY = 0) { return patternColor(IntArray(c, w * h), startX, startY); } int patternColor(IntArray colorArray, int height, int startX = 0, int startY = 0) { return CBaseChart_patternColor(ptr, colorArray.data, colorArray.len, height, startX, startY); } int patternColor(const char *filename, int startX = 0, int startY = 0) { return CBaseChart_patternColor2(ptr, filename, startX, startY); } int gradientColor(int startX, int startY, int endX, int endY, int startColor, int endColor) { return CBaseChart_gradientColor(ptr, startX, startY, endX, endY, startColor, endColor); } int gradientColor(IntArray colorArray, double angle = 90, double scale = 1.0, int startX = 0, int startY = 0) { return CBaseChart_gradientColor2(ptr, colorArray.data, colorArray.len, angle, scale, startX, startY); } int gradientColor(const int *c, double angle = 90, double scale = 1, int startX = 0, int startY = 0) { return CBaseChart_gradientColor2a(ptr, c, angle, scale, startX, startY); } int linearGradientColor(int startX, int startY, int endX, int endY, int startColor, int endColor, bool periodic = false) { return CBaseChart_linearGradientColor(ptr, startX, startY, endX, endY, startColor, endColor, periodic); } int linearGradientColor(int startX, int startY, int endX, int endY, IntArray c, bool periodic = false) { return CBaseChart_linearGradientColor2(ptr, startX, startY, endX, endY, c.data, c.len, periodic); } int radialGradientColor(int cx, int cy, int rx, int ry, int startColor, int endColor, bool periodic = false) { return CBaseChart_radialGradientColor(ptr, cx, cy, rx, ry, startColor, endColor, periodic); } int radialGradientColor(int cx, int cy, int rx, int ry, IntArray c, bool periodic = false) { return CBaseChart_radialGradientColor2(ptr, cx, cy, rx, ry, c.data, c.len, periodic); } ////////////////////////////////////////////////////////////////////////////////////// // locale support ////////////////////////////////////////////////////////////////////////////////////// void setDefaultFonts(const char *normal, const char *bold = 0, const char *italic = 0, const char *boldItalic = 0) { CBaseChart_setDefaultFonts(ptr, normal, bold, italic, boldItalic); } void setFontTable(int index, const char *font) { CBaseChart_setFontTable(ptr, index, font); } void setNumberFormat(char thousandSeparator = '~', char decimalPointChar = '.', char signChar = '-') { CBaseChart_setNumberFormat(ptr, thousandSeparator, decimalPointChar, signChar); } void setMonthNames(StringArray names) { CBaseChart_setMonthNames(ptr, names.data, names.len); } void setWeekDayNames(StringArray names) { CBaseChart_setWeekDayNames(ptr, names.data, names.len); } void setAMPM(const char *am, const char *pm) { CBaseChart_setAMPM(ptr, am, pm); } const char *formatValue(double value, const char *formatString) { return CBaseChart_formatValue(ptr, value, formatString); } ////////////////////////////////////////////////////////////////////////////////////// // chart creation methods ////////////////////////////////////////////////////////////////////////////////////// LegendBox *layoutLegend() { LegendBox *ret = new LegendBox(CBaseChart_layoutLegend(ptr)); reg(ret); return ret; } void layout() { CBaseChart_layout(ptr); } bool makeChart(const char *filename) { return CBaseChart_makeChart(ptr, filename); } bool makeChart(int format, const char **data, int *len) { return CBaseChart_makeChart2(ptr, format, data, len); } MemBlock makeChart(int format) { const char *data; int len; makeChart(format, &data, &len); return MemBlock(data, len); } DrawArea *makeChart() { DrawArea *ret = new DrawArea(CBaseChart_makeChart3(ptr)); reg(ret); return ret; } ////////////////////////////////////////////////////////////////////////////////////// // image map support ////////////////////////////////////////////////////////////////////////////////////// const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) { return CBaseChart_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } const char *getChartMetrics() { return CBaseChart_getChartMetrics(ptr); } // // Ver 5.1 // int getAbsOffsetX() const { return CBaseChart_getAbsOffsetX(ptr); } int getAbsOffsetY() const { return CBaseChart_getAbsOffsetY(ptr); } DrawArea *initDynamicLayer() { DrawAreaInternal *retPtr = CBaseChart_initDynamicLayer(ptr); if ((0 == dynamicLayerCache) || (retPtr != dynamicLayerCache->getInternalPtr())) { dynamicLayerCache = new DrawArea(retPtr); reg(dynamicLayerCache); } return dynamicLayerCache; } void removeDynamicLayer() { CBaseChart_removeDynamicLayer(ptr); } const char *getJsChartModel(const char *options = 0) { return CBaseChart_getJsChartModel(ptr, options); } }; class MultiChart : public BaseChart { private : //disable copying MultiChart(const MultiChart &rhs); MultiChart &operator=(const MultiChart &rhs); MultiChartInternal *ptr; const BaseChart *mainChart; BaseChart **charts; int chartCount; int maxChartCount; public : MultiChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) : mainChart(0), charts(0), chartCount(0), maxChartCount(0) { ptr = CMultiChart_create(width, height, bgColor, edgeColor, raisedEffect); init(MultiChart2BaseChart(ptr)); mainChart = 0; } static MultiChart *create(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { return new MultiChart(width, height, bgColor, edgeColor, raisedEffect); } ~MultiChart() { delete[] charts; } void addChart(int x, int y, BaseChart *c) { if (0 != c) { CMultiChart_addChart(ptr, x, y, c->getInternalPtr()); if (chartCount == maxChartCount) { maxChartCount = (maxChartCount < 10) ? 10 : maxChartCount * 2; BaseChart **temp = new BaseChart*[maxChartCount]; for (int i = 0; i < chartCount; ++i) temp[i] = charts[i]; delete[] charts; charts = temp; } charts[chartCount++] = c; } } BaseChart *getChart(int i = 0) { if (i == -1) return (BaseChart *)mainChart; if ((i >= 0) && (i < chartCount)) return charts[i]; return 0; } int getChartCount() { return chartCount; } void setMainChart(const BaseChart *c) { CMultiChart_setMainChart(ptr, c->getInternalPtr()); mainChart = c;} }; class Sector : public AutoDestroy, protected GarbageContainer { private : //disable copying Sector(const Sector &rhs); Sector &operator=(const Sector &rhs); SectorInternal *ptr; public : Sector(SectorInternal *ptr) : ptr(ptr) {} ~Sector() {} void setExplode(int distance = -1) { CSector_setExplode(ptr, distance); } void setLabelFormat(const char *formatString) { CSector_setLabelFormat(ptr, formatString); } TextBox *setLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor) { TextBox *ret = new TextBox(CSector_setLabelStyle(ptr, font, fontSize, fontColor)); reg(ret); return ret;} void setLabelPos(int pos, int joinLineColor = -1) { CSector_setLabelPos(ptr, pos, joinLineColor); } void setLabelLayout(int layoutMethod, int pos = -1) { CSector_setLabelLayout(ptr, layoutMethod, pos); } void setJoinLine(int joinLineColor, int joinLineWidth = 1) { CSector_setJoinLine(ptr, joinLineColor, joinLineWidth); } void setColor(int color, int edgeColor = -1, int joinLineColor = -1) { CSector_setColor(ptr, color, edgeColor, joinLineColor); } void setStyle(int shadingMethod, int edgeColor = -1, int edgeWidth = -1) { CSector_setStyle(ptr, shadingMethod, edgeColor, edgeWidth); } const char *getImageCoor(int offsetX = 0, int offsetY = 0) { return CSector_getImageCoor(ptr, offsetX, offsetY); } const char *getLabelCoor(int offsetX = 0, int offsetY = 0) { return CSector_getLabelCoor(ptr, offsetX, offsetY); } }; class PieChart : public BaseChart { private : //disable copying PieChart(const PieChart &rhs); PieChart &operator=(const PieChart &rhs); PieChartInternal *ptr; public : PieChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CPieChart_create(width, height, bgColor, edgeColor, raisedEffect); init(PieChart2BaseChart(ptr)); } static PieChart *create(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { return new PieChart(width, height, bgColor, edgeColor, raisedEffect); } void setPieSize(int x, int y, int r) { CPieChart_setPieSize(ptr, x, y, r); } void setDonutSize(int x, int y, int r, int r2) { CPieChart_setDonutSize(ptr, x, y, r, r2); } void set3D(int depth = -1, double angle = -1, bool shadowMode = false) { CPieChart_set3D(ptr, depth, angle, shadowMode); } void set3D(DoubleArray depths, double angle = 45, bool shadowMode = false) { CPieChart_set3D2(ptr, depths.data, depths.len, angle, shadowMode); } void setSectorStyle(int shadingMethod, int edgeColor = -1, int edgeWidth = -1) { CPieChart_setSectorStyle(ptr, shadingMethod, edgeColor, edgeWidth); } void setStartAngle(double startAngle, bool clockWise = true) { CPieChart_setStartAngle(ptr, startAngle, clockWise); } void setExplode(int sectorNo = -1, int distance = -1) { CPieChart_setExplode(ptr, sectorNo, distance); } void setExplodeGroup(int startSector, int endSector, int distance = -1) { CPieChart_setExplodeGroup(ptr, startSector, endSector, distance); } void setLabelFormat(const char *formatString) { CPieChart_setLabelFormat(ptr, formatString); } TextBox *setLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor) { TextBox *ret = new TextBox(CPieChart_setLabelStyle(ptr, font, fontSize, fontColor)); reg(ret); return ret;} void setLabelPos(int pos, int joinLineColor = -1) { CPieChart_setLabelPos(ptr, pos, joinLineColor); } void setLabelLayout(int layoutMethod, int pos = -1, int topBound = -1, int bottomBound = -1) { CPieChart_setLabelLayout(ptr, layoutMethod, pos, topBound, bottomBound); } void setJoinLine(int joinLineColor, int joinLineWidth = 1) { CPieChart_setJoinLine(ptr, joinLineColor, joinLineWidth); } void setLineColor(int edgeColor, int joinLineColor = -1) { CPieChart_setLineColor(ptr, edgeColor, joinLineColor); } void setData(int noOfPoints, const double *data, const char* const* labels = 0) { setData(DoubleArray(data, noOfPoints), StringArray(labels, labels ? noOfPoints : 0)); } void setData(DoubleArray data, StringArray labels = StringArray()) { CPieChart_setData(ptr, data.data, data.len, labels.data, labels.len); } Sector *getSector(int sectorNo) { SectorInternal *p = CPieChart_sector(ptr, sectorNo); if (!p) return 0; Sector *ret = new Sector(p); reg(ret); return ret; } Sector *sector(int sectorNo) { return getSector(sectorNo); } }; class LineObj; class Mark : public TextBox { private : //disable copying Mark(const Mark &rhs); Mark &operator=(const Mark &rhs); MarkInternal *ptr; public : Mark(MarkInternal *ptr) : TextBox(Mark2TextBox(ptr)), ptr(ptr) {} ~Mark() {} void setValue(double value) { CMark_setValue(ptr, value); } void setMarkColor(int lineColor, int textColor = -1, int tickColor = -1) { CMark_setMarkColor(ptr, lineColor, textColor, tickColor); } void setLineWidth(int w) { CMark_setLineWidth(ptr, w); } void setDrawOnTop(bool b) { CMark_setDrawOnTop(ptr, b); } LineObj *getLine() { return (LineObj *)CMark_getLine(ptr); } }; class Axis : public AutoDestroy, protected GarbageContainer { private : //disable copying Axis(const Axis &rhs); Axis &operator=(const Axis &rhs); AxisInternal *ptr; public : Axis(AxisInternal *ptr) : ptr(ptr) {} ~Axis() {} AxisInternal *getInternalPtr() { return ptr; } const AxisInternal *getInternalPtr() const { return ptr; } TextBox *setLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CAxis_setLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret; } void setLabelFormat(const char *formatString) { CAxis_setLabelFormat(ptr, formatString); } void setLabelGap(int d) { CAxis_setLabelGap(ptr, d); } void setMultiFormat(int filter1, const char *format1, int filter2, const char *format2, int labelSpan = 1, bool promoteFirst = true) { CAxis_setMultiFormat(ptr, filter1, format1, filter2, format2, labelSpan, promoteFirst); } void setMultiFormat(int filterId, const char *formatString, int labelSpan = 1, bool promoteFirst = true) { CAxis_setMultiFormat2(ptr, filterId, formatString, labelSpan, promoteFirst); } void setFormatCondition(const char *condition, double operand = 0) { CAxis_setFormatCondition(ptr, condition, operand); } TextBox *setTitle(const char *text, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor) { TextBox *ret = new TextBox(CAxis_setTitle(ptr, text, font, fontSize, fontColor)); reg(ret); return ret; } void setTitlePos(int alignment, int titleGap = 3) { CAxis_setTitlePos(ptr, alignment, titleGap); } void setColors(int axisColor, int labelColor = Chart::TextColor, int titleColor = -1, int tickColor = -1) { CAxis_setColors(ptr, axisColor, labelColor, titleColor, tickColor); } void setTickLength(int majorTickLen) { CAxis_setTickLength(ptr, majorTickLen); } void setTickLength(int majorTickLen, int minorTickLen) { CAxis_setTickLength2(ptr, majorTickLen, minorTickLen); } void setTickWidth(int majorTickWidth, int minorTickWidth = -1) { CAxis_setTickWidth(ptr, majorTickWidth, minorTickWidth); } void setTickColor(int majorTickColor, int minorTickColor = -1) { CAxis_setTickColor(ptr, majorTickColor, minorTickColor); } void setWidth(int width) { CAxis_setWidth(ptr, width); } void setLength(int length) { CAxis_setLength(ptr, length); } void setOffset(int x, int y) { CAxis_setOffset(ptr, x, y); } void setAngle(double startAngle) { CAxis_setAngle(ptr, startAngle); } void setTopMargin(int topMargin) //obsoleted - use setMargin(int, int) { setMargin(topMargin); } void setMargin(int topMargin, int bottomMargin = 0) { CAxis_setMargin(ptr, topMargin, bottomMargin); } void setIndent(bool indent) { CAxis_setIndent(ptr, indent); } void setTickOffset(double offset) { CAxis_setTickOffset(ptr, offset); } void setLabelOffset(double offset) { CAxis_setLabelOffset(ptr, offset); } void setAutoScale(double topExtension = 0.1, double bottomExtension = 0.1, double zeroAffinity = 0.8) { CAxis_setAutoScale(ptr, topExtension, bottomExtension, zeroAffinity); } void setRounding(bool roundMin, bool roundMax) { CAxis_setRounding(ptr, roundMin, roundMax); } void setTickDensity(int majorTickSpacing, int minorTickSpacing = -1) { CAxis_setTickDensity(ptr, majorTickSpacing, minorTickSpacing); } void setReverse(bool b = true) { CAxis_setReverse(ptr, b); } void setMinTickInc(double inc) { CAxis_setMinTickInc(ptr, inc); } TextBox *setLabels(int noOfLabels, const char* const* text) //obsoleted - use setLabels(StringArray) { return setLabels(StringArray(text, noOfLabels)); } TextBox *setLabels(StringArray labels) { TextBox *ret = new TextBox(CAxis_setLabels(ptr, labels.data, labels.len)); reg(ret); return ret; } TextBox *setLabels(DoubleArray labels, const char *formatString = 0) { TextBox *ret = new TextBox(CAxis_setLabels2(ptr, labels.data, labels.len, formatString)); reg(ret); return ret; } CDMLTable *makeLabelTable() { CDMLTable *ret = new CDMLTable(CAxis_makeLabelTable(ptr)); reg(ret); return ret; } CDMLTable *getLabelTable() { CDMLTableInternal *p = CAxis_getLabelTable(ptr); if (!p) return 0; CDMLTable *ret = new CDMLTable(p); reg(ret); return ret; } void setLabelStep(int majorTickStep, int minorTickStep = 0, int majorTickOffset = 0, int minorTickOffset = -0x7fffffff) { CAxis_setLabelStep(ptr, majorTickStep, minorTickStep, majorTickOffset, minorTickOffset); } void setLinearScale(const char *formatString = 0) { CAxis_setLinearScale3(ptr, formatString); } void setLinearScale(double lowerLimit, double upperLimit, StringArray labels) { CAxis_setLinearScale2(ptr, lowerLimit, upperLimit, labels.data, labels.len); } void setLinearScale(double lowerLimit, double upperLimit, double majorTickInc = 0, double minorTickInc = 0) { CAxis_setLinearScale(ptr, lowerLimit, upperLimit, majorTickInc, minorTickInc); } void setLogScale(bool logScale) //obsoleted - use setLogScale(const char *)/setLinearScale(const char *) { if (logScale) setLogScale(); else setLinearScale(); } void setLogScale(const char *formatString = 0) { CAxis_setLogScale3(ptr, formatString); } void setLogScale(double lowerLimit, double upperLimit, StringArray labels) { CAxis_setLogScale2(ptr, lowerLimit, upperLimit, labels.data, labels.len); } void setLogScale(double lowerLimit, double upperLimit, double majorTickInc = 0, double minorTickInc = 0) { CAxis_setLogScale(ptr, lowerLimit, upperLimit, majorTickInc, minorTickInc); } void setDateScale(const char *formatString = 0) { CAxis_setDateScale3(ptr, formatString); } void setDateScale(double lowerLimit, double upperLimit, StringArray labels) { CAxis_setDateScale2(ptr, lowerLimit, upperLimit, labels.data, labels.len); } void setDateScale(double lowerLimit, double upperLimit, double majorTickInc = 0, double minorTickInc = 0) { CAxis_setDateScale(ptr, lowerLimit, upperLimit, majorTickInc, minorTickInc); } void syncAxis(const Axis *axis, double slope = 1, double intercept = 0) { CAxis_syncAxis(ptr, axis->ptr, slope, intercept); } void copyAxis(const Axis *axis) { CAxis_copyAxis(ptr, axis->ptr); } void addLabel(double pos, const char *label) { CAxis_addLabel(ptr, pos, label); } Mark *addMark(double value, int lineColor, const char *text = 0, const char *font = 0, double fontSize = 8) { Mark *ret = new Mark(CAxis_addMark(ptr, value, lineColor, text, font, fontSize)); reg(ret); return ret; } void addZone(double startValue, double endValue, int color) { CAxis_addZone(ptr, startValue, endValue, color); } int getCoor(double v) const { return CAxis_getCoor(ptr, v); } int getX() { return CAxis_getX(ptr); } int getY() { return CAxis_getY(ptr); } int getAlignment() { return CAxis_getAlignment(ptr); } double getMinValue() const { return CAxis_getMinValue(ptr); } double getMaxValue() const { return CAxis_getMaxValue(ptr); } int getThickness() const { return CAxis_getThickness(ptr); } DoubleArray getTicks() const { const double *d; int len; CAxis_getTicks(ptr, &d, &len); return DoubleArray(d, len); } const char *getLabel(double i) const { return CAxis_getLabel(ptr, i); } const char *getFormattedLabel(double v, const char *formatString = 0) { return CAxis_getFormattedLabel(ptr, v, formatString); } const char *getAxisImageMap(int noOfSegments, int mapWidth, const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) const { return CAxis_getAxisImageMap(ptr, noOfSegments, mapWidth, url, queryFormat, extraAttr, offsetX, offsetY); } const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) const { return CAxis_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } }; // // for compatibility // typedef Axis BaseAxis; typedef BaseAxis XAxis; typedef BaseAxis YAxis; // // In this version, PolarChart RadialAxis is the same as the XYChart Axis // typedef Axis RadialAxis; // // AngularAxis for PolarChart // class AngularAxis : public AutoDestroy, protected GarbageContainer { private : //disable copying AngularAxis(const AngularAxis &rhs); AngularAxis &operator=(const AngularAxis &rhs); AngularAxisInternal *ptr; public : AngularAxis(AngularAxisInternal *ptr) : ptr(ptr) {} ~AngularAxis() {} TextBox *setLabelStyle(const char *font = "bold", double fontSize = 10, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CAngularAxis_setLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret; } void setLabelGap(int d) { CAngularAxis_setLabelGap(ptr, d); } TextBox *setLabels(StringArray labels) { TextBox *ret = new TextBox(CAngularAxis_setLabels(ptr, labels.data, labels.len)); reg(ret); return ret; } TextBox *setLabels(DoubleArray labels, const char *formatString = 0) { TextBox *ret = new TextBox(CAngularAxis_setLabels2(ptr, labels.data, labels.len, formatString)); reg(ret); return ret; } void addLabel(double pos, const char *label) { CAngularAxis_addLabel(ptr, pos, label); } void setLinearScale(double lowerLimit, double upperLimit, StringArray labels) { CAngularAxis_setLinearScale2(ptr, lowerLimit, upperLimit, labels.data, labels.len); } void setLinearScale(double lowerLimit, double upperLimit, double majorTickInc = 0, double minorTickInc = 0) { CAngularAxis_setLinearScale(ptr, lowerLimit, upperLimit, majorTickInc, minorTickInc); } void addZone(double startValue, double endValue, double startRadius, double endRadius, int fillColor, int edgeColor = -1) { CAngularAxis_addZone(ptr, startValue, endValue, startRadius, endRadius, fillColor, edgeColor); } void addZone(double startValue, double endValue, int fillColor, int edgeColor = -1) { CAngularAxis_addZone2(ptr, startValue, endValue, fillColor, edgeColor); } const char *getAxisImageMap(int noOfSegments, int mapWidth, const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) const { return CAngularAxis_getAxisImageMap(ptr, noOfSegments, mapWidth, url, queryFormat, extraAttr, offsetX, offsetY); } const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) const { return CAngularAxis_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } }; class ColorAxis : public Axis { private : //disable copying ColorAxis(const ColorAxis &rhs); ColorAxis &operator=(const ColorAxis &rhs); ColorAxisInternal *ptr; public : ColorAxis(ColorAxisInternal *ptr) : Axis(ColorAxis2Axis(ptr)), ptr(ptr) {} ~ColorAxis() {} void setColorGradient(bool isContinuous = true, IntArray colors = IntArray(), int underflowColor = -1, int overflowColor = -1) { CColorAxis_setColorGradient(ptr, isContinuous, colors.data, colors.len, overflowColor, underflowColor); } void setAxisPos(int x, int y, int alignment) { CColorAxis_setAxisPos(ptr, x, y, alignment); } void setLevels(int maxLevels) { CColorAxis_setLevels(ptr, maxLevels); } void setCompactAxis(bool b = true) { CColorAxis_setCompactAxis(ptr, b); } void setAxisBorder(int edgeColor, int raisedEffect = 0) { CColorAxis_setAxisBorder(ptr, edgeColor, raisedEffect); } void setBoundingBox(int fillColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { CColorAxis_setBoundingBox(ptr, fillColor, edgeColor, raisedEffect); } void setBoxMargin(int m) { CColorAxis_setBoxMargin(ptr, m); } void setBoxMargin(int leftMargin, int rightMargin, int topMargin, int bottomMargin) { CColorAxis_setBoxMargin2(ptr, leftMargin, rightMargin, topMargin, bottomMargin); } void setRoundedCorners(int r1 = 10, int r2 = -1, int r3 = -1, int r4 = -1) { CColorAxis_setRoundedCorners(ptr, r1, r2, r3, r4); } int getBoxWidth() const { return CColorAxis_getBoxWidth(ptr); } int getBoxHeight() const { return CColorAxis_getBoxHeight(ptr); } int getColor(double z) const { return CColorAxis_getColor(ptr, z); } }; class DataSet : public AutoDestroy, protected GarbageContainer { private : //disable copying DataSet(const DataSet &rhs); DataSet &operator=(const DataSet &rhs); DataSetInternal *ptr; Axis *useYAxisCache; public : DataSet(DataSetInternal *ptr) : ptr(ptr), useYAxisCache(0) {} ~DataSet() {} DataSetInternal *getInternalPtr() { return ptr; } const DataSetInternal *getInternalPtr() const { return ptr; } void setData(int noOfPoints, const double *data) { setData(DoubleArray(data, noOfPoints)); } void setData(DoubleArray data) { CDataSet_setData(ptr, data.data, data.len); } double getValue(int i ) { return CDataSet_getValue(ptr, i); } double getPosition(int i ) { return CDataSet_getPosition(ptr, i); } void setDataName(const char *name) { CDataSet_setDataName(ptr, name); } const char *getDataName() { return CDataSet_getDataName(ptr); } void setDataColor(int dataColor, int edgeColor = -1, int shadowColor = -1, int shadowEdgeColor = -1) { CDataSet_setDataColor(ptr, dataColor, edgeColor, shadowColor, shadowEdgeColor); } int getDataColor() { return CDataSet_getDataColor(ptr); } void setDataSymbol(int symbol, int size = 5, int fillColor = -1, int edgeColor = -1, int lineWidth = 1) { CDataSet_setDataSymbol(ptr, symbol, size, fillColor, edgeColor, lineWidth); } void setDataSymbol(const char *image) { CDataSet_setDataSymbol2(ptr, image); } void setDataSymbol(const DrawArea *obj) { CDataSet_setDataSymbol3(ptr, obj->getInternalPtr()); } void setDataSymbol(IntArray polygon, int size = 11, int fillColor = -1, int edgeColor = -1) { CDataSet_setDataSymbol4(ptr, polygon.data, polygon.len, size, fillColor, edgeColor); } void setLineWidth(int w) { CDataSet_setLineWidth(ptr, w); } void setDataLabelFormat(const char *formatString) { CDataSet_setDataLabelFormat(ptr, formatString); } TextBox *setDataLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CDataSet_setDataLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} void setUseYAxis2(bool b = true) { CDataSet_setUseYAxis2(ptr, b); } void setUseYAxis(const Axis* a) { CDataSet_setUseYAxis(ptr, a->getInternalPtr()); } Axis *getUseYAxis() { AxisInternal *retPtr = CDataSet_getUseYAxis(ptr); if ((0 == useYAxisCache) || (retPtr != useYAxisCache->getInternalPtr())) { useYAxisCache = new Axis(retPtr); reg(useYAxisCache); } return useYAxisCache; } const char *getLegendIcon() { return CDataSet_getLegendIcon(ptr); } }; class Layer : public AutoDestroy, protected GarbageContainer { private : //disable copying Layer(const Layer &rhs); Layer &operator=(const Layer &rhs); LayerInternal *ptr; DataSet **dataSetCache; int dataSetCacheCount; int maxDataSetCacheCount; DataSet *regDataSet(DataSetInternal *ptr) { if (!ptr) return 0; for (int i = 0; i < dataSetCacheCount; ++i) if (dataSetCache[i]->getInternalPtr() == ptr) return dataSetCache[i]; DataSet *ret = new DataSet(ptr); reg(ret); if (dataSetCacheCount >= maxDataSetCacheCount) { maxDataSetCacheCount = (maxDataSetCacheCount < 10) ? 10 : maxDataSetCacheCount * 2; DataSet **temp = new DataSet*[maxDataSetCacheCount]; for (int i = 0; i < dataSetCacheCount; ++i) temp[i] = dataSetCache[i]; delete[] dataSetCache; dataSetCache = temp; } return dataSetCache[dataSetCacheCount++] = ret; } public : Layer(LayerInternal *ptr) : ptr(ptr), dataSetCache(0), dataSetCacheCount(0), maxDataSetCacheCount(0) {} ~Layer() { delete[] dataSetCache; } LayerInternal *getInternalPtr() { return ptr; } const LayerInternal *getInternalPtr() const { return ptr; } void moveFront(Layer *layer = 0) { CLayer_moveFront(ptr, layer ? layer->ptr : 0); } void moveBack(Layer *layer = 0) { CLayer_moveBack(ptr, layer ? layer->ptr : 0); } void set3D(int d = -1, int zGap = 0) { CLayer_set3D(ptr, d, zGap); } void setLineWidth(int w) { CLayer_setLineWidth(ptr, w); } void setBorderColor(int color, int lightingEffect = 0) { CLayer_setBorderColor(ptr, color, lightingEffect); } void setLegend(int m) { CLayer_setLegend(ptr, m); } void setLegendOrder(int dataSetOrder, int layerOrder = -1) { CLayer_setLegendOrder(ptr, dataSetOrder, layerOrder); } const char *getLegendIcon(int dataSetNo) const { return CLayer_getLegendIcon(ptr, dataSetNo); } //obsoleted constants - for compatibility only enum DataCombineMethod { Overlay, Stack, Depth, Side }; void setDataCombineMethod(int m) { CLayer_setDataCombineMethod(ptr, m); } void setBaseLine(double baseLine) { CLayer_setBaseLine(ptr, baseLine); } DataSet *addDataSet(int noOfPoints, const double *d, int color = -1, const char *name = 0) { return addDataSet(DoubleArray(d, noOfPoints), color, name); } DataSet *addDataSet(DoubleArray data, int color = -1, const char *name = 0) { return regDataSet(CLayer_addDataSet(ptr, data.data, data.len, color, name)); } void addDataGroup(const char *name = 0) { CLayer_addDataGroup(ptr, name); } void addExtraField(StringArray texts) { CLayer_addExtraField(ptr, texts.data, texts.len); } void addExtraField(DoubleArray numbers) { CLayer_addExtraField2(ptr, numbers.data, numbers.len); } DataSet *getDataSet(int i) { return regDataSet(CLayer_getDataSet(ptr, i)); } DataSet *getDataSetByZ(int i) { return regDataSet(CLayer_getDataSetByZ(ptr, i)); } int getDataSetCount() { return CLayer_getDataSetCount(ptr); } void setUseYAxis2(bool b = true) { CLayer_setUseYAxis2(ptr, b); } void setUseYAxis(const Axis* a) { CLayer_setUseYAxis(ptr, a->getInternalPtr()); } void setXData(DoubleArray xData) { CLayer_setXData(ptr, xData.data, xData.len); } void setXData(double minValue, double maxValue) { CLayer_setXData2(ptr, minValue, maxValue); } double getXPosition(int i) { return CLayer_getXPosition(ptr, i); } double getNearestXValue(double target) { return CLayer_getNearestXValue(ptr, target); } int getXIndexOf(double xValue, double tolerance = 0) { return CLayer_getXIndexOf(ptr, xValue, tolerance); } void alignLayer(const Layer *layer, int dataSet) { CLayer_alignLayer(ptr, layer->getInternalPtr(), dataSet); } int getXCoor(double v) const { return CLayer_getXCoor(ptr, v); } int getYCoor(double v, bool yAxis = true) const { return CLayer_getYCoor(ptr, v, yAxis); } int getYCoor(double v, const Axis *yAxis) const { if (0 == yAxis) return getYCoor(v); else return CLayer_getYCoor2(ptr, v, yAxis->getInternalPtr()); } int xZoneColor(double threshold, int belowColor, int aboveColor) { return CLayer_xZoneColor(ptr, threshold, belowColor, aboveColor); } int yZoneColor(double threshold, int belowColor, int aboveColor, bool yAxis = true) { return CLayer_yZoneColor(ptr, threshold, belowColor, aboveColor, yAxis); } int yZoneColor(double threshold, int belowColor, int aboveColor, const Axis *yAxis) { if (0 == yAxis) return yZoneColor(threshold, belowColor, aboveColor); else return CLayer_yZoneColor2(ptr, threshold, belowColor, aboveColor, yAxis->getInternalPtr()); } //*** Note ***: The default value -0x7fffffff is maintained for compatibility const char *getImageCoor(int dataSet, int dataItem = -0x7fffffff, int offsetX = 0, int offsetY = 0) { return CLayer_getImageCoor(ptr, dataSet, dataItem, offsetX, offsetY); } const char *getImageCoor2(int dataItem, int offsetX = 0, int offsetY = 0) { return CLayer_getImageCoor2(ptr, dataItem, offsetX, offsetY); } const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) { return CLayer_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } void setHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0) { CLayer_setHTMLImageMap(ptr, url, queryFormat, extraAttr); } void setDataLabelFormat(const char *formatString) { CLayer_setDataLabelFormat(ptr, formatString); } TextBox *setDataLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CLayer_setDataLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} void setAggregateLabelFormat(const char *formatString) { CLayer_setAggregateLabelFormat(ptr, formatString); } TextBox *setAggregateLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CLayer_setAggregateLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} TextBox *addCustomDataLabel(int dataSet, int dataItem, const char *label, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CLayer_addCustomDataLabel(ptr, dataSet, dataItem, label, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} TextBox *addCustomAggregateLabel(int dataItem, const char *label, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CLayer_addCustomAggregateLabel(ptr, dataItem, label, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} TextBox *addCustomGroupLabel(int dataGroup, int dataItem, const char *label, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CLayer_addCustomGroupLabel(ptr, dataGroup, dataItem, label, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} }; class BarLayer : public Layer { private : //disable copying BarLayer(const BarLayer &rhs); BarLayer &operator=(const BarLayer &rhs); BarLayerInternal *ptr; public : BarLayer(BarLayerInternal *ptr) : Layer(BarLayer2Layer(ptr)), ptr(ptr) {} ~BarLayer() {} void setBarGap(double barGap, double subBarGap = Chart::NoValue) { CBarLayer_setBarGap(ptr, barGap, subBarGap); } void setBarWidth(int barWidth, int subBarWidth = -1) { CBarLayer_setBarWidth(ptr, barWidth, subBarWidth); } void setMinLabelSize(int s) { CBarLayer_setMinLabelSize(ptr, s); } void setMinImageMapSize(int s) { CBarLayer_setMinImageMapSize(ptr, s); } void setBarShape(int shape, int dataGroup = -1, int dataItem = -1) { CBarLayer_setBarShape(ptr, shape, dataGroup, dataItem); } void setBarShape(IntArray shape, int dataGroup = -1, int dataItem = -1) { CBarLayer_setBarShape2(ptr, shape.data, shape.len, dataGroup, dataItem); } void setIconSize(int height, int width = -1) { CBarLayer_setIconSize(ptr, height, width); } void setOverlapRatio(double overlapRatio, bool firstOnTop = true) { CBarLayer_setOverlapRatio(ptr, overlapRatio, firstOnTop); } }; class InterLineLayer : public Layer { private : //disable copying InterLineLayer(const InterLineLayer &rhs); InterLineLayer &operator=(const InterLineLayer &rhs); InterLineLayerInternal *ptr; public : InterLineLayer(InterLineLayerInternal *ptr) : Layer(InterLineLayer2Layer(ptr)), ptr(ptr) {} ~InterLineLayer() {} void setGapColor(int gapColor12, int gapColor21 = -1) { CInterLineLayer_setGapColor(ptr, gapColor12, gapColor21); } }; class LineLayer : public Layer { private : //disable copying LineLayer(const LineLayer &rhs); LineLayer &operator=(const LineLayer &rhs); LineLayerInternal *ptr; public : LineLayer(LineLayerInternal *ptr) : Layer(LineLayer2Layer(ptr)), ptr(ptr) {} ~LineLayer() {} void setSymbolScale(DoubleArray zDataX, int scaleTypeX = Chart::PixelScale, DoubleArray zDataY = DoubleArray(), int scaleTypeY = Chart::PixelScale) { CLineLayer_setSymbolScale(ptr, zDataX.data, zDataX.len, scaleTypeX, zDataY.data, zDataY.len, scaleTypeY); } void setGapColor(int lineColor, int lineWidth = -1) { CLineLayer_setGapColor(ptr, lineColor, lineWidth); } void setImageMapWidth(int width) { CLineLayer_setImageMapWidth(ptr, width); } void setFastLineMode(bool b = true) { CLineLayer_setFastLineMode(ptr, b); } LineObj *getLine(int dataSet = 0) { return (LineObj *)CLineLayer_getLine(ptr, dataSet); } }; //In the current version, a Scatter chart is implemented as a //special configuration of a Line chart. typedef LineLayer ScatterLayer; class SplineLayer : public LineLayer { private : //disable copying SplineLayer(const SplineLayer &rhs); SplineLayer &operator=(const SplineLayer &rhs); SplineLayerInternal *ptr; public : SplineLayer(SplineLayerInternal *ptr) : LineLayer(SplineLayer2LineLayer(ptr)), ptr(ptr) {} ~SplineLayer() {} void setTension(double tension) { CSplineLayer_setTension(ptr, tension); } void setMonotonicity(int m) { CSplineLayer_setMonotonicity(ptr, m); } }; class StepLineLayer : public LineLayer { private : //disable copying StepLineLayer(const StepLineLayer &rhs); StepLineLayer &operator=(const StepLineLayer &rhs); StepLineLayerInternal *ptr; public : StepLineLayer(StepLineLayerInternal *ptr) : LineLayer(StepLineLayer2LineLayer(ptr)), ptr(ptr) {} ~StepLineLayer() {} void setAlignment(int a) { CStepLineLayer_setAlignment(ptr, a); } }; class AreaLayer : public Layer { private : //disable copying AreaLayer(const AreaLayer &rhs); AreaLayer &operator=(const AreaLayer &rhs); AreaLayerInternal *ptr; public : AreaLayer(AreaLayerInternal *ptr) : Layer(AreaLayer2Layer(ptr)), ptr(ptr) {} ~AreaLayer() {} void setMinLabelSize(int s) { CAreaLayer_setMinLabelSize(ptr, s); } void setGapColor(int fillColor) { CAreaLayer_setGapColor(ptr, fillColor); } }; class BaseBoxLayer : public Layer { private : //disable copying BaseBoxLayer(const BaseBoxLayer &rhs); BaseBoxLayer &operator=(const BaseBoxLayer &rhs); BaseBoxLayerInternal *ptr; public : BaseBoxLayer(BaseBoxLayerInternal *ptr) : Layer(BaseBoxLayer2Layer(ptr)), ptr(ptr) {} ~BaseBoxLayer() {} void setDataGap(double gap) { CBaseBoxLayer_setDataGap(ptr, gap); } void setDataWidth(int width) { CBaseBoxLayer_setDataWidth(ptr, width); } void setMinImageMapSize(int size) { CBaseBoxLayer_setMinImageMapSize(ptr, size); } }; class HLOCLayer : public BaseBoxLayer { private : //disable copying HLOCLayer(const HLOCLayer &rhs); HLOCLayer &operator=(const HLOCLayer &rhs); HLOCLayerInternal *ptr; public : HLOCLayer(HLOCLayerInternal *ptr) : BaseBoxLayer(HLOCLayer2BaseBoxLayer(ptr)), ptr(ptr) {} ~HLOCLayer() {} void setColorMethod(int colorMethod, int riseColor, int fallColor = -1, double leadValue = -1.7E308) { CHLOCLayer_setColorMethod(ptr, colorMethod, riseColor, fallColor, leadValue); } }; class CandleStickLayer : public BaseBoxLayer { private : //disable copying CandleStickLayer(const CandleStickLayer &rhs); CandleStickLayer &operator=(const CandleStickLayer &rhs); CandleStickLayerInternal *ptr; public : CandleStickLayer(CandleStickLayerInternal *ptr) : BaseBoxLayer(CandleStickLayer2BaseBoxLayer(ptr)), ptr(ptr) {} ~CandleStickLayer() {} }; class BoxWhiskerLayer : public BaseBoxLayer { private : //disable copying BoxWhiskerLayer(const BoxWhiskerLayer &rhs); BoxWhiskerLayer &operator=(const BoxWhiskerLayer &rhs); BoxWhiskerLayerInternal *ptr; public : BoxWhiskerLayer(BoxWhiskerLayerInternal *ptr) : BaseBoxLayer(BoxWhiskerLayer2BaseBoxLayer(ptr)), ptr(ptr) {} ~BoxWhiskerLayer() {} void setBoxColors(IntArray colors, StringArray names = StringArray()) { CBoxWhiskerLayer_setBoxColors(ptr, colors.data, colors.len, names.data, names.len); } void setBoxColor(int item, int boxColor) { CBoxWhiskerLayer_setBoxColor(ptr, item, boxColor); } void setWhiskerBrightness(double whiskerBrightness) { CBoxWhiskerLayer_setWhiskerBrightness(ptr, whiskerBrightness); } }; class TrendLayer : public Layer { private : //disable copying TrendLayer(const TrendLayer &rhs); TrendLayer &operator=(const TrendLayer &rhs); TrendLayerInternal *ptr; public : TrendLayer(TrendLayerInternal *ptr) : Layer(TrendLayer2Layer(ptr)), ptr(ptr) {} ~TrendLayer() {} void setRegressionType(int regressionType) { CTrendLayer_setRegressionType(ptr, regressionType); } void addConfidenceBand(double confidence, int upperFillColor, int upperEdgeColor = Chart::Transparent, int upperLineWidth = 1, int lowerFillColor = -1, int lowerEdgeColor = -1, int lowerLineWidth = -1) { CTrendLayer_addConfidenceBand(ptr, confidence, upperFillColor, upperEdgeColor, upperLineWidth, lowerFillColor, lowerEdgeColor, lowerLineWidth); } void addPredictionBand(double confidence, int upperFillColor, int upperEdgeColor = Chart::Transparent, int upperLineWidth = 1, int lowerFillColor = -1, int lowerEdgeColor = -1, int lowerLineWidth = -1) { CTrendLayer_addPredictionBand(ptr, confidence, upperFillColor, upperEdgeColor, upperLineWidth, lowerFillColor, lowerEdgeColor, lowerLineWidth); } double getSlope() { return CTrendLayer_getSlope(ptr); } double getIntercept() { return CTrendLayer_getIntercept(ptr); } double getCorrelation() { return CTrendLayer_getCorrelation(ptr); } double getStdError() { return CTrendLayer_getStdError(ptr); } double getCoefficient(int i) { return CTrendLayer_getCoefficient(ptr, i); } void setImageMapWidth(int width) { CTrendLayer_setImageMapWidth(ptr, width); } LineObj *getLine() { return (LineObj *)CTrendLayer_getLine(ptr); } }; class VectorLayer : public Layer { private : //disable copying VectorLayer(const VectorLayer &rhs); VectorLayer &operator=(const VectorLayer &rhs); VectorLayerInternal *ptr; public : VectorLayer(VectorLayerInternal *ptr) : Layer(VectorLayer2Layer(ptr)), ptr(ptr) {} ~VectorLayer() {} void setVector(DoubleArray lengths, DoubleArray directions, int lengthScale = Chart::PixelScale) { CVectorLayer_setVector(ptr, lengths.data, lengths.len, directions.data, directions.len, lengthScale); } void setArrowHead(int width, int height = 0) { CVectorLayer_setArrowHead(ptr, width, height); } void setArrowHead(IntArray polygon) { CVectorLayer_setArrowHead2(ptr, polygon.data, polygon.len); } void setArrowStem(IntArray polygon) { CVectorLayer_setArrowStem(ptr, polygon.data, polygon.len); } void setArrowAlignment(int alignment) { CVectorLayer_setArrowAlignment(ptr, alignment); } void setIconSize(int height, int width = 0) { CVectorLayer_setIconSize(ptr, height, width); } void setVectorMargin(double startMargin, double endMargin = Chart::NoValue) { CVectorLayer_setVectorMargin(ptr, startMargin, endMargin); } }; class ContourLayer : public Layer { private : //disable copying ContourLayer(const ContourLayer &rhs); ContourLayer &operator=(const ContourLayer &rhs); ContourLayerInternal *ptr; public : ContourLayer(ContourLayerInternal *ptr) : Layer(ContourLayer2Layer(ptr)), ptr(ptr) {} ~ContourLayer() {} void setZData(DoubleArray zData) { CContourLayer_setZData(ptr, zData.data, zData.len); } void setZBounds(double minZ, double maxZ) { CContourLayer_setZBounds(ptr, minZ, maxZ); } void setSmoothInterpolation(bool b) { CContourLayer_setSmoothInterpolation(ptr, b); } void setContourColor(int contourColor, int minorContourColor = -1) { CContourLayer_setContourColor(ptr, contourColor, minorContourColor); } void setContourWidth(int contourWidth, int minorContourWidth = -1) { CContourLayer_setContourWidth(ptr, contourWidth, minorContourWidth); } void setExactContour(bool contour, bool markContour) { CContourLayer_setExactContour(ptr, contour, markContour); } void setExactContour(bool contour = true) { setExactContour(contour, contour); } ColorAxis *setColorAxis(int x, int y, int alignment, int length, int orientation) { ColorAxis *ret = new ColorAxis(CContourLayer_setColorAxis(ptr, x, y, alignment, length, orientation)); reg(ret); return ret; } ColorAxis *colorAxis() { ColorAxis *ret = new ColorAxis(CContourLayer_colorAxis(ptr)); reg(ret); return ret; } }; class PlotArea : public AutoDestroy { private : //disable copying PlotArea(const PlotArea &rhs); PlotArea &operator=(const PlotArea &rhs); PlotAreaInternal *ptr; public : PlotArea(PlotAreaInternal *ptr) : ptr(ptr) {} ~PlotArea() {} void setBackground(int color, int altBgColor = -1, int edgeColor = -1) { CPlotArea_setBackground(ptr, color, altBgColor, edgeColor); } void setBackground(const char *img, int align = Chart::Center) { CPlotArea_setBackground2(ptr, img, align); } void set4QBgColor(int Q1Color, int Q2Color, int Q3Color, int Q4Color, int edgeColor = -1) { CPlotArea_set4QBgColor(ptr, Q1Color, Q2Color, Q3Color, Q4Color, edgeColor); } void setAltBgColor(bool horizontal, int color1, int color2, int edgeColor = -1) { CPlotArea_setAltBgColor(ptr, horizontal, color1, color2, edgeColor); } void setGridColor(int hGridColor, int vGridColor = Chart::Transparent, int minorHGridColor = -1, int minorVGridColor = -1) { CPlotArea_setGridColor(ptr, hGridColor, vGridColor, minorHGridColor, minorVGridColor); } void setGridWidth(int hGridWidth, int vGridWidth = -1, int minorHGridWidth = -1, int minorVGridWidth = -1) { CPlotArea_setGridWidth(ptr, hGridWidth, vGridWidth, minorHGridWidth, minorVGridWidth); } void setGridAxis(const Axis *xGridAxis, const Axis *yGridAxis) { CPlotArea_setGridAxis(ptr, xGridAxis ? xGridAxis->getInternalPtr() : 0, yGridAxis ? yGridAxis->getInternalPtr() : 0); } void moveGridBefore(Layer *layer = 0) { CPlotArea_moveGridBefore(ptr, layer ? layer->getInternalPtr() : 0); } int getLeftX() const { return CPlotArea_getLeftX(ptr); } int getTopY() const { return CPlotArea_getTopY(ptr); } int getWidth() const { return CPlotArea_getWidth(ptr); } int getHeight() const { return CPlotArea_getHeight(ptr); } int getRightX() const { return CPlotArea_getRightX(ptr); } int getBottomY() const { return CPlotArea_getBottomY(ptr); } }; class XYChart : public BaseChart { private : //disable copying XYChart(const XYChart &rhs); XYChart &operator=(const XYChart &rhs); XYChartInternal *ptr; Layer **layerCache; int layerCacheCount; int maxLayerCacheCount; Layer *regLayer(LayerInternal *ptr) { if (!ptr) return 0; for (int i = 0; i < layerCacheCount; ++i) if (layerCache[i]->getInternalPtr() == ptr) return layerCache[i]; Layer *ret = new Layer(ptr); reg(ret); if (layerCacheCount >= maxLayerCacheCount) { maxLayerCacheCount = (maxLayerCacheCount < 10) ? 10 : maxLayerCacheCount * 2; Layer **temp = new Layer*[maxLayerCacheCount]; for (int i = 0; i < layerCacheCount; ++i) temp[i] = layerCache[i]; delete[] layerCache; layerCache = temp; } return layerCache[layerCacheCount++] = ret; } public : XYChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) : layerCache(0), layerCacheCount(0), maxLayerCacheCount(0) { ptr = CXYChart_create(width, height, bgColor, edgeColor, raisedEffect); init(XYChart2BaseChart(ptr)); } static XYChart *create(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { return new XYChart(width, height, bgColor, edgeColor, raisedEffect); } ~XYChart() { delete[] layerCache; } Axis *addAxis(int align, int offset) { Axis *ret = new Axis(CXYChart_addAxis(ptr, align, offset)); reg(ret); return ret; } Axis *yAxis() { Axis *ret = new Axis(CXYChart_yAxis(ptr)); reg(ret); return ret; } Axis *yAxis2() { Axis *ret = new Axis(CXYChart_yAxis2(ptr)); reg(ret); return ret; } void syncYAxis(double slope = 1, double intercept = 0) { CXYChart_syncYAxis(ptr, slope, intercept); } void setYAxisOnRight(bool b = true) { CXYChart_setYAxisOnRight(ptr, b); } Axis *xAxis() { Axis *ret = new Axis(CXYChart_xAxis(ptr)); reg(ret); return ret; } Axis *xAxis2() { Axis *ret = new Axis(CXYChart_xAxis2(ptr)); reg(ret); return ret; } void setXAxisOnTop(bool b = true) { CXYChart_setXAxisOnTop(ptr, b); } void swapXY(bool b = true) { CXYChart_swapXY(ptr, b); } void setAxisAtOrigin(int originMode = Chart::XYAxisAtOrigin, int symmetryMode = 0) { CXYChart_setAxisAtOrigin(ptr, originMode, symmetryMode); } int getXCoor(double v) const { return CXYChart_getXCoor(ptr, v); } int getYCoor(double v, const Axis *yAxis = 0) { return CXYChart_getYCoor(ptr, v, (0 == yAxis) ? 0 : yAxis->getInternalPtr()); } double getXValue(int xCoor) { return CXYChart_getXValue(ptr, xCoor); } double getNearestXValue(double xCoor) { return CXYChart_getNearestXValue(ptr, xCoor); } double getYValue(int yCoor, const Axis *yAxis = 0) { return CXYChart_getYValue(ptr, yCoor, (0 == yAxis) ? 0 : yAxis->getInternalPtr()); } int xZoneColor(double threshold, int belowColor, int aboveColor) { return CXYChart_xZoneColor(ptr, threshold, belowColor, aboveColor); } int yZoneColor(double threshold, int belowColor, int aboveColor, const Axis *yAxis = 0) { return CXYChart_yZoneColor(ptr, threshold, belowColor, aboveColor, (0 == yAxis) ? 0 : yAxis->getInternalPtr()); } PlotArea *setPlotArea(int x, int y, int width, int height, int bgColor = Chart::Transparent, int altBgColor = -1, int edgeColor = -1, int hGridColor = 0xc0c0c0, int vGridColor = Chart::Transparent) { PlotArea *ret = new PlotArea(CXYChart_setPlotArea(ptr, x, y, width, height, bgColor, altBgColor, edgeColor, hGridColor, vGridColor)); reg(ret); return ret; } PlotArea *getPlotArea() { PlotArea *ret = new PlotArea(CXYChart_getPlotArea(ptr)); reg(ret); return ret; } void setClipping(int margin = 0) { CXYChart_setClipping(ptr, margin); } void setTrimData(int startPos, int len = 0x7fffffff) { CXYChart_setTrimData(ptr, startPos, len); } BarLayer *addBarLayer(int noOfPoints, const double *data, int color = -1, const char *name = 0, int depth = 0) { return addBarLayer(DoubleArray(data, noOfPoints), color, name, depth); } BarLayer *addBarLayer(DoubleArray data, int color = -1, const char *name = 0, int depth = 0) { BarLayer *ret = new BarLayer(CXYChart_addBarLayer(ptr, data.data, data.len, color, name, depth)); reg(ret); return ret; } BarLayer *addBarLayer(int noOfPoints, const double *data, const int *colors, const char* const* names = 0, int depth = 0) { return addBarLayer(DoubleArray(data, noOfPoints), IntArray(colors, colors ? noOfPoints : 0), StringArray(names, names ? noOfPoints : 0), depth); } BarLayer *addBarLayer(DoubleArray data, IntArray colors, StringArray names = StringArray(), int depth = 0) { BarLayer *ret = new BarLayer(CXYChart_addBarLayer3(ptr, data.data, data.len, colors.data, colors.len, names.data, names.len, depth)); reg(ret); return ret; } BarLayer *addBarLayer(int dataCombineMethod = Chart::Side, int depth = 0) { BarLayer *ret = new BarLayer(CXYChart_addBarLayer2(ptr, dataCombineMethod, depth)); reg(ret); return ret; } LineLayer *addLineLayer(int noOfPoints, const double *data, int color = -1, const char *name = 0, int depth = 0) { return addLineLayer(DoubleArray(data, noOfPoints), color, name, depth); } LineLayer *addLineLayer(DoubleArray data, int color = -1, const char *name = 0, int depth = 0) { LineLayer *ret = new LineLayer(CXYChart_addLineLayer(ptr, data.data, data.len, color, name, depth)); reg(ret); return ret; } LineLayer *addLineLayer(int dataCombineMethod = Chart::Overlay, int depth = 0) { LineLayer *ret = new LineLayer(CXYChart_addLineLayer2(ptr, dataCombineMethod, depth)); reg(ret); return ret; } AreaLayer *addAreaLayer(int noOfPoints, const double *data, int color = -1, const char *name = 0, int depth = 0) { return addAreaLayer(DoubleArray(data, noOfPoints), color, name, depth); } AreaLayer *addAreaLayer(DoubleArray data, int color = -1, const char *name = 0, int depth = 0) { AreaLayer *ret = new AreaLayer(CXYChart_addAreaLayer(ptr, data.data, data.len, color, name, depth)); reg(ret); return ret; } AreaLayer *addAreaLayer(int dataCombineMethod = Chart::Stack, int depth = 0) { AreaLayer *ret = new AreaLayer(CXYChart_addAreaLayer2(ptr, dataCombineMethod, depth)); reg(ret); return ret; } HLOCLayer *addHLOCLayer() { HLOCLayer *ret = new HLOCLayer(CXYChart_addHLOCLayer2(ptr)); reg(ret); return ret; } HLOCLayer *addHLOCLayer(int noOfPoints, const double *highData, const double *lowData, const double *openData = 0, const double *closeData = 0, int color = -1) { return addHLOCLayer(DoubleArray(highData, highData ? noOfPoints : 0), DoubleArray(lowData, lowData ? noOfPoints : 0), DoubleArray(openData, openData ? noOfPoints : 0), DoubleArray(closeData, closeData ? noOfPoints : 0), color); } HLOCLayer *addHLOCLayer(DoubleArray highData, DoubleArray lowData, DoubleArray openData = DoubleArray(), DoubleArray closeData = DoubleArray(), int color = -1) { HLOCLayer *ret = new HLOCLayer(CXYChart_addHLOCLayer(ptr, highData.data, highData.len, lowData.data, lowData.len, openData.data, openData.len, closeData.data, closeData.len, color)); reg(ret); return ret; } HLOCLayer *addHLOCLayer(DoubleArray highData, DoubleArray lowData, DoubleArray openData, DoubleArray closeData, int upColor, int downColor, int colorMode = -1, double leadValue = -1.7E308) { HLOCLayer *ret = new HLOCLayer(CXYChart_addHLOCLayer3(ptr, highData.data, highData.len, lowData.data, lowData.len, openData.data, openData.len, closeData.data, closeData.len, upColor, downColor, colorMode, leadValue)); reg(ret); return ret; } CandleStickLayer *addCandleStickLayer( DoubleArray highData, DoubleArray lowData, DoubleArray openData, DoubleArray closeData, int riseColor = 0xffffff, int fallColor = 0x0, int edgeColor = Chart::LineColor) { CandleStickLayer *ret = new CandleStickLayer(CXYChart_addCandleStickLayer(ptr, highData.data, highData.len, lowData.data, lowData.len, openData.data, openData.len, closeData.data, closeData.len, riseColor, fallColor, edgeColor)); reg(ret); return ret; } BoxWhiskerLayer *addBoxWhiskerLayer( DoubleArray boxTop, DoubleArray boxBottom, DoubleArray maxData = DoubleArray(), DoubleArray minData = DoubleArray(), DoubleArray midData = DoubleArray(), int fillColor = -1, int whiskerColor = Chart::LineColor, int edgeColor = -1) { BoxWhiskerLayer *ret = new BoxWhiskerLayer(CXYChart_addBoxWhiskerLayer(ptr, boxTop.data, boxTop.len, boxBottom.data, boxBottom.len, maxData.data, maxData.len, minData.data, minData.len, midData.data, midData.len, fillColor, whiskerColor, edgeColor)); reg(ret); return ret; } BoxWhiskerLayer *addBoxWhiskerLayer2(DoubleArray boxTop, DoubleArray boxBottom, DoubleArray maxData = DoubleArray(), DoubleArray minData = DoubleArray(), DoubleArray midData = DoubleArray(), IntArray fillColors = IntArray(), double whiskerBrightness = 0.5, StringArray names = StringArray()) { BoxWhiskerLayer *ret = new BoxWhiskerLayer(CXYChart_addBoxWhiskerLayer2(ptr, boxTop.data, boxTop.len, boxBottom.data, boxBottom.len, maxData.data, maxData.len, minData.data, minData.len, midData.data, midData.len, fillColors.data, fillColors.len, whiskerBrightness, names.data, names.len)); reg(ret); return ret; } BoxWhiskerLayer *addBoxLayer(DoubleArray boxTop, DoubleArray boxBottom, int color = -1, const char *name = 0) { BoxWhiskerLayer *ret = new BoxWhiskerLayer(CXYChart_addBoxLayer(ptr, boxTop.data, boxTop.len, boxBottom.data, boxBottom.len, color, name)); reg(ret); return ret; } ScatterLayer *addScatterLayer(DoubleArray xData, DoubleArray yData, const char *name = 0, int symbol = Chart::SquareSymbol, int symbolSize = 5, int fillColor = -1, int edgeColor = -1) { ScatterLayer *ret = new ScatterLayer(CXYChart_addScatterLayer(ptr, xData.data, xData.len, yData.data, yData.len, name, symbol, symbolSize, fillColor, edgeColor)); reg(ret); return ret; } TrendLayer *addTrendLayer(DoubleArray data, int color = -1, const char *name = 0, int depth = 0) { TrendLayer *ret = new TrendLayer(CXYChart_addTrendLayer(ptr, data.data, data.len, color, name, depth)); reg(ret); return ret; } TrendLayer *addTrendLayer(DoubleArray xData, DoubleArray yData, int color = -1, const char *name = 0, int depth = 0) { TrendLayer *ret = new TrendLayer(CXYChart_addTrendLayer2(ptr, xData.data, xData.len, yData.data, yData.len, color, name, depth)); reg(ret); return ret; } SplineLayer *addSplineLayer(DoubleArray data = DoubleArray(), int color = -1, const char *name = 0) { SplineLayer *ret = new SplineLayer(CXYChart_addSplineLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } StepLineLayer *addStepLineLayer(DoubleArray data = DoubleArray(), int color = -1, const char *name = 0) { StepLineLayer *ret = new StepLineLayer(CXYChart_addStepLineLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } InterLineLayer *addInterLineLayer(LineObj *line1, LineObj *line2, int color12, int color21 = -1) { InterLineLayer *ret = new InterLineLayer(CXYChart_addInterLineLayer(ptr, (LineObjInternal *)line1, (LineObjInternal *)line2, color12, color21)); reg(ret); return ret; } VectorLayer *addVectorLayer(DoubleArray xData, DoubleArray yData, DoubleArray lengths, DoubleArray directions, int lengthScale = Chart::PixelScale, int color = -1, const char *name = 0) { VectorLayer *ret = new VectorLayer(CXYChart_addVectorLayer(ptr, xData.data, xData.len, yData.data, yData.len, lengths.data, lengths.len, directions.data, directions.len, lengthScale, color, name)); reg(ret); return ret; } ContourLayer *addContourLayer(DoubleArray xData, DoubleArray yData, DoubleArray zData) { ContourLayer *ret = new ContourLayer(CXYChart_addContourLayer(ptr, xData.data, xData.len, yData.data, yData.len, zData.data, zData.len)); reg(ret); return ret; } Layer *getLayer(int i) { return regLayer(CXYChart_getLayer(ptr, i)); } Layer *getLayerByZ(int i) { return regLayer(CXYChart_getLayerByZ(ptr, i)); } int getLayerCount() { return CXYChart_getLayerCount(ptr); } void layoutAxes() { CXYChart_layoutAxes(ptr); } void packPlotArea(int leftX, int topY, int rightX, int bottomY, int minWidth = 0, int minHeight = 0) { CXYChart_packPlotArea(ptr, leftX, topY, rightX, bottomY, minWidth, minHeight); } }; // // Ver 5.1 // class ThreeDChart : public BaseChart { private : //disable copying ThreeDChart(const ThreeDChart &rhs); ThreeDChart &operator=(const ThreeDChart &rhs); ThreeDChartInternal *ptr; public : ThreeDChart() : ptr(0) {} void init(ThreeDChartInternal *ptr) { this->ptr = ptr; BaseChart::init(ThreeDChart2BaseChart(ptr)); } void setPlotRegion(int cx, int cy, int xWidth, int yDepth, int zHeight) { CThreeDChart_setPlotRegion(ptr, cx, cy, xWidth, yDepth, zHeight); } void setViewAngle(double elevation, double rotation = 0, double twist = 0) { CThreeDChart_setViewAngle(ptr, elevation, rotation, twist); } void setPerspective(double perspective) { CThreeDChart_setPerspective(ptr, perspective); } Axis *xAxis() { Axis *ret = new Axis(CThreeDChart_xAxis(ptr)); reg(ret); return ret; } Axis *yAxis() { Axis *ret = new Axis(CThreeDChart_yAxis(ptr)); reg(ret); return ret; } Axis *zAxis() { Axis *ret = new Axis(CThreeDChart_zAxis(ptr)); reg(ret); return ret; } void setZAxisPos(int pos) { CThreeDChart_setZAxisPos(ptr, pos); } ColorAxis *setColorAxis(int x, int y, int alignment, int length, int orientation) { ColorAxis *ret = new ColorAxis(CThreeDChart_setColorAxis(ptr, x, y, alignment, length, orientation)); reg(ret); return ret; } ColorAxis *colorAxis() { ColorAxis *ret = new ColorAxis(CThreeDChart_colorAxis(ptr)); reg(ret); return ret; } void setWallVisibility(bool xyVisible, bool yzVisible, bool zxVisible) { CThreeDChart_setWallVisibility(ptr, xyVisible, yzVisible, zxVisible); } void setWallColor(int xyColor, int yzColor = -1, int zxColor = -1, int borderColor = -1) { CThreeDChart_setWallColor(ptr, xyColor, yzColor, zxColor, borderColor); } void setWallThickness(int xyThickness, int yzThickness = -1, int zxThickness = -1) { CThreeDChart_setWallThickness(ptr, xyThickness, yzThickness, zxThickness); } void setWallGrid(int majorXGridColor, int majorYGridColor = -1, int majorZGridColor = -1, int minorXGridColor = -1, int minorYGridColor = -1, int minorZGridColor = -1) { CThreeDChart_setWallGrid(ptr, majorXGridColor, majorYGridColor, majorZGridColor, minorXGridColor, minorYGridColor, minorZGridColor); } }; class SurfaceChart : public ThreeDChart { private : //disable copying SurfaceChart(const SurfaceChart &rhs); SurfaceChart &operator=(const SurfaceChart &rhs); SurfaceChartInternal *ptr; public : SurfaceChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CSurfaceChart_create(width, height, bgColor, edgeColor, raisedEffect); init(SurfaceChart2ThreeDChart(ptr)); } void setData(DoubleArray xData, DoubleArray yData, DoubleArray zData) { CSurfaceChart_setData(ptr, xData.data, xData.len, yData.data, yData.len, zData.data, zData.len); } void setInterpolation(int xSamples, int ySamples = -1, bool isSmooth = true) { CSurfaceChart_setInterpolation(ptr, xSamples, ySamples, isSmooth); } void setLighting(double ambientIntensity, double diffuseIntensity, double specularIntensity, double shininess) { CSurfaceChart_setLighting(ptr, ambientIntensity, diffuseIntensity, specularIntensity, shininess); } void setShadingMode(int shadingMode, int wireWidth = 1) { CSurfaceChart_setShadingMode(ptr, shadingMode, wireWidth); } void setSurfaceAxisGrid(int majorXGridColor, int majorYGridColor = -1, int minorXGridColor = -1, int minorYGridColor = -1) { CSurfaceChart_setSurfaceAxisGrid(ptr, majorXGridColor, majorYGridColor, minorXGridColor, minorYGridColor); } void setSurfaceDataGrid(int xGridColor, int yGridColor = -1) { CSurfaceChart_setSurfaceDataGrid(ptr, xGridColor, yGridColor); } void setContourColor(int contourColor, int minorContourColor = -1) { CSurfaceChart_setContourColor(ptr, contourColor, minorContourColor); } void setBackSideBrightness(double brightness) { CSurfaceChart_setBackSideBrightness(ptr, brightness); } void setBackSideColor(int color) { CSurfaceChart_setBackSideColor(ptr, color); } void setBackSideLighting(double ambientLight, double diffuseLight, double specularLight, double shininess) { CSurfaceChart_setBackSideLighting(ptr, ambientLight, diffuseLight, specularLight, shininess); } }; class ThreeDScatterGroup : public AutoDestroy { private : //disable copying ThreeDScatterGroup(const ThreeDScatterGroup &rhs); ThreeDScatterGroup &operator=(const ThreeDScatterGroup &rhs); ThreeDScatterGroupInternal *ptr; public : ThreeDScatterGroup(ThreeDScatterGroupInternal *ptr) : ptr(ptr) {} ~ThreeDScatterGroup() {} void setDataSymbol(int symbol, int size = 5, int fillColor = -1, int edgeColor = -1, int lineWidth = 1) { CThreeDScatterGroup_setDataSymbol(ptr, symbol, size, fillColor, edgeColor, lineWidth); } void setDataSymbol(const char *image) { CThreeDScatterGroup_setDataSymbol2(ptr, image); } void setDataSymbol(const DrawArea *obj) { CThreeDScatterGroup_setDataSymbol3(ptr, obj->getInternalPtr()); } void setDataSymbol(IntArray polygon, int size = 11, int fillColor = -1, int edgeColor = -1) { CThreeDScatterGroup_setDataSymbol4(ptr, polygon.data, polygon.len, size, fillColor, edgeColor); } void setDropLine(int dropLineColor = Chart::LineColor, int dropLineWidth = 1) { CThreeDScatterGroup_setDropLine(ptr, dropLineColor, dropLineWidth); } void setLegendIcon(int width, int height = -1, int color = -1) { CThreeDScatterGroup_setLegendIcon(ptr, width, height, color); } }; class ThreeDScatterChart : public ThreeDChart { private : //disable copying ThreeDScatterChart(const ThreeDScatterChart &rhs); ThreeDScatterChart &operator=(const ThreeDScatterChart &rhs); ThreeDScatterChartInternal *ptr; public : ThreeDScatterChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CThreeDScatterChart_create(width, height, bgColor, edgeColor, raisedEffect); init(ThreeDScatterChart2ThreeDChart(ptr)); } ThreeDScatterGroup *addScatterGroup(DoubleArray xData, DoubleArray yData, DoubleArray zData, const char *name = 0, int symbol = Chart::CircleSymbol, int symbolSize = 5, int fillColor = -1, int edgeColor = -1) { ThreeDScatterGroup *ret = new ThreeDScatterGroup(CThreeDScatterChart_addScatterGroup(ptr, xData.data, xData.len, yData.data, yData.len, zData.data, zData.len, name, symbol, symbolSize, fillColor, edgeColor)); reg(ret); return ret; } }; class PolarLayer : public AutoDestroy, protected GarbageContainer { private : //disable copying PolarLayer(const PolarLayer &rhs); PolarLayer &operator=(const PolarLayer &rhs); PolarLayerInternal *ptr; public : PolarLayer(PolarLayerInternal *ptr) : ptr(ptr) {} ~PolarLayer() {} void setData(DoubleArray data, int color = -1, const char *name = 0) { CPolarLayer_setData(ptr, data.data, data.len, color, name); } void setAngles(DoubleArray angles) { CPolarLayer_setAngles(ptr, angles.data, angles.len); } void setBorderColor(int edgeColor) { CPolarLayer_setBorderColor(ptr, edgeColor); } void setLineWidth(int w) { CPolarLayer_setLineWidth(ptr, w); } void setDataSymbol(const char *image) { CPolarLayer_setDataSymbol2(ptr, image); }; void setDataSymbol(const DrawArea *obj) { CPolarLayer_setDataSymbol3(ptr, obj->getInternalPtr()); }; void setDataSymbol(int symbol, int size = 7, int fillColor = -1, int edgeColor = -1, int lineWidth = 1) { CPolarLayer_setDataSymbol(ptr, symbol, size, fillColor, edgeColor, lineWidth); } void setDataSymbol(IntArray polygon, int size = 11, int fillColor = -1, int edgeColor = -1) { CPolarLayer_setDataSymbol4(ptr, polygon.data, polygon.len, size, fillColor, edgeColor); } void setSymbolScale(DoubleArray zData, int scaleType = Chart::PixelScale) { CPolarLayer_setSymbolScale(ptr, zData.data, zData.len, scaleType); } void setImageMapWidth(int width) { CPolarLayer_setImageMapWidth(ptr, width); } const char *getImageCoor(int dataItem, int offsetX = 0, int offsetY = 0) { return CPolarLayer_getImageCoor(ptr, dataItem, offsetX, offsetY); } const char *getHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0, int offsetX = 0, int offsetY = 0) { return CPolarLayer_getHTMLImageMap(ptr, url, queryFormat, extraAttr, offsetX, offsetY); } void setHTMLImageMap(const char *url, const char *queryFormat = 0, const char *extraAttr = 0) { CPolarLayer_setHTMLImageMap(ptr, url, queryFormat, extraAttr); } void setDataLabelFormat(const char *formatString) { CPolarLayer_setDataLabelFormat(ptr, formatString); } TextBox *setDataLabelStyle(const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CPolarLayer_setDataLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} TextBox *addCustomDataLabel(int i, const char *label, const char *font = 0, double fontSize = 8, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CPolarLayer_addCustomDataLabel(ptr, i, label, font, fontSize, fontColor, fontAngle)); reg(ret); return ret;} }; class PolarAreaLayer : public PolarLayer { private : //disable copying PolarAreaLayer(const PolarAreaLayer &rhs); PolarAreaLayer &operator=(const PolarAreaLayer &rhs); public : PolarAreaLayer(PolarAreaLayerInternal *ptr) : PolarLayer(PolarAreaLayer2PolarLayer(ptr)) {} ~PolarAreaLayer() {} }; class PolarLineLayer : public PolarLayer { private : //disable copying PolarLineLayer(const PolarLineLayer &rhs); PolarLineLayer &operator=(const PolarLineLayer &rhs); PolarLineLayerInternal *ptr; public : PolarLineLayer(PolarLineLayerInternal *ptr) : PolarLayer(PolarLineLayer2PolarLayer(ptr)), ptr(ptr) {} ~PolarLineLayer() {} void setCloseLoop(bool b) { CPolarLineLayer_setCloseLoop(ptr, b); } void setGapColor(int lineColor, int lineWidth = -1) { CPolarLineLayer_setGapColor(ptr, lineColor, lineWidth); } }; class PolarSplineLineLayer : public PolarLineLayer { private : //disable copying PolarSplineLineLayer(const PolarSplineLineLayer &rhs); PolarSplineLineLayer &operator=(const PolarSplineLineLayer &rhs); PolarSplineLineLayerInternal *ptr; public : PolarSplineLineLayer(PolarSplineLineLayerInternal *ptr) : PolarLineLayer(PolarSplineLineLayer2PolarLineLayer(ptr)), ptr(ptr) {} ~PolarSplineLineLayer() {} void setTension(double tension) { CPolarSplineLineLayer_setTension(ptr, tension); } }; class PolarSplineAreaLayer : public PolarAreaLayer { private : //disable copying PolarSplineAreaLayer(const PolarSplineAreaLayer &rhs); PolarSplineAreaLayer &operator=(const PolarSplineAreaLayer &rhs); PolarSplineAreaLayerInternal *ptr; public : PolarSplineAreaLayer(PolarSplineAreaLayerInternal *ptr) : PolarAreaLayer(PolarSplineAreaLayer2PolarAreaLayer(ptr)), ptr(ptr) {} ~PolarSplineAreaLayer() {} void setTension(double tension) { CPolarSplineAreaLayer_setTension(ptr, tension); } }; class PolarVectorLayer : public PolarLayer { private : //disable copying PolarVectorLayer(const PolarVectorLayer &rhs); PolarVectorLayer &operator=(const PolarVectorLayer &rhs); PolarVectorLayerInternal *ptr; public : PolarVectorLayer(PolarVectorLayerInternal *ptr) : PolarLayer(PolarVectorLayer2PolarLayer(ptr)), ptr(ptr) {} ~PolarVectorLayer() {} void setVector(DoubleArray lengths, DoubleArray directions, int lengthScale = Chart::PixelScale) { CPolarVectorLayer_setVector(ptr, lengths.data, lengths.len, directions.data, directions.len, lengthScale); } void setArrowHead(int width, int height = 0) { CPolarVectorLayer_setArrowHead(ptr, width, height); } void setArrowHead(IntArray polygon) { CPolarVectorLayer_setArrowHead2(ptr, polygon.data, polygon.len); } void setArrowStem(IntArray polygon) { CPolarVectorLayer_setArrowStem(ptr, polygon.data, polygon.len); } void setArrowAlignment(int alignment) { CPolarVectorLayer_setArrowAlignment(ptr, alignment); } void setIconSize(int height, int width = 0) { CPolarVectorLayer_setIconSize(ptr, height, width); } void setVectorMargin(double startMargin, double endMargin = Chart::NoValue) { CPolarVectorLayer_setVectorMargin(ptr, startMargin, endMargin); } }; class PolarChart : public BaseChart { private : //disable copying PolarChart(const PolarChart &rhs); PolarChart &operator=(const PolarChart &rhs); PolarChartInternal *ptr; public : PolarChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CPolarChart_create(width, height, bgColor, edgeColor, raisedEffect); init(PolarChart2BaseChart(ptr)); } static PolarChart *create(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { return new PolarChart(width, height, bgColor, edgeColor, raisedEffect); } void setPlotArea(int x, int y, int r, int bgColor = Chart::Transparent, int edgeColor = Chart::Transparent, int edgeWidth = 1) { CPolarChart_setPlotArea(ptr, x, y, r, bgColor, edgeColor, edgeWidth); } void setPlotAreaBg(int bgColor1, int bgColor2 = -1, bool altRings = true) { CPolarChart_setPlotAreaBg(ptr, bgColor1, bgColor2, altRings); } void setGridColor(int rGridColor = 0x80000000, int rGridWidth = 1, int aGridColor = 0x80000000, int aGridWidth = 1) { CPolarChart_setGridColor(ptr, rGridColor, rGridWidth, aGridColor, aGridWidth); } void setGridStyle(bool polygonGrid, bool gridOnTop = true) { CPolarChart_setGridStyle(ptr, polygonGrid, gridOnTop); } void setStartAngle(double startAngle, bool clockwise = true) { CPolarChart_setStartAngle(ptr, startAngle, clockwise); } AngularAxis *angularAxis() { AngularAxis *ret = new AngularAxis(CPolarChart_angularAxis(ptr)); reg(ret); return ret; } RadialAxis *radialAxis() { RadialAxis *ret = new RadialAxis(CPolarChart_radialAxis(ptr)); reg(ret); return ret; } int getXCoor(double r, double a) const { return CPolarChart_getXCoor(ptr, r, a); } int getYCoor(double r, double a) const { return CPolarChart_getYCoor(ptr, r, a); } PolarAreaLayer *addAreaLayer(DoubleArray data, int color = -1, const char *name = 0) { PolarAreaLayer *ret = new PolarAreaLayer(CPolarChart_addAreaLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } PolarLineLayer *addLineLayer(DoubleArray data, int color = -1, const char *name = 0) { PolarLineLayer *ret = new PolarLineLayer(CPolarChart_addLineLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } PolarSplineLineLayer *addSplineLineLayer(DoubleArray data, int color = -1, const char *name = 0) { PolarSplineLineLayer *ret = new PolarSplineLineLayer(CPolarChart_addSplineLineLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } PolarSplineAreaLayer *addSplineAreaLayer(DoubleArray data, int color = -1, const char *name = 0) { PolarSplineAreaLayer *ret = new PolarSplineAreaLayer(CPolarChart_addSplineAreaLayer(ptr, data.data, data.len, color, name)); reg(ret); return ret; } PolarVectorLayer *addVectorLayer(DoubleArray rData, DoubleArray aData, DoubleArray lengths, DoubleArray directions, int lengthScale = Chart::PixelScale, int color = -1, const char *name = 0) { PolarVectorLayer *ret = new PolarVectorLayer(CPolarChart_addVectorLayer(ptr, rData.data, rData.len, aData.data, aData.len, lengths.data, lengths.len, directions.data, directions.len, lengthScale, color, name)); reg(ret); return ret; } }; class PyramidLayer : public AutoDestroy, protected GarbageContainer { private : //disable copying PyramidLayer(const PyramidLayer &rhs); PyramidLayer &operator=(const PyramidLayer &rhs); PyramidLayerInternal *ptr; public : PyramidLayer(PyramidLayerInternal *ptr) : ptr(ptr) {} ~PyramidLayer() {} TextBox *setCenterLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidLayer_setCenterLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } TextBox *setRightLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidLayer_setRightLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } TextBox *setLeftLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidLayer_setLeftLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } void setColor(int color) { CPyramidLayer_setColor(ptr, color); } void setJoinLine(int color , int width = -1) { CPyramidLayer_setJoinLine(ptr, color, width); } void setJoinLineGap(int pyramidGap, int pyramidMargin = -0x7fffffff, int textGap = -0x7fffffff) { CPyramidLayer_setJoinLineGap(ptr, pyramidGap, pyramidMargin, textGap); } void setLayerBorder(int color, int width = -1) { CPyramidLayer_setLayerBorder(ptr, color, width); } void setLayerGap(double layerGap) { CPyramidLayer_setLayerGap(ptr, layerGap); } }; class PyramidChart : public BaseChart { private : //disable copying PyramidChart(const PyramidChart &rhs); PyramidChart &operator=(const PyramidChart &rhs); PyramidChartInternal *ptr; public : PyramidChart(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CPyramidChart_create(width, height, bgColor, edgeColor, raisedEffect); init(PyramidChart2BaseChart(ptr)); } void setPyramidSize(int cx, int cy, int radius, int height) { CPyramidChart_setPyramidSize(ptr, cx, cy, radius, height); } void setConeSize(int cx, int cy, int radius, int height) { CPyramidChart_setConeSize(ptr, cx, cy, radius, height); } void setFunnelSize(int cx, int cy, int radius, int height, double tubeRadius = 0.2, double tubeHeight = 0.3) { CPyramidChart_setFunnelSize(ptr, cx, cy, radius, height, tubeRadius, tubeHeight); } void setData(DoubleArray data, StringArray labels = StringArray()) { CPyramidChart_setData(ptr, data.data, data.len, labels.data, labels.len); } TextBox *setCenterLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidChart_setCenterLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } TextBox *setRightLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidChart_setRightLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } TextBox *setLeftLabel(const char *labelTemplate = "{skip}", const char *font = "{skip}", double fontSize = -1, int fontColor = -1) { TextBox *ret = new TextBox(CPyramidChart_setLeftLabel(ptr, labelTemplate, font, fontSize, fontColor)); reg(ret); return ret; } void setPyramidSides(int noOfSides) { CPyramidChart_setPyramidSides(ptr, noOfSides); } void setViewAngle(double elevation, double rotation = 0, double twist = 0) { CPyramidChart_setViewAngle(ptr, elevation, rotation, twist); } void setGradientShading(double startBrightness, double endBrightness) { CPyramidChart_setGradientShading(ptr, startBrightness, endBrightness); } void setLighting(double ambientIntensity = 0.5, double diffuseIntensity = 0.5, double specularIntensity = 1, double shininess = 8) { CPyramidChart_setLighting(ptr, ambientIntensity, diffuseIntensity, specularIntensity, shininess); } void setJoinLine(int color, int width = -1) { CPyramidChart_setJoinLine(ptr, color, width); } void setJoinLineGap(int pyramidGap, int pyramidMargin = -0x7fffffff, int textGap = -0x7fffffff) { CPyramidChart_setJoinLineGap(ptr, pyramidGap, pyramidMargin, textGap); } void setLayerBorder(int color, int width = -1) { CPyramidChart_setLayerBorder(ptr, color, width); } void setLayerGap(double layerGap) { CPyramidChart_setLayerGap(ptr, layerGap); } PyramidLayer *getLayer(int layerNo) { PyramidLayerInternal *p = CPyramidChart_getLayer(ptr, layerNo); if (!p) return 0; PyramidLayer *ret = new PyramidLayer(p); reg(ret); return ret; } }; class MeterPointer : public DrawObj { //disable copying MeterPointer(const MeterPointer &rhs); MeterPointer &operator=(const MeterPointer &rhs); MeterPointerInternal *ptr; public : MeterPointer(MeterPointerInternal *ptr) : DrawObj(MeterPointer2DrawObj(ptr)), ptr(ptr) {} void setColor(int fillColor, int edgeColor = -1) { CMeterPointer_setColor(ptr, fillColor, edgeColor); } void setPos(double value) { CMeterPointer_setPos(ptr, value); } void setShape(int pointerType, double lengthRatio = Chart::NoValue, double widthRatio = Chart::NoValue) { CMeterPointer_setShape(ptr, pointerType, lengthRatio, widthRatio); } void setShape(IntArray pointerCoor, double lengthRatio = Chart::NoValue, double widthRatio = Chart::NoValue) { CMeterPointer_setShape2(ptr, pointerCoor.data, pointerCoor.len, lengthRatio, widthRatio); } }; class BaseMeter : public BaseChart { private : //disable copying BaseMeter(const BaseMeter &rhs); BaseMeter &operator=(const BaseMeter &rhs); BaseMeterInternal *ptr; public : BaseMeter() : ptr(0) {} void init(BaseMeterInternal *ptr) { this->ptr = ptr; BaseChart::init(BaseMeter2BaseChart(ptr)); } MeterPointer *addPointer(double value, int fillColor = Chart::LineColor, int edgeColor = -1) { MeterPointer *ret = new MeterPointer(CBaseMeter_addPointer(ptr, value, fillColor, edgeColor)); reg(ret); return ret; } void setScale(double lowerLimit, double upperLimit, double majorTickInc = 0, double minorTickInc = 0, double microTickInc = 0) { CBaseMeter_setScale(ptr, lowerLimit, upperLimit, majorTickInc, minorTickInc, microTickInc); } void setScale(double lowerLimit, double upperLimit, StringArray labels) { CBaseMeter_setScale2(ptr, lowerLimit, upperLimit, labels.data, labels.len); } void setScale(double lowerLimit, double upperLimit, DoubleArray labels, const char *formatString = 0) { CBaseMeter_setScale3(ptr, lowerLimit, upperLimit, labels.data, labels.len, formatString); } void addLabel(double pos, const char *label) { CBaseMeter_addLabel(ptr, pos, label); } const char *getLabel(double i) const { return CBaseMeter_getLabel(ptr, i); } DoubleArray getTicks() const { const double *d; int len; CBaseMeter_getTicks(ptr, &d, &len); return DoubleArray(d, len); } TextBox *setLabelStyle(const char *font = "bold", double fontSize = -1, int fontColor = Chart::TextColor, double fontAngle = 0) { TextBox *ret = new TextBox(CBaseMeter_setLabelStyle(ptr, font, fontSize, fontColor, fontAngle)); reg(ret); return ret; } void setLabelPos(bool labelInside, int labelOffset = 0) { CBaseMeter_setLabelPos(ptr, labelInside, labelOffset); } void setLabelFormat(const char *mainLabelFormat) { CBaseMeter_setLabelFormat(ptr, mainLabelFormat); } void setTickLength(int majorLen, int minorLen = -0x7fffffff, int microLen = -0x7fffffff) { CBaseMeter_setTickLength(ptr, majorLen, minorLen, microLen); } void setLineWidth(int axisWidth, int majorTickWidth = 1, int minorTickWidth = 1, int microTickWidth = 1) { CBaseMeter_setLineWidth(ptr, axisWidth, majorTickWidth, minorTickWidth, microTickWidth); } void setMeterColors(int axisColor, int labelColor = -1, int tickColor = -1) { CBaseMeter_setMeterColors(ptr, axisColor, labelColor, tickColor); } int getCoor(double v) const { return CBaseMeter_getCoor(ptr, v); } }; class AngularMeter : public BaseMeter { private : //disable copying AngularMeter(const AngularMeter &rhs); AngularMeter &operator=(const AngularMeter &rhs); AngularMeterInternal *ptr; public : AngularMeter(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CAngularMeter_create(width, height, bgColor, edgeColor, raisedEffect); init(AngularMeter2BaseMeter(ptr)); } void addRing(int startRadius, int endRadius, int fillColor, int edgeColor = -1) { CAngularMeter_addRing(ptr, startRadius, endRadius, fillColor, edgeColor); } void addRingSector(int startRadius, int endRadius, double a1, double a2, int fillColor, int edgeColor = -1) { CAngularMeter_addRingSector(ptr, startRadius, endRadius, a1, a2, fillColor, edgeColor); } void setCap(int radius, int fillColor, int edgeColor = Chart::LineColor) { CAngularMeter_setCap(ptr, radius, fillColor, edgeColor); } void setMeter(int cx, int cy, int radius, double startAngle, double endAngle) { CAngularMeter_setMeter(ptr, cx, cy, radius, startAngle, endAngle); } void addZone(double startValue, double endValue, int startRadius, int endRadius, int fillColor, int edgeColor = -1) { CAngularMeter_addZone(ptr, startValue, endValue, startRadius, endRadius, fillColor, edgeColor); } void addZone(double startValue, double endValue, int fillColor, int edgeColor = -1) { CAngularMeter_addZone2(ptr, startValue, endValue, fillColor, edgeColor); } }; class LinearMeter : public BaseMeter { private : //disable copying LinearMeter(const LinearMeter &rhs); LinearMeter &operator=(const LinearMeter &rhs); LinearMeterInternal *ptr; public : LinearMeter(int width, int height, int bgColor = Chart::BackgroundColor, int edgeColor = Chart::Transparent, int raisedEffect = 0) { ptr = CLinearMeter_create(width, height, bgColor, edgeColor, raisedEffect); init(LinearMeter2BaseMeter(ptr)); } void setMeter(int leftX, int topY, int width, int height, int axisPos = Chart::Left, bool isReversed = false) { CLinearMeter_setMeter(ptr, leftX, topY, width, height, axisPos, isReversed); } void setRail(int railColor, int railWidth = 2, int railOffset = 6) { CLinearMeter_setRail(ptr, railColor, railWidth, railOffset); } TextBox *addZone(double startValue, double endValue, int color, const char *label = 0) { TextBox *ret = new TextBox(CLinearMeter_addZone(ptr, startValue, endValue, color, label)); reg(ret); return ret; } }; class ArrayMath { private : ArrayMathInternal *ptr; public : ArrayMath(DoubleArray a) : ptr(CArrayMath_create(a.data, a.len)) {} ~ArrayMath() { CArrayMath_destroy(ptr); } static ArrayMath *create(DoubleArray a) { return new ArrayMath(a); } void destroy() { delete this; } ArrayMath(const ArrayMath &rhs) { DoubleArray r = rhs; ptr = CArrayMath_create(r.data, r.len); } ArrayMath &operator=(const ArrayMath &rhs) { CArrayMath_destroy(ptr); DoubleArray r = rhs; ptr = CArrayMath_create(r.data, r.len); return *this;} operator DoubleArray() const { return result(); } ArrayMath& add(DoubleArray b) { CArrayMath_add(ptr, b.data, b.len); return *this; } ArrayMath& add(double b) { CArrayMath_add2(ptr, b); return *this; } ArrayMath& sub(DoubleArray b) { CArrayMath_sub(ptr, b.data, b.len); return *this; } ArrayMath& sub(double b) { CArrayMath_sub2(ptr, b); return *this; } ArrayMath& mul(DoubleArray b) { CArrayMath_mul(ptr, b.data, b.len); return *this; } ArrayMath& mul(double b) { CArrayMath_mul2(ptr, b); return *this; } ArrayMath& div(DoubleArray b) { CArrayMath_div(ptr, b.data, b.len); return *this; } ArrayMath& div(double b) { CArrayMath_div2(ptr, b); return *this; } ArrayMath& financeDiv(DoubleArray b, double zeroByZeroValue) { CArrayMath_financeDiv(ptr, b.data, b.len, zeroByZeroValue); return *this; } ArrayMath& shift(int offset = 1, double fillValue = Chart::NoValue) { CArrayMath_shift(ptr, offset, fillValue); return *this; } ArrayMath& delta(int offset = 1) { CArrayMath_delta(ptr, offset); return *this; } ArrayMath& rate(int offset = 1) { CArrayMath_rate(ptr, offset); return *this; } ArrayMath& abs() { CArrayMath_abs(ptr); return *this; } ArrayMath& acc() { CArrayMath_acc(ptr); return *this; } ArrayMath& selectGTZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectGTZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectGEZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectGEZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectLTZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectLTZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectLEZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectLEZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectEQZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectEQZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectNEZ(DoubleArray decisionArray = DoubleArray(), double fillValue = 0) { CArrayMath_selectNEZ(ptr, decisionArray.data, decisionArray.len, fillValue); return *this; } ArrayMath& selectStartOfHour(int majorTickStep = 1, double initialMargin = 300) { CArrayMath_selectStartOfHour(ptr, majorTickStep, initialMargin); return *this; } ArrayMath& selectStartOfDay(int majorTickStep = 1, double initialMargin = 3 * 3600) { CArrayMath_selectStartOfDay(ptr, majorTickStep, initialMargin); return *this; } ArrayMath& selectStartOfWeek(int majorTickStep = 1, double initialMargin = 2 * 86400) { CArrayMath_selectStartOfWeek(ptr, majorTickStep, initialMargin); return *this; } ArrayMath& selectStartOfMonth(int majorTickStep = 1, double initialMargin = 5 * 86400) { CArrayMath_selectStartOfMonth(ptr, majorTickStep, initialMargin); return *this; } ArrayMath& selectStartOfYear(int majorTickStep = 1, double initialMargin = 60 * 86400) { CArrayMath_selectStartOfYear(ptr, majorTickStep, initialMargin); return *this; } ArrayMath& selectRegularSpacing(int majorTickStep, int minorTickStep = 0, int initialMargin = 0) { CArrayMath_selectRegularSpacing(ptr, majorTickStep, minorTickStep, initialMargin); return *this; } ArrayMath& trim(int startIndex = 0, int len = -1) { CArrayMath_trim(ptr, startIndex, len); return *this; } ArrayMath& insert(DoubleArray a, int insertPoint = -1) { CArrayMath_insert(ptr, a.data, a.len, insertPoint); return *this; } ArrayMath& insert(double c, int len, int insertPoint = -1) { CArrayMath_insert2(ptr, c, len, insertPoint); return *this; } ArrayMath& replace(double a, double b) { CArrayMath_replace(ptr, a, b); return *this; } ArrayMath& movAvg(int interval) { CArrayMath_movAvg(ptr, interval); return *this; } ArrayMath& expAvg(double smoothingFactor) { CArrayMath_expAvg(ptr, smoothingFactor); return *this; } ArrayMath& movMed(int interval) { CArrayMath_movMed(ptr, interval); return *this; } ArrayMath& movPercentile(int interval, double percentile) { CArrayMath_movPercentile(ptr, interval, percentile); return *this; } ArrayMath& movMax(int interval) { CArrayMath_movMax(ptr, interval); return *this; } ArrayMath& movMin(int interval) { CArrayMath_movMin(ptr, interval); return *this; } ArrayMath& movStdDev(int interval) { CArrayMath_movStdDev(ptr, interval); return *this; } ArrayMath& movCorr(int interval, DoubleArray b = DoubleArray()) { CArrayMath_movCorr(ptr, interval, b.data, b.len); return *this; } ArrayMath& lowess(double smoothness = 0.25, int iteration = 0) { CArrayMath_lowess(ptr, smoothness, iteration); return *this; } ArrayMath& lowess(DoubleArray b, double smoothness = 0.25, int iteration = 0) { CArrayMath_lowess2(ptr, b.data, b.len, smoothness, iteration); return *this; } DoubleArray result() const { const double *d; int len; CArrayMath_result(ptr, &d, &len); return DoubleArray(d, len); } #ifndef max double max() const { return CArrayMath_max(ptr); } #endif double maxValue() const { return CArrayMath_max(ptr); } #ifndef min double min() const { return CArrayMath_min(ptr); } #endif double minValue() const { return CArrayMath_min(ptr); } double avg() const { return CArrayMath_avg(ptr); } double sum() const { return CArrayMath_sum(ptr); } double stdDev() const { return CArrayMath_stdDev(ptr); } double med() const { return CArrayMath_med(ptr); } double percentile(double p) const { return CArrayMath_percentile(ptr, p); } int maxIndex() const { return CArrayMath_maxIndex(ptr); } int minIndex() const { return CArrayMath_minIndex(ptr); } DoubleArray aggregate(DoubleArray srcArray, int aggregateMethod, double param = 50) const { const double *d; int len; CArrayMath_aggregate(ptr, srcArray.data, srcArray.len, aggregateMethod, param, &d, &len); return DoubleArray(d, len); } }; class RanTable { private : //disable copying RanTable(const RanTable &rhs); RanTable &operator=(const RanTable &rhs); RanTableInternal *ptr; public : RanTable(int seed, int noOfCols, int noOfRows) : ptr(CRanTable_create(seed, noOfCols, noOfRows)) {} ~RanTable() { CRanTable_destroy(ptr); } static RanTable *create(int seed, int noOfCols, int noOfRows) { return new RanTable(seed, noOfCols, noOfRows); } void destroy() { delete this; } void setCol(int colNo, double minValue, double maxValue) { CRanTable_setCol(ptr, colNo, minValue, maxValue); } void setCol(int colNo, double startValue, double minDelta, double maxDelta, double lowerLimit = -1E+308, double upperLimit = 1E+308) { CRanTable_setCol2(ptr, colNo, startValue, minDelta, maxDelta, lowerLimit, upperLimit); } void setDateCol(int i, double startTime, double tickInc, bool weekDayOnly = false) { CRanTable_setDateCol(ptr, i, startTime, tickInc, weekDayOnly); } void setHLOCCols(int i, double startValue, double minDelta, double maxDelta, double lowerLimit = 0, double upperLimit = 1E+308) { CRanTable_setHLOCCols(ptr, i, startValue, minDelta, maxDelta, lowerLimit, upperLimit); } int selectDate(int colNo, double minDate, double maxDate) { return CRanTable_selectDate(ptr, colNo, minDate, maxDate); } DoubleArray getCol(int i) { const double *d; int len; CRanTable_getCol(ptr, i, &d, &len); return DoubleArray(d, len); } }; class RanSeries { private : //disable copying RanSeries(const RanSeries &rhs); RanSeries &operator=(const RanSeries &rhs); RanSeriesInternal *ptr; public : RanSeries(int seed) : ptr(CRanSeries_create(seed)) {} ~RanSeries() { CRanSeries_destroy(ptr); } static RanSeries *create(int seed) { return new RanSeries(seed); } void destroy() { delete this; } DoubleArray getSeries(int len, double minValue, double maxValue) { const double *ret; int retLen; CRanSeries_getSeries(ptr, len, minValue, maxValue, &ret, &retLen); return DoubleArray(ret, retLen); } DoubleArray getSeries(int len, double minValue, double maxValue, double maxDelta, double lowerLimit = -1E+308, double upperLimit = 1E+308) { const double *ret; int retLen; CRanSeries_getSeries2(ptr, len, minValue, maxValue, maxDelta, lowerLimit, upperLimit, &ret, &retLen); return DoubleArray(ret, retLen); } DoubleArray getDateSeries(int len, double startTime, double tickInc, bool weekDayOnly = false) { const double *ret; int retLen; CRanSeries_getDateSeries(ptr, len, startTime, tickInc, weekDayOnly, &ret, &retLen); return DoubleArray(ret, retLen); } }; class FinanceSimulator { private : //disable copying FinanceSimulator(const FinanceSimulator &rhs); FinanceSimulator &operator=(const FinanceSimulator &rhs); FinanceSimulatorInternal *ptr; public : FinanceSimulator(int seed, double startTime, double endTime, int resolution) : ptr(CFinanceSimulator_create(seed, startTime, endTime, resolution)) {} FinanceSimulator(const char *seed, double startTime, double endTime, int resolution) : ptr(CFinanceSimulator_create2(seed, startTime, endTime, resolution)) {} ~FinanceSimulator() { CFinanceSimulator_destroy(ptr); } DoubleArray getTimeStamps() { const double *d; int len; CFinanceSimulator_getTimeStamps(ptr, &d, &len); return DoubleArray(d, len); } DoubleArray getHighData() { const double *d; int len; CFinanceSimulator_getHighData(ptr, &d, &len); return DoubleArray(d, len); } DoubleArray getLowData() { const double *d; int len; CFinanceSimulator_getLowData(ptr, &d, &len); return DoubleArray(d, len); } DoubleArray getOpenData() { const double *d; int len; CFinanceSimulator_getOpenData(ptr, &d, &len); return DoubleArray(d, len); } DoubleArray getCloseData() { const double *d; int len; CFinanceSimulator_getCloseData(ptr, &d, &len); return DoubleArray(d, len); } DoubleArray getVolData() { const double *d; int len; CFinanceSimulator_getVolData(ptr, &d, &len); return DoubleArray(d, len); } }; class ImageMapHandler { private : //disable copying ImageMapHandler(const ImageMapHandler &rhs); ImageMapHandler &operator=(const ImageMapHandler &rhs); ImageMapHandlerInternal *ptr; public : ImageMapHandler(const char *imageMap) : ptr(CImageMapHandler_create(imageMap)) {} ~ImageMapHandler() { CImageMapHandler_destroy(ptr); } int getHotSpot(int x, int y) { return CImageMapHandler_getHotSpot(ptr, x, y); } const char *getValue(const char *key) { return CImageMapHandler_getValue(ptr, key); } const char *getKey(int i) { return CImageMapHandler_getKey(ptr, i); } const char *getValue(int i) { return CImageMapHandler_getValue2(ptr, i); } }; class ViewPortManager { private : //disable copying ViewPortManager(const ViewPortManager &rhs); ViewPortManager &operator=(const ViewPortManager &rhs); ViewPortManagerInternal *ptr; public : ViewPortManager() : ptr(CViewPortManager_create()) {} ~ViewPortManager() { CViewPortManager_destroy(ptr); } void setChartMetrics(const char *metrics) { CViewPortManager_setChartMetrics(ptr, metrics); } int getPlotAreaLeft() { return CViewPortManager_getPlotAreaLeft(ptr); } int getPlotAreaTop() { return CViewPortManager_getPlotAreaTop(ptr); } int getPlotAreaWidth() { return CViewPortManager_getPlotAreaWidth(ptr); } int getPlotAreaHeight() { return CViewPortManager_getPlotAreaHeight(ptr); } bool inPlotArea(int x, int y) { return CViewPortManager_inPlotArea(ptr, x, y); } double getViewPortLeft() { return CViewPortManager_getViewPortLeft(ptr); } void setViewPortLeft(double left) { CViewPortManager_setViewPortLeft(ptr, left); } double getViewPortTop() { return CViewPortManager_getViewPortTop(ptr); } void setViewPortTop(double top) { CViewPortManager_setViewPortTop(ptr, top); } double getViewPortWidth() { return CViewPortManager_getViewPortWidth(ptr); } void setViewPortWidth(double width) { CViewPortManager_setViewPortWidth(ptr, width); } double getViewPortHeight() { return CViewPortManager_getViewPortHeight(ptr); } void setViewPortHeight(double height) { CViewPortManager_setViewPortHeight(ptr, height); } void validateViewPort() { CViewPortManager_validateViewPort(ptr); } double getZoomInWidthLimit() { return CViewPortManager_getZoomInWidthLimit(ptr); } void setZoomInWidthLimit(double viewPortWidth) { CViewPortManager_setZoomInWidthLimit(ptr, viewPortWidth); } double getZoomOutWidthLimit() { return CViewPortManager_getZoomOutWidthLimit(ptr); } void setZoomOutWidthLimit(double viewPortWidth){ CViewPortManager_setZoomOutWidthLimit(ptr, viewPortWidth); } double getZoomInHeightLimit() { return CViewPortManager_getZoomInHeightLimit(ptr); } void setZoomInHeightLimit(double viewPortHeight) { CViewPortManager_setZoomInHeightLimit(ptr, viewPortHeight); } double getZoomOutHeightLimit() { return CViewPortManager_getZoomOutHeightLimit(ptr); } void setZoomOutHeightLimit(double viewPortHeight){ CViewPortManager_setZoomOutHeightLimit(ptr, viewPortHeight); } bool canZoomIn(int zoomDirection) { return CViewPortManager_canZoomIn(ptr, zoomDirection); } bool canZoomOut(int zoomDirection) { return CViewPortManager_canZoomOut(ptr, zoomDirection); } bool zoomAt(int zoomDirection, int x, int y, double zoomRatio) { return CViewPortManager_zoomAt(ptr, zoomDirection, x, y, zoomRatio); } bool zoomTo(int zoomDirection, int x1, int y1, int x2, int y2) { return CViewPortManager_zoomTo(ptr, zoomDirection, x1, y1, x2, y2); } void startDrag() { CViewPortManager_startDrag(ptr); } bool dragTo(int scrollDirection, int deltaX, int deltaY) { return CViewPortManager_dragTo(ptr, scrollDirection, deltaX, deltaY); } void setFullRange(const char *id, double minValue, double maxValue) { CViewPortManager_setFullRange(ptr, id, minValue, maxValue); } void clearAllRanges() { CViewPortManager_clearAllRanges(ptr); } double getValueAtViewPort(const char *id, double ratio, bool isLogScale = false) { return CViewPortManager_getValueAtViewPort(ptr, id, ratio, isLogScale); } double getViewPortAtValue(const char *id, double ratio, bool isLogScale = false) { return CViewPortManager_getViewPortAtValue(ptr, id, ratio, isLogScale); } void syncLinearAxisWithViewPort(const char *id, Axis *axis) { CViewPortManager_syncLinearAxisWithViewPort(ptr, id, axis->getInternalPtr()); } void syncLogAxisWithViewPort(const char *id, Axis *axis) { CViewPortManager_syncLogAxisWithViewPort(ptr, id, axis->getInternalPtr()); } void syncDateAxisWithViewPort(const char *id, Axis *axis) { CViewPortManager_syncDateAxisWithViewPort(ptr, id, axis->getInternalPtr()); } void commitPendingSyncAxis(BaseChart *c) { CViewPortManager_commitPendingSyncAxis(ptr, c->getInternalPtr()); } void setPlotAreaMouseMargin(int leftMargin, int rightMargin, int topMargin, int bottomMargin) { CViewPortManager_setPlotAreaMouseMargin(ptr, leftMargin, rightMargin, topMargin, bottomMargin); } bool inExtendedPlotArea(int x, int y) { return CViewPortManager_inExtendedPlotArea(ptr, x, y); } }; #ifndef CHARTDIR_HIDE_OBSOLETE ////////////////////////////////////////////////////////////////////////////////////// // This section is obsoleted - retained for compatibility only. // Global identifiers are now moved into the Chart namespace ////////////////////////////////////////////////////////////////////////////////////// static const double LogTick = +1.6e308; static const double NoValue = +1.7e308; static const double TouchBar = -1.7E-100; enum Alignment { TopLeft = 7, TopCenter = 8, TopRight = 9, Left = 4, Center = 5, Right = 6, BottomLeft = 1, BottomCenter = 2, BottomRight = 3, Top = TopCenter, Bottom = BottomCenter }; enum { DashLine = 0x0505, DotLine = 0x0202, DotDashLine = 0x05050205, AltDashLine = 0x0A050505 }; static const int * const goldGradient = Chart::goldGradient; static const int * const silverGradient = Chart::silverGradient; static const int * const redMetalGradient = Chart::redMetalGradient; static const int * const blueMetalGradient = Chart::blueMetalGradient; static const int * const greenMetalGradient = Chart::greenMetalGradient; enum AntiAliasMode { NoAntiAlias, AntiAlias, AutoAntiAlias }; enum PaletteMode { TryPalette, ForcePalette, NoPalette }; enum DitherMethod { Quantize, OrderedDither, ErrorDiffusion }; enum CDFilterType { BoxFilter, LinearFilter, QuadraticFilter, BSplineFilter, HermiteFilter, CatromFilter, MitchellFilter, SincFilter, LanczosFilter, GaussianFilter, HanningFilter, HammingFilter, BlackmanFilter, BesselFilter }; enum { Transparent = 0xff000000, Palette = 0xffff0000, BackgroundColor = 0xffff0000, LineColor = 0xffff0001, TextColor = 0xffff0002, DataColor = 0xffff0008, SameAsMainColor = 0xffff0007 }; enum ImgFormat {PNG, GIF, JPG, WMP, BMP}; static const int * const oldDefaultPalette = Chart::oldDefaultPalette; static const int * const defaultPalette = Chart::defaultPalette; static const int * const whiteOnBlackPalette = Chart::whiteOnBlackPalette; static const int * const transparentPalette = Chart::transparentPalette; enum {SideLayout, CircleLayout}; enum SymbolType { NoSymbol = 0, SquareSymbol = 1, DiamondSymbol = 2, TriangleSymbol = 3, RightTriangleSymbol = 4, LeftTriangleSymbol = 5, InvertedTriangleSymbol = 6, CircleSymbol = 7, CrossSymbol = 8, Cross2Symbol = 9 }; enum DataCombineMethod { Overlay, Stack, Depth, Side, Percentage }; enum LegendMode { NormalLegend, ReverseLegend, NoLegend }; enum ScaleType { PixelScale, XAxisScale, YAxisScale, AngularAxisScale = XAxisScale, RadialAxisScale = YAxisScale }; static inline int getVersion() { return Chart::getVersion(); } static inline const char * getDescription() { return Chart::getDescription(); } static inline const char * getCopyright() { return Chart::getCopyright(); } static inline bool testFont(const char *font, int fontIndex, double fontHeight, double fontWidth, double angle, char *buffer) { return Chart::testFont(font, fontIndex, fontHeight, fontWidth, angle, buffer); } static inline bool isLicensed() { return Chart::isLicensed(); } static inline bool getLicenseAttr(const char *key, char *buffer) { return Chart::getLicenseAttr(key, buffer); } static inline bool setLicenseFile(const char *filename = 0, char *buffer = 0) { return Chart::setLicenseFile(filename, buffer); } static inline bool setLicenseCode(const char *licCode, char *buffer = 0) { return Chart::setLicenseCode(licCode, buffer); } static inline double chartTime(int y, int m, int d, int h = 0, int n = 0, int s = 0) { return Chart::chartTime(y, m, d, h, n, s); } static inline double chartTime2(int t) { return Chart::chartTime2(t); } //#ifndef CHARTDIR_HIDE_OBSOLETE #endif //#ifndef CCHARTDIR_HDR #endif