public SlideImageMgr(PresenterWireFormatType format, int width, int height) { this.format = format; currentSlide = new SlideReference(); this.exportWidth = width; this.exportHeight = height; //Set the default background colors if ((format == PresenterWireFormatType.CPCapability) || (format == PresenterWireFormatType.CPNav)) { currentSlide.SetBGColor(Color.PapayaWhip); } else { currentSlide.SetBGColor(Color.White); } if (format == PresenterWireFormatType.CP3) { cp3Mgr = new CP3Manager.CP3Manager(); } slideImages = new Hashtable(); orgToResource = new Hashtable(); nullSlide = null; }
/// <summary> /// Return the raw bitmap representing the current presentation state /// </summary> /// <param name="frame"></param> public void GetCurrentFrame(out BufferChunk frame) { frame = null; if ((currentSlide.IsSet) && (slideImages.ContainsKey(currentSlide.GetStringHashCode()))) { frame = ((SlideImage)slideImages[currentSlide.GetStringHashCode()]).GenerateFrame(currentSlide.Size, currentSlide.BGColor, this.exportWidth, this.exportHeight); } else { //If we don't have a current slide, return a blank frame. if (nullSlide == null) { nullSlide = new SlideImage(); } frame = nullSlide.GenerateFrame(1.0, Color.PapayaWhip, this.exportWidth, this.exportHeight); } }
private void acceptArchiveRTNavFrame(object o) { if (o is ArchiveRTNav.RTUpdate) { //Navigation and slide size changes ArchiveRTNav.RTUpdate rtu = (ArchiveRTNav.RTUpdate)o; String key = SlideReference.MakeKey(rtu.DeckGuid, rtu.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } if (!rtu.DeckAssociation.Equals(Guid.Empty)) { //Student submission or quickpoll //The slide image may come from a presentation slide. Here we want to store the current slide image. String refKey = SlideReference.MakeKey(rtu.DeckAssociation, rtu.SlideAssociation); if (slideImages.ContainsKey(refKey)) { SlideImage sourceImage = (SlideImage)slideImages[refKey]; bool isWhiteboard = true; Image img = sourceImage.GetSlideImage(this.currentSlide.BGColor, out isWhiteboard); ((SlideImage)slideImages[key]).SetImage(img, isWhiteboard); } } currentSlide.SetCPReference(rtu.DeckGuid, rtu.SlideIndex); currentSlide.SetSize(rtu.SlideSize); currentSlide.SetBGColor(rtu.BackgroundColor); } else if (o is ArchiveRTNav.RTDrawStroke) { ArchiveRTNav.RTDrawStroke rtds = (ArchiveRTNav.RTDrawStroke)o; String key = SlideReference.MakeKey(rtds.DeckGuid, rtds.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).AddInk(rtds.Ink, rtds.Guid); } else if (o is ArchiveRTNav.RTDeleteStroke) { ArchiveRTNav.RTDeleteStroke rtds = (ArchiveRTNav.RTDeleteStroke)o; String key = SlideReference.MakeKey(rtds.DeckGuid, rtds.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveInk(rtds.Guid); } else if (o is ArchiveRTNav.RTTextAnnotation) { ArchiveRTNav.RTTextAnnotation rtta = (ArchiveRTNav.RTTextAnnotation)o; String key = SlideReference.MakeKey(rtta.DeckGuid, rtta.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).AddTextAnnotation(rtta.Text, rtta.Origin, rtta.Guid, rtta.Font, rtta.Color, rtta.Height, rtta.Width); } else if (o is ArchiveRTNav.RTImageAnnotation) { ArchiveRTNav.RTImageAnnotation rtia = (ArchiveRTNav.RTImageAnnotation)o; String key = SlideReference.MakeKey(rtia.DeckGuid, rtia.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).AddImageAnnotation(rtia.Guid, rtia.Height, rtia.Width, rtia.Origin, rtia.Img); } else if (o is ArchiveRTNav.RTDeleteTextAnnotation) { ArchiveRTNav.RTDeleteTextAnnotation rtdta = (ArchiveRTNav.RTDeleteTextAnnotation)o; String key = SlideReference.MakeKey(rtdta.DeckGuid, rtdta.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveTextAnnotation(rtdta.Guid); } else if (o is ArchiveRTNav.RTDeleteAnnotation) { ArchiveRTNav.RTDeleteAnnotation rtda = (ArchiveRTNav.RTDeleteAnnotation)o; String key = SlideReference.MakeKey(rtda.DeckGuid, rtda.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveAnnotation(rtda.Guid); } else if (o is ArchiveRTNav.RTEraseLayer) { ArchiveRTNav.RTEraseLayer rtel = (ArchiveRTNav.RTEraseLayer)o; String key = SlideReference.MakeKey(rtel.DeckGuid, rtel.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveAllInk(); } else if (o is ArchiveRTNav.RTEraseAllLayers) { ArchiveRTNav.RTEraseAllLayers rteal = (ArchiveRTNav.RTEraseAllLayers)o; if (rteal.DeckGuid != Guid.Empty) { foreach (String key in slideImages.Keys) { if (key.StartsWith(rteal.DeckGuid.ToString())) { ((SlideImage)slideImages[key]).RemoveAllInk(); } } } } else if (o is ArchiveRTNav.RTQuickPoll) { ArchiveRTNav.RTQuickPoll rtqp = (ArchiveRTNav.RTQuickPoll)o; String key = SlideReference.MakeKey(rtqp.DeckGuid, rtqp.SlideIndex); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).UpdateQuickPoll(rtqp); } else { Debug.WriteLine("Slide Image Manager does not handle type: " + o.GetType().ToString()); } //Notice that CP3 doesn't support scrolling mylar, so we don't bother with it here. }
/// <summary> /// Frames sent by Classroom Presenter 2.0 in Native stand-alone mode /// </summary> /// <param name="rtobj"></param> private void acceptCPNavFrame(object rtobj) { if (rtobj is PresenterNav.CPPageUpdate) { /// Presenter sends these once per second. These indicate current slide index, deck index /// and deck type. Just use this to update the current slide pointer PresenterNav.CPPageUpdate cppu = (PresenterNav.CPPageUpdate)rtobj; currentSlide.SetCPReference(cppu.DocRef.GUID, cppu.PageRef.Index); //CPPageUpdate has a deck type too, but we're not using it for now. //DumpPageUpdate((PresenterNav.CPPageUpdate)rtobj); } else if (rtobj is PresenterNav.CPScrollLayer) { ///Presenter sends these once per second, and during a scroll operation. ///Set the scroll position for the slide in question. PresenterNav.CPScrollLayer cpsl = (PresenterNav.CPScrollLayer)rtobj; String key = SlideReference.MakeKey(cpsl.DocRef.GUID, cpsl.PageRef.Index); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).SetScrollPos(cpsl.ScrollPosition, cpsl.ScrollExtent); //DumpScrollLayer((PresenterNav.CPScrollLayer)rtobj); } else if (rtobj is PresenterNav.CPDeckCollection) { //Presenter sends this once per second. The only thing we want to get from //this is the slide size (former ScreenConfiguration). This is a 'global' setting, not a per-slide setting. PresenterNav.CPDeckCollection cpdc = (PresenterNav.CPDeckCollection)rtobj; currentSlide.SetSize(cpdc.ViewPort.SlideSize); //DumpDeckCollection((PresenterNav.CPDeckCollection)rtobj); //The CPDeckCollection also has slide titles, but we don't care about them here. } else if (rtobj is WorkSpace.BeaconPacket) //the original beacon { //Presenter sends this once per second. The only thing we want to get from //this is the background color. This is another global presentation setting. WorkSpace.BeaconPacket bp = (WorkSpace.BeaconPacket)rtobj; currentSlide.SetBGColor(bp.BGColor); //DumpBeacon((BeaconPacket)rtobj); } else if (rtobj is PresenterNav.CPDrawStroke) //add a stroke { PresenterNav.CPDrawStroke cpds = (PresenterNav.CPDrawStroke)rtobj; String key = SlideReference.MakeKey(cpds.DocRef.GUID, cpds.PageRef.Index); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).AddInk(cpds.Stroke.Ink, cpds.Stroke.Guid); } else if (rtobj is PresenterNav.CPDeleteStroke) //delete one stroke { PresenterNav.CPDeleteStroke cpds = (PresenterNav.CPDeleteStroke)rtobj; String key = SlideReference.MakeKey(cpds.DocRef.GUID, cpds.PageRef.Index); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveInk(cpds.Guid); } else if (rtobj is PresenterNav.CPEraseLayer) //clear all strokes from one page { PresenterNav.CPEraseLayer cpel = (PresenterNav.CPEraseLayer)rtobj; String key = SlideReference.MakeKey(cpel.DocRef.GUID, cpel.PageRef.Index); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } ((SlideImage)slideImages[key]).RemoveAllInk(); } else if (rtobj is PresenterNav.CPEraseAllLayers) //clear all strokes from a deck { PresenterNav.CPEraseAllLayers cpeal = (PresenterNav.CPEraseAllLayers)rtobj; if (cpeal.DocRef.GUID != Guid.Empty) { foreach (String key in slideImages.Keys) { if (key.StartsWith(cpeal.DocRef.GUID.ToString())) { ((SlideImage)slideImages[key]).RemoveAllInk(); } } } } else if (rtobj is WorkSpace.OverlayMessage) //Student submission received { //These are seen when Student Submissions are submitted to the instructor, not when they are displayed. WorkSpace.OverlayMessage om = (WorkSpace.OverlayMessage)rtobj; String key = SlideReference.MakeKey(om.FeedbackDeck.GUID, om.SlideIndex.Index); if (!slideImages.ContainsKey(key)) { slideImages.Add(key, new SlideImage()); } //The slide image comes from a presentation slide. Here we want to store the current slide image. String refKey = SlideReference.MakeKey(om.PresentationDeck.GUID, om.PDeckSlideIndex.Index); if (slideImages.ContainsKey(refKey)) { SlideImage sourceImage = (SlideImage)slideImages[refKey]; bool isWhiteboard = true; Image img = sourceImage.GetSlideImage(this.currentSlide.BGColor, out isWhiteboard); ((SlideImage)slideImages[key]).SetImage(img, isWhiteboard); } //Add the ink from the student submission //OtherScribble appears to contain both student ink and any pre-existing instructor ink, but I think it //used to be in UserScribble. Let's include all ink in both scribbles. ((SlideImage)slideImages[key]).AddInk(((SlideViewer.InkScribble)om.SlideOverlay.UserScribble).Ink); ((SlideImage)slideImages[key]).AddInk(((SlideViewer.InkScribble)om.SlideOverlay.OtherScribble).Ink); } else if (rtobj is WorkSpace.ScreenConfigurationMessage) { // nothing to do here. } else { Type t = rtobj.GetType(); Debug.WriteLine("Unhandled Type:" + t.ToString()); } }