public PlayThread(FrameRenderer renderer)
 {
     mStateLock = new Object();
       ThreadState = PlayThreadState.Stopped;
       mRenderer = renderer;
       PlaySpeed = 1.0f;
 }
        public MainDesignerForm()
        {
            InitializeComponent();

              // The key press handler is used to track key presses across the whole
              // application.
              mKeyPressHandler = new KeyPressHandler(this);
              Application.AddMessageFilter(mKeyPressHandler);

              frameCollection.SetParentForm(this);
              frameCollection.ModelChanged(mPlayModel);

              // Set up the model history for tracking changes.
              mModelHistory = new ModelHistory();

              // Initialise the frame renderer. This component is responsible for
              // drawing the frame whilst it is being designed.
              mFrameRenderer = new FrameRenderer(BackColor,
                                         Settings.Default.PitchColor,
                                         Settings.Default.LineColor);
              viewPanel.PlayingThread = new PlayThread(mFrameRenderer);
              viewPanel.CurrentFrame = AddFrame();
              viewPanel.Renderer = mFrameRenderer;
              viewPanel.IsDesignMode = true;
              viewPanel.DesignerForm = this;
              viewPanel.VisualOverlay = new VisualOverlay();
              viewPanel.KeyPressHandler = mKeyPressHandler;

              // Can't set the selected index of the drop down for the play speeds
              // until the objects are all added to the frame.
              playSpeedCombo.SelectedIndex = 1;

              // Need to set the current frame on the frame collection so that the
              // correct frame is increased in size.
              frameCollection.CurrentFrameChanged(viewPanel.CurrentFrame);

              if (Settings.Default.ShowUpgradeDialog)
              {
            mVersionChecker = new VersionChecker(this);
              }
        }
        /// <summary>
        /// Whenever the model or the current frame changes we need to change the 
        /// background image to one which represents the new model. This is done
        /// by building up a bitmap one frame at a time.
        /// </summary>
        /// <returns>The new background image</returns>
        private void CreateBackgroundImage()
        {
            float currFrameX = FRAME_PADDING_X;
              int frameWidth;
              int frameHeight;
              int frameYPadding;
              int frameXPadding;

              // Before rendering the background this function calculates what size
              // the small frames should be displayed as.
              RecalculateSizes();

              using (FrameRenderer renderer = new FrameRenderer(BackColor,
                                                        Settings.Default.PitchColor,
                                                        Settings.Default.LineColor))
              {
            Bitmap background = new Bitmap(calculateBackgroundWidth(),
                                       mSelectedFrameHeight +
                                       UNSELECTED_FRAME_Y_PADDING * 2);
            using (Graphics canvas = Graphics.FromImage(background))
            {
              canvas.Clear(Color.FromArgb(40, 40, 40));

              foreach (PlayFrame frame in mPlayModel.GetAllFrames())
              {
            if (frame == mCurrentFrame)
            {
              frameHeight = mSelectedFrameHeight;
              frameWidth = mSelectedFrameWidth;
              frameXPadding = FRAME_PADDING_X;
              frameYPadding = SELECTED_FRAME_Y_PADDING;
            }
            else
            {
              frameHeight = mUnselectedFrameHeight;
              frameWidth = mUnselectedFrameWidth;
              frameXPadding = FRAME_PADDING_X;
              frameYPadding = UNSELECTED_FRAME_Y_PADDING;
            }

            using (Bitmap frameImage = new Bitmap(frameWidth, frameHeight))
            {
              using (Graphics frameCanvas = Graphics.FromImage(frameImage))
              {
                renderer.DrawSmallFrame(frame,
                                    frameCanvas,
                                    new PitchScreenCoordConverter(frameCanvas));

                canvas.DrawImage(frameImage, currFrameX, frameYPadding);

                // Add the links for this frame onto the image.
                DrawLinks(canvas,
                          frame,
                          currFrameX,
                          frameHeight, frameWidth,
                          frameXPadding, frameYPadding);

                currFrameX += frameWidth + frameXPadding;
              }
            }
              }

              if (mImage != null) mImage.Dispose();
              mImage = background;
            }
              }
        }
        public override void Render(Graphics display, 
                                FrameRenderer renderer, 
                                PitchScreenCoordConverter converter)
        {
            // Adjust the item location so that the location is at the centre of
              // the image.
              DrawLocation = new PointF(ItemLocation.X - mWidth / 2.0f,
                                ItemLocation.Y - mHeight / 2.0f);

              renderer.DrawSprite(display, converter, mSprite, DrawLocation, mWidth, mHeight);
        }
        public override void Render(Graphics display,
                                FrameRenderer renderer,
                                PitchScreenCoordConverter converter)
        {
            base.Render(display, renderer, converter);

              using (Font font = FrameRenderer.CreatePlayerIdFont(converter))
              {
            renderer.DrawString(display,
                            converter,
                            ItemProperties["id"],
                            DrawLocation,
                            font,
                            Brushes.White);
              }
        }
 public abstract void Render(Graphics display, 
                         FrameRenderer renderer,
                         PitchScreenCoordConverter converter);
        /// <summary>
        /// Takes a model and outputs it as a set of images to the output directory. 
        /// Note that if the files already exist then they'll be removed
        /// </summary>
        /// <param name="outputDir">Location for temporary images.</param>
        private void ModelToImageFiles(String outputDir)
        {
            mCallback.Begin(0, mModel.CycleCount / 4);

              Color backColor = Color.FromArgb(40, 40, 40);
              using (FrameRenderer renderer = new FrameRenderer(backColor, Settings.Default.PitchColor, Settings.Default.LineColor))
              {
            using (Bitmap bitmap = new Bitmap((int)(Settings.Default.PitchLength * 10.0f),
                                          (int)(Settings.Default.PitchWidth * 10.0f)))
            {
              using (Graphics graphics = Graphics.FromImage(bitmap))
              {
            int imageIndex = 0;
            FramePlayData fpd;
            foreach (PlayFrame frame in mModel.GetAllFrames())
            {
              fpd = frame.GenerateViewingData();

              // I made a cop out decision to allow for slow speed playback by
              // creating 4 times as many cycles as needed. Here though we want
              // to keep the output format as small as possible so only 1 in every
              // 4 frames is displayed.
              //
              // Frankly, this is terrible and will definitely bite me later on.
              int ii = 0;
              foreach (List<ItemPlayData> cycleData in fpd.PlayData)
              {
                ii++;
                if (ii % 4 != 0 && cycleData != fpd.PlayData.Last()) continue; // Thusly do I cry.
                PitchScreenCoordConverter converter = new PitchScreenCoordConverter(graphics);

                graphics.Clear(backColor);
                renderer.DrawPitch(graphics, converter);

                foreach (ItemPlayData itemPlayData in cycleData)
                {
                  itemPlayData.Render(graphics, renderer, converter);
                }

                imageIndex++;
                BitmapExtensions.SaveJpg100(bitmap, outputDir + Path.DirectorySeparatorChar + "image" +
                  imageIndex.ToString("D6", CultureInfo.InvariantCulture) + ".jpg");

                mCallback.Increment(1);
              }
            }
              }
            }
              }
        }