// TODO: Correctly Draw the Slide Annotation
        private void DrawSlide( DeckTraversalModel traversal, int index, System.Drawing.Rectangle rect, System.Drawing.Graphics buffer )
        {
            // Save the old state
            System.Drawing.Drawing2D.GraphicsState oldState;

            using( Synchronizer.Lock( traversal.SyncRoot ) ) {
                using( Synchronizer.Lock( traversal.Deck.SyncRoot ) ) {
                    using( Synchronizer.Lock( traversal.Deck.TableOfContents.SyncRoot ) ) {
                        TableOfContentsModel.Entry entry = traversal.Deck.TableOfContents.Entries[index];
                        using( Synchronizer.Lock( entry.Slide.SyncRoot ) ) {
                            //Draw the background color
                            //First see if there is a Slide BG, if not, try the Deck. Otherwise, use transparent.
                            if( entry.Slide.BackgroundColor != Color.Empty ) {
                                buffer.FillRectangle( new System.Drawing.SolidBrush( entry.Slide.BackgroundColor ), rect );
                            } else if( traversal.Deck.DeckBackgroundColor != Color.Empty ) {
                                buffer.FillRectangle( new System.Drawing.SolidBrush( traversal.Deck.DeckBackgroundColor ), rect );
                            } else {
                                buffer.FillRectangle( new System.Drawing.SolidBrush( Color.Transparent ), rect );
                            }

                            //Get the Slide content and draw it
                            oldState = buffer.Save();
                            Model.Presentation.SlideModel.SheetCollection sheets = entry.Slide.ContentSheets;
                            for( int i = 0; i < sheets.Count; i++ ) {
                                SlideDisplayModel display = new SlideDisplayModel( buffer, null );

                                Rectangle slide = rect;
                                float zoom = 1f;
                                if( entry.Slide != null ) {
                                    slide = entry.Slide.Bounds;
                                    zoom = entry.Slide.Zoom;
                                }

                                System.Drawing.Drawing2D.Matrix pixel, ink;
                                display.FitSlideToBounds(System.Windows.Forms.DockStyle.Fill, rect, zoom, ref slide, out pixel, out ink);
                                using(Synchronizer.Lock(display.SyncRoot)) {
                                    display.Bounds = slide;
                                    display.PixelTransform = pixel;
                                    display.InkTransform = ink;
                                }

                                Viewer.Slides.SheetRenderer r = Viewer.Slides.SheetRenderer.ForStaticSheet( display, sheets[i] );
                                r.Paint( new System.Windows.Forms.PaintEventArgs(buffer, rect) );
                                r.Dispose();
                            }

                            //Restore the Old State
                            buffer.Restore( oldState );
                            oldState = buffer.Save();

                            //Get the Annotation content and draw it
                            sheets = entry.Slide.AnnotationSheets;
                            for( int i = 0; i < sheets.Count; i++ ) {
                                SlideDisplayModel display = new SlideDisplayModel( buffer, null );

                                Rectangle slide = rect;
                                float zoom = 1f;
                                if( entry.Slide != null ) {
                                    slide = entry.Slide.Bounds;
                                    zoom = entry.Slide.Zoom;
                                }

                                System.Drawing.Drawing2D.Matrix pixel, ink;
                                display.FitSlideToBounds(System.Windows.Forms.DockStyle.Fill, rect, zoom, ref slide, out pixel, out ink);
                                using(Synchronizer.Lock(display.SyncRoot)) {
                                    display.Bounds = slide;
                                    display.PixelTransform = pixel;
                                    display.InkTransform = ink;
                                }

                                Viewer.Slides.SheetRenderer r = Viewer.Slides.SheetRenderer.ForStaticSheet( display, sheets[i] );
                                if( r is Viewer.Slides.InkSheetRenderer ) {
                                    ((Viewer.Slides.InkSheetRenderer)r).Paint( buffer, rect );
                                }
                                else
                                    r.Paint( new System.Windows.Forms.PaintEventArgs(buffer, rect) );
                                r.Dispose();
                            }

                            //Restore the Old State
                            buffer.Restore( oldState );
            /*
                            Microsoft.Ink.Renderer renderer = new Microsoft.Ink.Renderer();
                            for( int i = 0; i < sheets.Count; i++ ) {
                                SheetModel sm = sheets[i];
                                if( sm is InkSheetModel ) {
                                    InkSheetModel ism = sm as InkSheetModel;
                                    using( Synchronizer.Lock( ism.SyncRoot ) ) {
                                        foreach( Microsoft.Ink.Stroke stroke in ism.Ink.Strokes ) {
                                            renderer.Draw( buffer, stroke );
                                        }
                                    }
                                } else if( sm is TextSheetModel ) {
                                    TextSheetModel tsm = sm as TextSheetModel;
                                    using( Synchronizer.Lock( tsm.SyncRoot ) ) {
                                        buffer.DrawString( tsm.Text, tsm.Font, new SolidBrush( tsm.Color ), tsm.Bounds );
                                    }
                                } else if( sm is ImageSheetModel ) {
                                    //add any images in the AnnotationSheets
                                    ImageSheetModel image_sheet_model = (ImageSheetModel)sm;
                                    using( Synchronizer.Lock( image_sheet_model.SyncRoot ) ) {
                                         buffer.DrawImage( image_sheet_model.Image, image_sheet_model.Bounds );
                                    }
                                } else {
                                    //Unknown, skip it
                                    continue;
                                }
                            }
            */
                        }
                    }
                }
            }
        }
        private void DrawSlide2( DeckTraversalModel traversal, int index, System.Drawing.Rectangle displayBounds, System.Drawing.Graphics g )
        {
            float width_scale = g.DpiX / 100f;
            float height_scale = g.DpiY / 100f;

            Rectangle bounds = new Rectangle( 0, 0, (int)(displayBounds.Width * 3f), (int)(displayBounds.Height * 3f) );

            // Create an image using temporary graphics and graphics buffer object
            Bitmap imageForPrinting = new Bitmap( bounds.Width, bounds.Height );
            using( Graphics graphicsImage = Graphics.FromImage( imageForPrinting ) ) {
                using( DibGraphicsBuffer dib = new DibGraphicsBuffer() ) {
                    // Create temporary screen Graphics
                    System.Windows.Forms.Form tempForm = new System.Windows.Forms.Form();
                    Graphics screenGraphics = tempForm.CreateGraphics();

                    // Create temporary Graphics from the Device Independent Bitmap
                    using( Graphics graphicsTemp = dib.RequestBuffer( screenGraphics, imageForPrinting.Width, imageForPrinting.Height ) ) {

                        // Save the old state
                        System.Drawing.Drawing2D.GraphicsState oldState;

                        using( Synchronizer.Lock( traversal.SyncRoot ) ) {
                            using( Synchronizer.Lock( traversal.Deck.SyncRoot ) ) {
                                using( Synchronizer.Lock( traversal.Deck.TableOfContents.SyncRoot ) ) {
                                    TableOfContentsModel.Entry entry = traversal.Deck.TableOfContents.Entries[index];
                                    using( Synchronizer.Lock( entry.Slide.SyncRoot ) ) {

                                        //Draw the background color
                                        //First see if there is a Slide BG, if not, try the Deck. Otherwise, use transparent.
                                        if( entry.Slide.BackgroundColor != Color.Empty ) {
                                            graphicsTemp.Clear( entry.Slide.BackgroundColor );
                                        } else if( traversal.Deck.DeckBackgroundColor != Color.Empty ) {
                                            graphicsTemp.Clear( traversal.Deck.DeckBackgroundColor );
                                        } else {
                                            graphicsTemp.Clear( Color.Transparent );
                                        }

                                        //Get the Slide content and draw it
                                        oldState = graphicsTemp.Save();
                                        Model.Presentation.SlideModel.SheetCollection sheets = entry.Slide.ContentSheets;
                                        for( int i = 0; i < sheets.Count; i++ ) {
                                            SlideDisplayModel display = new SlideDisplayModel( graphicsTemp, null );

                                            Rectangle rect = new Rectangle( 0, 0, bounds.Width, bounds.Height );
                                            Rectangle slide = new Rectangle( rect.X, rect.Y, rect.Width, rect.Height );
                                            float zoom = 1f;
                                            if( entry.Slide != null ) {
                                                slide = entry.Slide.Bounds;
                                                zoom = entry.Slide.Zoom;
                                            }

                                            System.Drawing.Drawing2D.Matrix pixel, ink;
                                            display.FitSlideToBounds( System.Windows.Forms.DockStyle.Fill, rect, zoom, ref slide, out pixel, out ink );
                                            using( Synchronizer.Lock( display.SyncRoot ) ) {
                                                display.Bounds = slide;
                                                display.PixelTransform = pixel;
                                                display.InkTransform = ink;
                                            }

                                            Viewer.Slides.SheetRenderer r = Viewer.Slides.SheetRenderer.ForStaticSheet( display, sheets[i] );
                                            r.Paint( new System.Windows.Forms.PaintEventArgs( graphicsTemp, bounds ) );
                                            r.Dispose();
                                        }

                                    }
                                }
                            }
                        }

                        //Restore the Old State
                        graphicsTemp.Restore( oldState );

                        // Use the buffer to paint onto the final image
                        dib.PaintBuffer( graphicsImage, 0, 0 );

                        // Draw this image onto the printer graphics,
                        // adjusting for printer margins
                        g.DrawImage( imageForPrinting, displayBounds );

                        //Cleanup
                        graphicsTemp.Dispose();
                        screenGraphics.Dispose();
                        tempForm.Dispose();
                        dib.Dispose();
                        graphicsImage.Dispose();
                        imageForPrinting.Dispose();
                    }
                }
            }
        }