public ProcessingResult <ICollection <ICroppedArea> > CropUserInput(Bitmap bitmapToCropIntoParts, Guid documentId,
                                                                            ITemplatePageDefinition definitionForCropping)
        {
            if (definitionForCropping == null)
            {
                return(ProcessingResult <ICollection <ICroppedArea> > .Failure(new PageDefinitionNotProvided()));
            }

            if (documentId == Guid.Empty)
            {
                return(ProcessingResult <ICollection <ICroppedArea> > .Failure(new MissingDocumentId()));
            }

            //Can this be more granular without downloading bitmap all over again?
            //Maybe parent holding bitmap and just passing it over to all children?
            using (bitmapToCropIntoParts)
            {
                var results = new List <ICroppedArea>();
                foreach (var templateArea in definitionForCropping.DefinedAreas)
                {
                    try
                    {
                        var croppedAreaParts = new List <OrderedBitmap>();

                        if (templateArea.InterestPoints == null || templateArea.InterestPoints.Count == 0)
                        {
                            croppedAreaParts.Add(
                                new OrderedBitmap(0, new Crop(templateArea.AreaDimension).Apply(bitmapToCropIntoParts)));
                        }
                        else
                        {
                            foreach (var areaPart in templateArea.InterestPoints)
                            {
                                croppedAreaParts.Add(
                                    new OrderedBitmap(areaPart.OrderInArea, new Crop(areaPart.Dimension).Apply(bitmapToCropIntoParts)));
                            }
                        }

                        results.Add(new CroppedArea(templateArea, croppedAreaParts, documentId));
                    }
                    catch (UnsupportedImageFormatException)
                    {
                        return(ProcessingResult <ICollection <ICroppedArea> > .Failure(new UnsupportedImageFormat()));
                    }
                    catch (Exception ex)
                    {
                        ProcessingResult <ICollection <ICroppedArea> > .Failure(new UncaughtException(ex));
                    }
                }
                return(ProcessingResult <ICollection <ICroppedArea> > .Success(results));
            }
        }
        public TemplateModificationResult AddPageDefinition(ITemplatePageDefinition pageDefinition)
        {
            if (pageDefinition == null)
            {
                return(TemplateModificationResult.Failure(new EmptyInput()));
            }
            if (_definedPages.ContainsKey(pageDefinition.PageNumber))
            {
                return(TemplateModificationResult.Failure(new DuplicatedPageNumber(pageDefinition.PageNumber)));
            }

            _definedPages.Add(pageDefinition.PageNumber, pageDefinition);
            return(TemplateModificationResult.Success());
        }
        public ProcessingResult <Bitmap> ExtractHandwrittenInput(Bitmap userInput, ITemplatePageDefinition templatePage)
        {
            if (userInput == null || templatePage == null)
            {
                return(ProcessingResult <Bitmap> .Failure(new EmptyInput()));
            }

            using (userInput)
            {
                Bitmap canvasBitmap = null;

                try
                {
                    canvasBitmap = _canvasBitmapQueryHandler.Handle(
                        new GetCanvasBitmapForTemplatePage {
                        TemplatePageId = templatePage.Id
                    }).FileData.AsBitmap();

                    if (canvasBitmap == null)
                    {
                        //TODO: ResultMessage for failed HTTP request or pipe from ResourceQueryHandler
                        return(new ProcessingResult <Bitmap>(StepOutcome.Failure, null, null));
                    }

                    if (canvasBitmap.Size != userInput.Size)
                    {
                        using (var oldCanvas = canvasBitmap)
                        {
                            canvasBitmap = new ResizeBilinear(userInput.Width, userInput.Height).Apply(oldCanvas);
                        }
                    }

                    var result = new Invert().Apply(new Difference(userInput).Apply(canvasBitmap));

                    return(ProcessingResult <Bitmap> .Success(result));
                }
                catch (UnsupportedImageFormatException)
                {
                    return(ProcessingResult <Bitmap> .Failure(new UnsupportedImageFormat()));
                }
                finally
                {
                    canvasBitmap?.Dispose();
                }
            }
        }
 public PageAreaNotInPageDefinition(Guid templatePagePartId, ITemplatePageDefinition pageDefinition)
 {
     PagePartId       = templatePagePartId;
     PageDefinitionId = pageDefinition.Id;
 }