| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693 | using UnityEngine;using UnityEngine.EventSystems;using UnityEngine.UI;using XUGL;#if INPUT_SYSTEM_ENABLEDusing Input = XCharts.Runtime.InputHelper;#endifnamespace XCharts.Runtime{    [UnityEngine.Scripting.Preserve]    internal sealed class DataZoomHandler : MainComponentHandler<DataZoom>    {        private static readonly string s_DefaultDataZoom = "datazoom";        private Vector2 m_LastTouchPos0;        private Vector2 m_LastTouchPos1;        private bool m_CheckDataZoomLabel;        private float m_DataZoomLastStartIndex;        private float m_DataZoomLastEndIndex;        public override void InitComponent()        {            var dataZoom = component;            dataZoom.painter = chart.m_PainterUpper;            dataZoom.refreshComponent = delegate ()            {                var dataZoomObject = ChartHelper.AddObject(s_DefaultDataZoom + dataZoom.index, chart.transform,                    chart.chartMinAnchor, chart.chartMaxAnchor, chart.chartPivot, chart.chartSizeDelta);                dataZoom.gameObject = dataZoomObject;                dataZoomObject.hideFlags = chart.chartHideFlags;                ChartHelper.HideAllObject(dataZoomObject);                var startLabel = ChartHelper.AddChartLabel(s_DefaultDataZoom + "start", dataZoomObject.transform,                    dataZoom.labelStyle, chart.theme.dataZoom, "", Color.clear, TextAnchor.MiddleRight);                startLabel.gameObject.SetActive(true);                var endLabel = ChartHelper.AddChartLabel(s_DefaultDataZoom + "end", dataZoomObject.transform,                    dataZoom.labelStyle, chart.theme.dataZoom, "", Color.clear, TextAnchor.MiddleLeft);                endLabel.gameObject.SetActive(true);                dataZoom.SetStartLabel(startLabel);                dataZoom.SetEndLabel(endLabel);                dataZoom.SetLabelActive(false);                foreach (var index in dataZoom.xAxisIndexs)                {                    var xAxis = chart.GetChartComponent<XAxis>(index);                    if (xAxis != null)                    {                        xAxis.UpdateFilterData(dataZoom);                    }                }                foreach (var serie in chart.series)                {                    SerieHelper.UpdateFilterData(serie, dataZoom);                }            };            dataZoom.refreshComponent();        }        public override void Update()        {            CheckDataZoomScale(component);            CheckDataZoomLabel(component);        }        public override void DrawUpper(VertexHelper vh)        {            if (chart == null)                return;            var dataZoom = component;            switch (dataZoom.orient)            {                case Orient.Horizonal:                    DrawHorizonalDataZoomSlider(vh, dataZoom);                    DrawMarquee(vh, dataZoom);                    break;                case Orient.Vertical:                    DrawVerticalDataZoomSlider(vh, dataZoom);                    DrawMarquee(vh, dataZoom);                    break;            }        }        public override void OnBeginDrag(PointerEventData eventData)        {            if (chart == null)                return;            if (Input.touchCount > 1)                return;            var dataZoom = component;            if (!dataZoom.enable)                return;            Vector2 pos;            if (!chart.ScreenPointToChartPoint(eventData.position, out pos))                return;            var grid = chart.GetGridOfDataZoom(dataZoom);            if (dataZoom.supportInside && dataZoom.supportInsideDrag)            {                if (grid.Contains(pos))                {                    dataZoom.context.isCoordinateDrag = true;                }            }            if (dataZoom.supportMarquee)            {                dataZoom.context.isMarqueeDrag = true;                dataZoom.context.marqueeStartPos = pos;                dataZoom.context.marqueeEndPos = pos;                if (dataZoom.marqueeStyle.realRect)                    dataZoom.context.marqueeRect = new Rect(pos.x, pos.y, 0, 0);                else                    dataZoom.context.marqueeRect = new Rect(pos.x, grid.context.y, 0, grid.context.height);                if (dataZoom.marqueeStyle.onStart != null)                {                    dataZoom.marqueeStyle.onStart(dataZoom);                }                return;            }            if (dataZoom.supportSlider)            {                if (!dataZoom.zoomLock)                {                    if (dataZoom.IsInStartZoom(pos))                    {                        dataZoom.context.isStartDrag = true;                    }                    else if (dataZoom.IsInEndZoom(pos))                    {                        dataZoom.context.isEndDrag = true;                    }                    else if (dataZoom.IsInSelectedZoom(pos))                    {                        dataZoom.context.isDrag = true;                    }                }                else if (dataZoom.IsInSelectedZoom(pos))                {                    dataZoom.context.isDrag = true;                }            }        }        public override void OnDrag(PointerEventData eventData)        {            if (chart == null)                return;            if (Input.touchCount > 1)                return;            var dataZoom = component;            var grid = chart.GetGridOfDataZoom(dataZoom);            if (dataZoom.supportMarquee)            {                Vector2 pos;                if (!chart.ScreenPointToChartPoint(eventData.position, out pos))                    return;                dataZoom.context.marqueeEndPos = pos;                var oldRect = dataZoom.context.marqueeRect;                var rectWidth = pos.x - dataZoom.context.marqueeStartPos.x;                if (dataZoom.marqueeStyle.realRect)                    dataZoom.context.marqueeRect = Rect.MinMaxRect(dataZoom.context.marqueeStartPos.x, pos.y, pos.x, dataZoom.context.marqueeStartPos.y);                else                    dataZoom.context.marqueeRect = new Rect(oldRect.x, oldRect.y, rectWidth, oldRect.height);                dataZoom.SetVerticesDirty();                if (dataZoom.marqueeStyle.onGoing != null)                    dataZoom.marqueeStyle.onGoing(dataZoom);                return;            }            else            {                switch (dataZoom.orient)                {                    case Orient.Horizonal:                        var deltaPercent = eventData.delta.x / grid.context.width * 100;                        OnDragInside(dataZoom, deltaPercent);                        OnDragSlider(dataZoom, deltaPercent);                        break;                    case Orient.Vertical:                        deltaPercent = eventData.delta.y / grid.context.height * 100;                        OnDragInside(dataZoom, deltaPercent);                        OnDragSlider(dataZoom, deltaPercent);                        break;                }            }        }        public override void OnEndDrag(PointerEventData eventData)        {            if (chart == null)                return;            var dataZoom = component;            if (dataZoom.supportMarquee)            {                dataZoom.context.isMarqueeDrag = false;                if (dataZoom.marqueeStyle.apply)                {                    var grid = chart.GetGridOfDataZoom(dataZoom);                    var start = (dataZoom.context.marqueeRect.x - grid.context.x) / grid.context.width * 100;                    var end = (dataZoom.context.marqueeRect.x - grid.context.x + dataZoom.context.marqueeRect.width) / grid.context.width * 100;                    UpdateDataZoomRange(dataZoom, start, end);                }                if (dataZoom.marqueeStyle.onEnd != null)                {                    dataZoom.marqueeStyle.onEnd(dataZoom);                }                return;            }            if (dataZoom.context.isDrag || dataZoom.context.isStartDrag || dataZoom.context.isEndDrag ||                dataZoom.context.isCoordinateDrag)            {                chart.RefreshChart();            }            dataZoom.context.isDrag = false;            dataZoom.context.isCoordinateDrag = false;            dataZoom.context.isStartDrag = false;            dataZoom.context.isEndDrag = false;        }        public override void OnPointerDown(PointerEventData eventData)        {            if (chart == null)                return;            if (Input.touchCount > 1)                return;            Vector2 localPos;            if (!chart.ScreenPointToChartPoint(eventData.position, out localPos))                return;            var dataZoom = component;            var grid = chart.GetGridOfDataZoom(dataZoom);            if (dataZoom.IsInStartZoom(localPos) ||                dataZoom.IsInEndZoom(localPos))            {                return;            }            if (dataZoom.IsInZoom(localPos) &&                !dataZoom.IsInSelectedZoom(localPos))            {                var pointerX = localPos.x;                var selectWidth = grid.context.width * (dataZoom.end - dataZoom.start) / 100;                var startX = pointerX - selectWidth / 2;                var endX = pointerX + selectWidth / 2;                if (startX < grid.context.x)                {                    startX = grid.context.x;                    endX = grid.context.x + selectWidth;                }                else if (endX > grid.context.x + grid.context.width)                {                    endX = grid.context.x + grid.context.width;                    startX = grid.context.x + grid.context.width - selectWidth;                }                var start = (startX - grid.context.x) / grid.context.width * 100;                var end = (endX - grid.context.x) / grid.context.width * 100;                UpdateDataZoomRange(dataZoom, start, end);            }        }        public override void OnScroll(PointerEventData eventData)        {            if (chart == null)                return;            if (Input.touchCount > 1)                return;            var dataZoom = component;            if (!dataZoom.enable || dataZoom.zoomLock)                return;            Vector2 pos;            if (!chart.ScreenPointToChartPoint(eventData.position, out pos))                return;            var grid = chart.GetGridOfDataZoom(dataZoom);            if ((dataZoom.supportInside && dataZoom.supportInsideScroll && grid.Contains(pos)) ||                dataZoom.IsInZoom(pos))            {                ScaleDataZoom(dataZoom, eventData.scrollDelta.y * dataZoom.scrollSensitivity);            }        }        private void OnDragInside(DataZoom dataZoom, float deltaPercent)        {            if (deltaPercent == 0)                return;            if (Input.touchCount > 1)                return;            if (!dataZoom.supportInside || !dataZoom.supportInsideDrag)                return;            if (!dataZoom.context.isCoordinateDrag)                return;            var diff = dataZoom.end - dataZoom.start;            if (deltaPercent > 0)            {                if (dataZoom.start > 0)                {                    var start = dataZoom.start - deltaPercent;                    if (start < 0) start = 0;                    var end = start + diff;                    UpdateDataZoomRange(dataZoom, start, end);                }            }            else            {                if (dataZoom.end < 100)                {                    var end = dataZoom.end - deltaPercent;                    if (end > 100) end = 100;                    var start = end - diff;                    UpdateDataZoomRange(dataZoom, start, end);                }            }        }        private void OnDragSlider(DataZoom dataZoom, float deltaPercent)        {            if (Input.touchCount > 1)                return;            if (!dataZoom.supportSlider)                return;            if (dataZoom.context.isStartDrag)            {                var start = dataZoom.start + deltaPercent;                if (start > dataZoom.end)                {                    start = dataZoom.end;                    dataZoom.context.isEndDrag = true;                    dataZoom.context.isStartDrag = false;                }                UpdateDataZoomRange(dataZoom, start, dataZoom.end);            }            else if (dataZoom.context.isEndDrag)            {                var end = dataZoom.end + deltaPercent;                if (end < dataZoom.start)                {                    end = dataZoom.start;                    dataZoom.context.isStartDrag = true;                    dataZoom.context.isEndDrag = false;                }                UpdateDataZoomRange(dataZoom, dataZoom.start, end);            }            else if (dataZoom.context.isDrag)            {                if (deltaPercent > 0)                {                    if (dataZoom.end + deltaPercent > 100) deltaPercent = 100 - dataZoom.end;                }                else                {                    if (dataZoom.start + deltaPercent < 0) deltaPercent = -dataZoom.start;                }                UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end + deltaPercent);            }        }        private void ScaleDataZoom(DataZoom dataZoom, float delta)        {            var grid = chart.GetGridOfDataZoom(dataZoom);            var deltaPercent = dataZoom.orient == Orient.Horizonal ?                Mathf.Abs(delta / grid.context.width * 100) :                Mathf.Abs(delta / grid.context.height * 100);            if (delta > 0)            {                if (dataZoom.end <= dataZoom.start)                    return;                UpdateDataZoomRange(dataZoom, dataZoom.start + deltaPercent, dataZoom.end - deltaPercent);            }            else            {                UpdateDataZoomRange(dataZoom, dataZoom.start - deltaPercent, dataZoom.end + deltaPercent);            }        }        public void UpdateDataZoomRange(DataZoom dataZoom, float start, float end)        {            if (end > 100)                end = 100;            if (start < 0)                start = 0;            if (end < start)                end = start;            if (dataZoom.startEndFunction != null)                dataZoom.startEndFunction(ref start, ref end);            if (!dataZoom.startLock)                dataZoom.start = start;            if (!dataZoom.endLock)                dataZoom.end = end;            if (dataZoom.realtime)            {                chart.OnDataZoomRangeChanged(dataZoom);                chart.RefreshChart();            }        }        public void RefreshDataZoomLabel()        {            m_CheckDataZoomLabel = true;        }        private void CheckDataZoomScale(DataZoom dataZoom)        {            if (!dataZoom.enable || dataZoom.zoomLock || !dataZoom.supportInside || !dataZoom.supportInsideDrag)                return;            if (Input.touchCount == 2)            {                var touch0 = Input.GetTouch(0);                var touch1 = Input.GetTouch(1);                if (touch1.phase == TouchPhase.Began)                {                    m_LastTouchPos0 = touch0.position;                    m_LastTouchPos1 = touch1.position;                }                else if (touch0.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)                {                    var tempPos0 = touch0.position;                    var tempPos1 = touch1.position;                    var currDist = Vector2.Distance(tempPos0, tempPos1);                    var lastDist = Vector2.Distance(m_LastTouchPos0, m_LastTouchPos1);                    var delta = (currDist - lastDist);                    ScaleDataZoom(dataZoom, delta / dataZoom.scrollSensitivity);                    m_LastTouchPos0 = tempPos0;                    m_LastTouchPos1 = tempPos1;                }            }        }        private void CheckDataZoomLabel(DataZoom dataZoom)        {            if (dataZoom.enable && dataZoom.supportSlider && dataZoom.showDetail)            {                Vector2 local;                if (!chart.ScreenPointToChartPoint(Input.mousePosition, out local))                {                    dataZoom.SetLabelActive(false);                    return;                }                if (dataZoom.IsInSelectedZoom(local) ||                    dataZoom.IsInStartZoom(local) ||                    dataZoom.IsInEndZoom(local))                {                    dataZoom.SetLabelActive(true);                    RefreshDataZoomLabel();                }                else                {                    dataZoom.SetLabelActive(false);                }            }            if (m_CheckDataZoomLabel && dataZoom.xAxisIndexs.Count > 0)            {                m_CheckDataZoomLabel = false;                var xAxis = chart.GetChartComponent<XAxis>(dataZoom.xAxisIndexs[0]);                var startIndex = (int)((xAxis.data.Count - 1) * dataZoom.start / 100);                var endIndex = (int)((xAxis.data.Count - 1) * dataZoom.end / 100);                if (m_DataZoomLastStartIndex != startIndex || m_DataZoomLastEndIndex != endIndex)                {                    m_DataZoomLastStartIndex = startIndex;                    m_DataZoomLastEndIndex = endIndex;                    if (xAxis.data.Count > 0)                    {                        dataZoom.SetStartLabelText(xAxis.data[startIndex]);                        dataZoom.SetEndLabelText(xAxis.data[endIndex]);                    }                    else if (xAxis.IsTime())                    {                        //TODO:                        dataZoom.SetStartLabelText("");                        dataZoom.SetEndLabelText("");                    }                    xAxis.SetAllDirty();                }                var start = dataZoom.context.x + dataZoom.context.width * dataZoom.start / 100;                var end = dataZoom.context.x + dataZoom.context.width * dataZoom.end / 100;                var hig = dataZoom.context.height;                dataZoom.UpdateStartLabelPosition(new Vector3(start - 10, chart.chartY + dataZoom.bottom + hig / 2));                dataZoom.UpdateEndLabelPosition(new Vector3(end + 10, chart.chartY + dataZoom.bottom + hig / 2));            }        }        private void DrawHorizonalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)        {            if (!dataZoom.enable || !dataZoom.supportSlider)                return;            var p1 = new Vector3(dataZoom.context.x, dataZoom.context.y);            var p2 = new Vector3(dataZoom.context.x, dataZoom.context.y + dataZoom.context.height);            var p3 = new Vector3(dataZoom.context.x + dataZoom.context.width, dataZoom.context.y + dataZoom.context.height);            var p4 = new Vector3(dataZoom.context.x + dataZoom.context.width, dataZoom.context.y);            var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);            var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);            var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;            var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);            var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);            var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);            UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);            var centerPos = new Vector3(dataZoom.context.x + dataZoom.context.width / 2,                dataZoom.context.y + dataZoom.context.height / 2);            UGL.DrawBorder(vh, centerPos, dataZoom.context.width, dataZoom.context.height, borderWidth, borderColor);            if (dataZoom.showDataShadow && chart.series.Count > 0)            {                Serie serie = chart.series[0];                Axis axis = chart.GetChartComponent<YAxis>(0);                var showData = serie.GetDataList(null);                float scaleWid = dataZoom.context.width / (showData.Count - 1);                Vector3 lp = Vector3.zero;                Vector3 np = Vector3.zero;                double minValue = 0;                double maxValue = 0;                SeriesHelper.GetYMinMaxValue(chart, 0, axis.inverse, out minValue, out maxValue, false, false);                AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);                int rate = 1;                var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;                var maxCount = showData.Count;                if (sampleDist > 0)                    rate = (int)((maxCount - serie.minShow) / (dataZoom.context.width / sampleDist));                if (rate < 1)                    rate = 1;                var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :                    DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);                var dataChanging = false;                var animationDuration = serie.animation.GetChangeDuration();                var dataAddDuration = serie.animation.GetAdditionDuration();                var unscaledTime = serie.animation.unscaledTime;                for (int i = 0; i < maxCount; i += rate)                {                    double value = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,                        dataAddDuration, animationDuration, ref dataChanging, axis, unscaledTime);                    float pX = dataZoom.context.x + i * scaleWid;                    float dataHig = (float)((maxValue - minValue) == 0 ? 0 :                        (value - minValue) / (maxValue - minValue) * dataZoom.context.height);                    np = new Vector3(pX, chart.chartY + dataZoom.bottom + dataHig);                    if (i > 0)                    {                        UGL.DrawLine(vh, lp, np, lineWidth, lineColor);                        Vector3 alp = new Vector3(lp.x, lp.y - lineWidth);                        Vector3 anp = new Vector3(np.x, np.y - lineWidth);                        Vector3 tnp = new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);                        Vector3 tlp = new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);                        UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);                    }                    lp = np;                }                if (dataChanging)                {                    chart.RefreshTopPainter();                }            }            switch (dataZoom.rangeMode)            {                case DataZoom.RangeMode.Percent:                    var start = dataZoom.context.x + dataZoom.context.width * dataZoom.start / 100;                    var end = dataZoom.context.x + dataZoom.context.width * dataZoom.end / 100;                    var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);                    p1 = new Vector2(start, dataZoom.context.y);                    p2 = new Vector2(start, dataZoom.context.y + dataZoom.context.height);                    p3 = new Vector2(end, dataZoom.context.y + dataZoom.context.height);                    p4 = new Vector2(end, dataZoom.context.y);                    UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);                    UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);                    UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);                    break;            }        }        private void DrawVerticalDataZoomSlider(VertexHelper vh, DataZoom dataZoom)        {            if (!dataZoom.enable || !dataZoom.supportSlider)                return;            var p1 = new Vector3(dataZoom.context.x, dataZoom.context.y);            var p2 = new Vector3(dataZoom.context.x, dataZoom.context.y + dataZoom.context.height);            var p3 = new Vector3(dataZoom.context.x + dataZoom.context.width, dataZoom.context.y + dataZoom.context.height);            var p4 = new Vector3(dataZoom.context.x + dataZoom.context.width, dataZoom.context.y);            var lineColor = dataZoom.lineStyle.GetColor(chart.theme.dataZoom.dataLineColor);            var lineWidth = dataZoom.lineStyle.GetWidth(chart.theme.dataZoom.dataLineWidth);            var borderWidth = dataZoom.borderWidth == 0 ? chart.theme.dataZoom.borderWidth : dataZoom.borderWidth;            var borderColor = dataZoom.GetBorderColor(chart.theme.dataZoom.borderColor);            var backgroundColor = dataZoom.GetBackgroundColor(chart.theme.dataZoom.backgroundColor);            var areaColor = dataZoom.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);            UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, backgroundColor);            var centerPos = new Vector3(dataZoom.context.x + dataZoom.context.width / 2,                dataZoom.context.y + dataZoom.context.height / 2);            UGL.DrawBorder(vh, centerPos, dataZoom.context.width, dataZoom.context.height, borderWidth, borderColor);            if (dataZoom.showDataShadow && chart.series.Count > 0)            {                Serie serie = chart.series[0];                Axis axis = chart.GetChartComponent<YAxis>(0);                var showData = serie.GetDataList(null);                float scaleWid = dataZoom.context.height / (showData.Count - 1);                Vector3 lp = Vector3.zero;                Vector3 np = Vector3.zero;                double minValue = 0;                double maxValue = 0;                SeriesHelper.GetYMinMaxValue(chart, 0, axis.inverse, out minValue, out maxValue);                AxisHelper.AdjustMinMaxValue(axis, ref minValue, ref maxValue, true);                int rate = 1;                var sampleDist = serie.sampleDist < 2 ? 2 : serie.sampleDist;                var maxCount = showData.Count;                if (sampleDist > 0)                    rate = (int)((maxCount - serie.minShow) / (dataZoom.context.height / sampleDist));                if (rate < 1)                    rate = 1;                var totalAverage = serie.sampleAverage > 0 ? serie.sampleAverage :                    DataHelper.DataAverage(ref showData, serie.sampleType, serie.minShow, maxCount, rate);                var dataChanging = false;                var animationDuration = serie.animation.GetChangeDuration();                var dataAddDuration = serie.animation.GetAdditionDuration();                var unscaledTime = serie.animation.unscaledTime;                for (int i = 0; i < maxCount; i += rate)                {                    double value = DataHelper.SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,                        dataAddDuration, animationDuration, ref dataChanging, axis, unscaledTime);                    float pY = dataZoom.context.y + i * scaleWid;                    float dataHig = (maxValue - minValue) == 0 ? 0 :                        (float)((value - minValue) / (maxValue - minValue) * dataZoom.context.width);                    np = new Vector3(chart.chartX + chart.chartWidth - dataZoom.right - dataHig, pY);                    if (i > 0)                    {                        UGL.DrawLine(vh, lp, np, lineWidth, lineColor);                        Vector3 alp = new Vector3(lp.x, lp.y - lineWidth);                        Vector3 anp = new Vector3(np.x, np.y - lineWidth);                        Vector3 tnp = new Vector3(np.x, chart.chartY + dataZoom.bottom + lineWidth);                        Vector3 tlp = new Vector3(lp.x, chart.chartY + dataZoom.bottom + lineWidth);                        UGL.DrawQuadrilateral(vh, alp, anp, tnp, tlp, areaColor);                    }                    lp = np;                }                if (dataChanging)                {                    chart.RefreshTopPainter();                }            }            switch (dataZoom.rangeMode)            {                case DataZoom.RangeMode.Percent:                    var start = dataZoom.context.y + dataZoom.context.height * dataZoom.start / 100;                    var end = dataZoom.context.y + dataZoom.context.height * dataZoom.end / 100;                    var fillerColor = dataZoom.GetFillerColor(chart.theme.dataZoom.fillerColor);                    p1 = new Vector2(dataZoom.context.x, start);                    p2 = new Vector2(dataZoom.context.x + dataZoom.context.width, start);                    p3 = new Vector2(dataZoom.context.x + dataZoom.context.width, end);                    p4 = new Vector2(dataZoom.context.x, end);                    UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, fillerColor);                    UGL.DrawLine(vh, p1, p2, lineWidth, fillerColor);                    UGL.DrawLine(vh, p3, p4, lineWidth, fillerColor);                    break;            }        }        private void DrawMarquee(VertexHelper vh, DataZoom dataZoom)        {            if (!dataZoom.enable || !dataZoom.supportMarquee)                return;            var areaColor = dataZoom.marqueeStyle.areaStyle.GetColor(chart.theme.dataZoom.dataAreaColor);            UGL.DrawRectangle(vh, dataZoom.context.marqueeRect, areaColor);        }    }}
 |