private void MarkImage(Token t) { if (t == null) { originalImageArea.Image = originalImage; return; } Gdk.Pixbuf originalMarked = originalImage.Copy(); // We tint the copy in red. originalMarked = originalMarked.CompositeColorSimple(originalMarked.Width, originalMarked.Height, Gdk.InterpType.Bilinear, 100, 1, 0xAAAAAA, 0xAAAAAA); // Over the red tinted copy, we place the piece we want to be // normal. originalImage.CopyArea(t.Left, t.Top, t.Width, t.Height, originalMarked, t.Left, t.Top); originalImageArea.Image = originalMarked; }
/// <summary> /// If sequencing, selects the next symbol of the list. /// </summary> /// <param name="sender"> /// A <see cref="System.Object"/> /// </param> /// <param name="args"> /// A <see cref="EventArgas"/> /// </param> private void OnControllerNodeBeingProcessed(object sender, NodeBeingProcessedArgs _args) { Application.Invoke(sender, _args, delegate(object resender, EventArgs args) { NodeBeingProcessedArgs a = args as NodeBeingProcessedArgs; if (!sequencingFinished) { // We are sequencing. // Selects the new first. symbolsIV.SelectPath(processedPath); symbolsIV.ScrollToPath(processedPath, 1, 0.5f); processedPath.Next(); } else { // We are matching SequenceNode node = (SequenceNode)a.Node; node.Select(); Token t = Token.Join(node.Sequence, ""); sequenceNodeImage = t.Image.CreatePixbuf(); sequenceMatchingImageArea.Image = sequenceNodeImage.Copy(); sequenceNodeImage = sequenceNodeImage.CompositeColorSimple(sequenceNodeImage.Width, sequenceNodeImage.Height, Gdk.InterpType.Nearest, 100, 1, 0xAAAAAA, 0xAAAAAA); matchingResultLbl.Markup = "-"; tokenizingRulesTV.Selection.UnselectAll(); tokenizingRulesTV.ScrollToPoint(0, 0); if (controller.StepMode == ControllerStepMode.StepByStep) { tokenizingNextButtonsAlign.Sensitive = true; } } }); }
/// <summary> /// If sequencing, selects the next symbol of the list. /// </summary> /// <param name="sender"> /// A <see cref="System.Object"/> /// </param> /// <param name="args"> /// A <see cref="EventArgas"/> /// </param> private void OnControllerNodeBeingProcessed(object sender, NodeBeingProcessedArgs _args) { Application.Invoke(sender, _args, delegate(object resender, EventArgs args) { NodeBeingProcessedArgs a = args as NodeBeingProcessedArgs; if(!sequencingFinished) { // We are sequencing. // Selects the new first. symbolsIV.SelectPath(processedPath); symbolsIV.ScrollToPath(processedPath,1,0.5f); processedPath.Next(); } else { // We are matching SequenceNode node = (SequenceNode) a.Node; node.Select(); Token t = Token.Join(node.Sequence, ""); sequenceNodeImage = t.Image.CreatePixbuf(); sequenceMatchingImageArea.Image = sequenceNodeImage.Copy(); sequenceNodeImage = sequenceNodeImage.CompositeColorSimple(sequenceNodeImage.Width, sequenceNodeImage.Height, Gdk.InterpType.Nearest, 100, 1, 0xAAAAAA,0xAAAAAA); matchingResultLbl.Markup = "-"; tokenizingRulesTV.Selection.UnselectAll(); tokenizingRulesTV.ScrollToPoint(0,0); if(controller.StepMode == ControllerStepMode.StepByStep) { tokenizingNextButtonsAlign.Sensitive = true; } } }); }
/// <summary> /// Handles the start of processing of a new node. /// </summary> /// <param name="sender"> /// A <see cref="System.Object"/> /// </param> /// <param name="args"> /// A <see cref="EventArgs"/> /// </param> private void OnControllerTokenChecked(object sender, TokenCheckedArgs args) { Application.Invoke(sender, args, delegate(object resender, EventArgs _args) { TokenCheckedArgs a = _args as TokenCheckedArgs; if (!sequencingFinished) { currentToken = a.CurrentToken; FloatBitmap sequenceImage; if (a.LastSequence != null) { TokenSequence joinSeq = new TokenSequence(a.LastSequence); lastToken = joinSeq.Last; joinSeq.Append(currentToken); Token joinedToken = Token.Join(joinSeq, ""); sequenceImage = joinedToken.Image; } else { sequenceImage = currentToken.Image; lastToken = null; } // We add a border to the orginal image. Gdk.Pixbuf sequencePixbuf = sequenceImage.CreatePixbuf(); Gdk.Pixbuf drawnImage = new Gdk.Pixbuf(sequencePixbuf.Colorspace, false, 8, sequencePixbuf.Width + 10, sequencePixbuf.Height + 10); drawnImage.Fill(0xFFFFFFFF); sequencePixbuf.CopyArea(0, 0, sequencePixbuf.Width, sequencePixbuf.Height, drawnImage, 5, 5); if (lastToken != null) { uint color; if (currentToken.CloseFollows(lastToken)) { color = 0x00FF00; sequencingStepResultLbl.Markup = String.Format("<b>Sí, el símbolo «{0}» se añadirá a la secuencia actual</b>", currentToken.Text); } else { color = 0xFF0000; sequencingStepResultLbl.Markup = String.Format("<b>No, «{0}» no puede ser considerado parte de la secuencia ({1})</b>", currentToken.Text, a.LastSequence.ToString()); } Gdk.Pixbuf markedImage = drawnImage.Copy(); // We paint the image of the color markedImage = markedImage.CompositeColorSimple(markedImage.Width, markedImage.Height, Gdk.InterpType.Nearest, 100, 1, color, color); // We are going to mark the image of the to symbols being considered // with their baselines. int min = int.MaxValue; foreach (Token t in a.LastSequence) { if (t.Top < min) { min = t.Top; } } int offset = Math.Min(min, currentToken.Top); int lastBaseline = lastToken.Baseline - offset; int currentBaseline = currentToken.Baseline - offset; markedImage.CopyArea(0, lastBaseline, markedImage.Width, 5, drawnImage, 0, lastBaseline); markedImage.CopyArea(0, currentBaseline, markedImage.Width, 5, drawnImage, 0, currentBaseline); } baselineImageArea.Image = drawnImage; } if (controller.StepMode == ControllerStepMode.StepByStep) { tokenizingNextButtonsAlign.Sensitive = true; } }); }