//------------------------------------------------------------------------------//
        // BitmapManager SetDisplayData()
        //------------------------------------------------------------------------------//
        // Function may be used to either set display data or set extemes of data
        // displayed.  If paramater "StateData' then this function has to have been
        // previously called with a non-null 'StateData'
        // If parameter 'StateData' is null its corresponding member variable
        // 'm_stateData' remains untouched.
        public void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData, DATA_EXTREMES_SPE_BITMAP DataExtremes,
            DATA_EXTREMES_SPE_BITMAP MovementDataExtremes, Boolean MaintainScaling)
        {
            // If parameter 'StateData' is null verify it's corresponding member variable isn't.
            if(StateData == null)
                Debug.Assert(m_stateData != null);

            // Assign parameters to their corresponding member variables.
            if(StateData != null)
                m_stateData = StateData;

            // Set up the bitmaps with the new data.
            m_diveTimeScale.SetDisplayData(m_stateData, DataExtremes, MaintainScaling);
            m_depthScale.SetDisplayData(m_stateData, DataExtremes, MaintainScaling);
            m_dive.SetDisplayData(m_stateData, DataExtremes, MaintainScaling);

            // Movement map currently always needs the extremes of the actual data passed
            // in.
            m_movement.SetDisplayData(m_stateData, MovementDataExtremes, MaintainScaling);

            m_parentForm.Invalidate();
        }
        //------------------------------------------------------------------------------//
        // Movement Bitmap UpdateDataDisplay()
        //------------------------------------------------------------------------------//
        public override void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData,
            DATA_EXTREMES_SPE_BITMAP StateDataExtremes, Boolean MaintainScaling)
        {
            int xStartMeters;
            int xEndMeters;
            int yStartMeters;
            int yEndMeters;

            base.SetDisplayData(StateData, StateDataExtremes, MaintainScaling);

            m_timeStartIndex = 0;
            m_timeEndIndex = StateData.Length - 1;

            // These are for the hashmarks
            xStartMeters = (int)Math.Floor(StateDataExtremes.xMin); // longitude start
            xEndMeters = (int)Math.Ceiling(StateDataExtremes.xMax); // longitude end
            yStartMeters = (int)Math.Floor(StateDataExtremes.yMin); // latitude start
            yEndMeters = (int)Math.Ceiling(StateDataExtremes.yMax); // latitude end

            if(xStartMeters < yStartMeters)
                m_startMeters = xStartMeters;
            else
                m_startMeters = yStartMeters;

            if(xEndMeters > yEndMeters)
                m_endMeters = xEndMeters;
            else
                m_endMeters = yEndMeters;

            RedrawBitmap();
        }
        //------------------------------------------------------------------------------//
        // Dive Scale Bitmap SetDisplayData()
        //------------------------------------------------------------------------------//
        public override void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData,
            DATA_EXTREMES_SPE_BITMAP StateDataExtremes, Boolean MaintainScaling)
        {
            base.SetDisplayData(StateData, StateDataExtremes, MaintainScaling); // copies it to local variables

            if(MaintainScaling == false)
            {
                // time scale sliders
                m_sliderSet.min.point = new Point(m_dataRect.X, m_pixelPosMinTopSlider);
                m_sliderSet.max.point = new Point(m_dataRect.X, m_pixelPosMaxBottomSlider);
                m_sliderSet.mid.point = new Point(m_dataRect.X + m_dataRect.Width / 2, m_pixelPosMinTopSlider + (m_pixelPosMaxBottomSlider - m_pixelPosMinTopSlider) / 2);
                m_scaleValue = (float)(m_pixelPosMaxBottomSlider - m_pixelPosMinTopSlider) / (float)m_sliderRange;
            }
        }
        //------------------------------------------------------------------------------//
        // Dive Scale Bitmap SetDisplayData()
        //------------------------------------------------------------------------------//
        // Called when new data is generated and needs to be displayed.
        public override void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData,
            DATA_EXTREMES_SPE_BITMAP StateDataExtremes, Boolean MaintainScaling)
        {
            int i;
            int xPixel;
            int zPixel;
            float delta;
            base.SetDisplayData(StateData, StateDataExtremes, MaintainScaling);



            m_bitmap = new Bitmap(m_dataRect.Width, m_dataRect.Height);

            if(StateData.Length > 1 && m_dataRect.Width > 1)
                m_dataScale.x = ((float)m_dataRect.Width-1/*-1 for zero index*/)/(float)(StateData.Length-1); // pixels per datum
            else
                m_dataScale.x = 1.0F;

            delta = (float)(StateDataExtremes.zMax - StateDataExtremes.zMin);
            if(delta <= 0)
                delta = 1;

            if(m_dataRect.Height > 1)
                m_dataScale.y = (m_dataRect.Height - 1)/delta; // pixels per datum
            else
                m_dataScale.y = 1.0F;

            for(i=0; i<m_stateData.Length; i++)
            {
                xPixel = (int)Math.Floor(m_dataScale.x*i); // minus 1 for zero index
                zPixel = (int)Math.Floor(m_dataScale.y*(m_stateData[i].z - StateDataExtremes.zMin));

                ds.x = m_dataScale.x;
                ds.y = m_dataScale.y;

                m_bitmap.SetPixel(xPixel, zPixel, GetCurrentBehaviorColor(m_stateData[i].animatState.behavior));
            }

            // Calculate the number of data points each pixel represents.
            m_dataPointsPerPixle = (float)m_stateData.Length / (float)m_dataRect.Width;

            if(MaintainScaling == false)
            {
                // time scale sliders
                m_sliderSet.min.point = new Point(m_pixlePntMinLSlider, m_dataRect.Y);
                m_sliderSet.max.point = new Point(m_pixlePntMaxRSlider, m_dataRect.Y);
                m_sliderSet.mid.point = new Point(m_pixlePntMinLSlider + (m_pixlePntMaxRSlider - m_pixlePntMinLSlider) / 2, m_dataRect.Y + m_dataRect.Height / 2);

                m_scaleValue = (float)(m_sliderSet.max.point.X - m_sliderSet.min.point.X) / (float)m_sliderRange;
            }
        }
        private DATA_EXTREMES_SPE_BITMAP DetermineDataExtremes(ANIMATSTATEDATABITMAP[] StateData)
        {
            int i;
            DATA_EXTREMES_SPE_BITMAP ex;

            ex.xMax = ex.xMin = StateData[0].x;
            ex.yMax = ex.yMin = StateData[0].y;
            ex.zMax = ex.zMin = StateData[0].z;
            if(ex.zMax < StateData[0].targetDepth)
                ex.zMax = StateData[0].targetDepth;
            if(ex.zMin > StateData[0].targetDepth)
                ex.zMin = StateData[0].targetDepth;

            for(i = 0; i < StateData.Length; i++)
            {
                if(ex.xMax < StateData[i].x)
                    ex.xMax = StateData[i].x;
                if(ex.xMin > StateData[i].x)
                    ex.xMin = StateData[i].x;
                if(ex.yMax < StateData[i].y)
                    ex.yMax = StateData[i].y;
                if(ex.yMin > StateData[i].y)
                    ex.yMin = StateData[i].y;

                if(ex.zMax < StateData[i].z)
                    ex.zMax = StateData[i].z;
                if(ex.zMin > StateData[i].z)
                    ex.zMin = StateData[i].z;

                if(ex.zMax < StateData[i].targetDepth)
                    ex.zMax = StateData[i].targetDepth;
                if(ex.zMin > StateData[i].targetDepth)
                    ex.zMin = StateData[i].targetDepth;
            }

            // Give some margin at the top and bottom of the dive profile.
            ex.zMin -= 20;
            ex.zMax += 20;
            return ex;
        }
 //------------------------------------------------------------------------------//
 // Species Bitmap Window Constructor
 //------------------------------------------------------------------------------//
 public virtual void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData, DATA_EXTREMES_SPE_BITMAP DataExtremes, Boolean MaintainScaling)
 {
     m_stateData = StateData;
     m_dataExtremes = DataExtremes;
     m_bMaintainsScaleOnNewData = MaintainScaling;
 }
        //------------------------------------------------------------------------------//
        // Dive Bitmap SetDisplayData()
        //------------------------------------------------------------------------------//
        public override void SetDisplayData(ANIMATSTATEDATABITMAP[] StateData, DATA_EXTREMES_SPE_BITMAP DataExtremes,
            Boolean MaintainScaling)
        {
            Debug.Assert(StateData != null);

            m_stateData = StateData;
            m_dataExtremes = DataExtremes;

            m_displayInf.noDisplay = false;
            if(StateData.Length <= 1)
            {
                m_displayInf.noDisplay = true;
                return;
            }

            if(MaintainScaling == false)
            {

                // Initially (until user scales the time) the number of seconds to
                // display is equal to the length of the data array passed in.
                m_timeStartIndex = 0;
                m_timeEndIndex = m_stateData.Length - 1;

                m_displayInf.fDepthStartMeters = DataExtremes.zMin;
                m_displayInf.fDepthEndMeters = DataExtremes.zMax;

                m_displayInf.nDepthStartMeters = (int)Math.Floor(DataExtremes.zMin);
                m_displayInf.nDepthEndMeters = (int)Math.Ceiling(DataExtremes.zMax);

                // Scale the display based on the passed in display data.
                UpdateXYScale();
            }

            // Redraw the bitmap.
            ConstructBitmap();
        }