/// <summary>
        /// Gets the object collection.
        /// </summary>
        /// <param name="xmlData">
        /// The XML data.
        /// </param>
        /// <returns>
        /// </returns>
        private async Task <HLinkMediaModelCollection> GetObjectCollection(XElement xmlData)
        {
            HLinkMediaModelCollection t = new HLinkMediaModelCollection();

            var theORElement = from _ORElementEl in xmlData.Elements(ns + "objref")
                               select _ORElementEl;

            if (theORElement.Any())
            {
                // load media object references
                foreach (XElement theLoadORElement in theORElement)
                {
                    // save the MediaObject reference
                    HLinkMediaModel t2 = new HLinkMediaModel
                    {
                        HLinkKey = GetAttribute(theLoadORElement.Attribute("hlink")),
                    };

                    // Get region
                    XElement regionDetails = theLoadORElement.Element(ns + "region");
                    if (regionDetails != null)
                    {
                        HLinkLoadImageModel t3 = new HLinkLoadImageModel
                        {
                            HLinkKey      = t2.HLinkKey,
                            HomeImageType = CommonEnums.HomeImageType.ThumbNail,

                            GCorner1X = (int)regionDetails.Attribute("corner1_x"),
                            GCorner1Y = (int)regionDetails.Attribute("corner1_y"),
                            GCorner2X = (int)regionDetails.Attribute("corner2_x"),
                            GCorner2Y = (int)regionDetails.Attribute("corner2_y"),
                        };

                        t2 = await CreateClippedMediaModel(t3).ConfigureAwait(false);
                    }

                    // Get remaining fields
                    t2.GAttributeRefCollection = GetAttributeCollection(theLoadORElement);
                    t2.GCitationRefCollection  = GetCitationCollection(theLoadORElement);
                    t2.GNoteRefCollection      = GetNoteCollection(theLoadORElement);

                    // TODO !ELEMENT objref (region?, attribute*, citationref*, noteref*)&gt;
                    // !ATTLIST objref hlink IDREF #REQUIRED priv (0|1) #IMPLIED
                    t.Add(t2);
                }
            }

            // Return sorted by the default text
            t.SortAndSetFirst();

            return(t);
        }
Exemple #2
0
        public static async Task <HLinkMediaModel> CreateClippedMediaModel(HLinkLoadImageModel argHLinkLoadImageModel)
        {
            if (argHLinkLoadImageModel is null)
            {
                throw new ArgumentNullException(nameof(argHLinkLoadImageModel));
            }

            if (!argHLinkLoadImageModel.DeRef.Valid)
            {
                throw new ArgumentException("CreateClippedMediaModel argument is invalid", nameof(argHLinkLoadImageModel));
            }

            IMediaModel returnMediaModel = await MainThread.InvokeOnMainThreadAsync(() =>
            {
                // TODO cleanup code. Multiple copies of things in use

                IMediaModel theMediaModel = argHLinkLoadImageModel.DeRef;

                SKBitmap resourceBitmap = new SKBitmap();

                IMediaModel newMediaModel = new MediaModel();

                string newHLinkKey = argHLinkLoadImageModel.HLinkKey + "-" + argHLinkLoadImageModel.GCorner1X + argHLinkLoadImageModel.GCorner1Y + argHLinkLoadImageModel.GCorner2X + argHLinkLoadImageModel.GCorner2Y;
                string outFileName = Path.Combine("Cropped", newHLinkKey + ".png");

                string outFilePath = Path.Combine(DataStore.AD.CurrentDataFolder.FullName, outFileName);

                Debug.WriteLine(argHLinkLoadImageModel.DeRef.MediaStorageFilePath);

                // Check if already exists
                IMediaModel fileExists = DV.MediaDV.GetModelFromHLinkString(newHLinkKey);

                if ((!fileExists.Valid) && (theMediaModel.IsMediaStorageFileValid))
                {
                    // Needs clipping
                    using (StreamReader stream = new StreamReader(theMediaModel.MediaStorageFilePath))
                    {
                        resourceBitmap = SKBitmap.Decode(stream.BaseStream);
                    }

                    // Check for too large a bitmap
                    Debug.WriteLine("Image ResourceBitmap size: " + resourceBitmap.ByteCount);
                    if (resourceBitmap.ByteCount > int.MaxValue - 1000)
                    {
                        // TODO Handle this better. Perhaps resize? Delete for now
                        resourceBitmap = new SKBitmap();
                    }

                    float crleft   = (float)(argHLinkLoadImageModel.GCorner1X / 100d * theMediaModel.MetaDataWidth);
                    float crright  = (float)(argHLinkLoadImageModel.GCorner2X / 100d * theMediaModel.MetaDataWidth);
                    float crtop    = (float)(argHLinkLoadImageModel.GCorner1Y / 100d * theMediaModel.MetaDataHeight);
                    float crbottom = (float)(argHLinkLoadImageModel.GCorner2Y / 100d * theMediaModel.MetaDataHeight);

                    SKRect cropRect = new SKRect(crleft, crtop, crright, crbottom);

                    SKBitmap croppedBitmap = new SKBitmap(
                        (int)cropRect.Width,
                        (int)cropRect.Height
                        );

                    SKRect dest = new SKRect(
                        0,
                        0,
                        cropRect.Width,
                        cropRect.Height
                        );

                    SKRect source = new SKRect(
                        cropRect.Left,
                        cropRect.Top,
                        cropRect.Right,
                        cropRect.Bottom);

                    using (SKCanvas canvas = new SKCanvas(croppedBitmap))
                    {
                        canvas.DrawBitmap(resourceBitmap, source, dest);
                    }

                    // create an image COPY
                    SKImage image = SKImage.FromBitmap(croppedBitmap);

                    // encode the image (defaults to PNG)
                    SKData encoded = image.Encode();

                    // get a stream over the encoded data

                    using (Stream stream = File.Open(outFilePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                    {
                        encoded.SaveTo(stream);
                    }

                    croppedBitmap.Dispose();

                    // ------------ Save new MediaObject
                    newMediaModel          = theMediaModel.Copy();
                    newMediaModel.HLinkKey = newHLinkKey;

                    newMediaModel.OriginalFilePath = outFileName;
                    newMediaModel.MediaStorageFile = StoreFolder.FolderGetFile(DataStore.AD.CurrentDataFolder, outFileName);;
                    newMediaModel.IsClippedFile    = true;

                    newMediaModel.MetaDataHeight = cropRect.Height;
                    newMediaModel.MetaDataWidth  = cropRect.Width;

                    newMediaModel = SetHomeImage(newMediaModel);

                    DataStore.DS.MediaData.Add((MediaModel)newMediaModel);
                }
                else
                {
                    Dictionary <string, string> argErrorDetail = new Dictionary <string, string>
                    {
                        { "Original ID", theMediaModel.Id },
                        { "Original File", theMediaModel.MediaStorageFilePath },
                        { "Clipped Id", argHLinkLoadImageModel.DeRef.Id }
                    };

                    DataStore.CN.NotifyError("File not found when Region specified in ClipMedia", argErrorDetail);
                }

                resourceBitmap.Dispose();

                return(newMediaModel);
            }).ConfigureAwait(false);

            return(returnMediaModel.HLink);
        }
        public static async Task <HLinkMediaModel> CreateClippedMediaModel(HLinkLoadImageModel argHLinkLoadImageModel)
        {
            if (argHLinkLoadImageModel is null)
            {
                throw new ArgumentNullException(nameof(argHLinkLoadImageModel));
            }

            if (!argHLinkLoadImageModel.DeRef.Valid)
            {
                throw new ArgumentException("CreateClippedMediaModel argument is invalid", nameof(argHLinkLoadImageModel));
            }

            // TODO cleanup code. Multiple copies of things in use

            MediaModel theMediaModel = argHLinkLoadImageModel.DeRef;

            SKBitmap resourceBitmap = new SKBitmap();

            MediaModel newMediaModel = new MediaModel();

            string newHLinkKey = argHLinkLoadImageModel.HLinkKey + "-" + argHLinkLoadImageModel.GCorner1X + argHLinkLoadImageModel.GCorner1Y + argHLinkLoadImageModel.GCorner2X + argHLinkLoadImageModel.GCorner2Y;
            string outFileName = Path.Combine("Cropped", newHLinkKey + ".png");

            string outFilePath = Path.Combine(DataStore.AD.CurrentDataFolder.FullName, outFileName);

            Debug.WriteLine(argHLinkLoadImageModel.DeRef.MediaStorageFilePath);

            // Check if already exists
            MediaModel fileExists = DV.MediaDV.GetModelFromHLinkString(newHLinkKey);

            if (!fileExists.Valid)
            {
                // Needs clipping
                using (StreamReader stream = new StreamReader(theMediaModel.MediaStorageFilePath))
                {
                    resourceBitmap = SKBitmap.Decode(stream.BaseStream);
                }

                // Check for too large a bitmap
                Debug.WriteLine("Image ResourceBitmap size: " + resourceBitmap.ByteCount);
                if (resourceBitmap.ByteCount > int.MaxValue - 1000)
                {
                    // TODO Handle this better. Perhaps resize? Delete for now
                    resourceBitmap = new SKBitmap();
                }

                float crleft   = (float)(argHLinkLoadImageModel.GCorner1X / 100d * theMediaModel.MetaDataWidth);
                float crright  = (float)(argHLinkLoadImageModel.GCorner2X / 100d * theMediaModel.MetaDataWidth);
                float crtop    = (float)(argHLinkLoadImageModel.GCorner1Y / 100d * theMediaModel.MetaDataHeight);
                float crbottom = (float)(argHLinkLoadImageModel.GCorner2Y / 100d * theMediaModel.MetaDataHeight);

                SKRect cropRect = new SKRect(crleft, crtop, crright, crbottom);

                SKBitmap croppedBitmap = new SKBitmap(
                    (int)cropRect.Width,
                    (int)cropRect.Height
                    );

                SKRect dest = new SKRect(
                    0,
                    0,
                    cropRect.Width,
                    cropRect.Height
                    );

                SKRect source = new SKRect(
                    cropRect.Left,
                    cropRect.Top,
                    cropRect.Right,
                    cropRect.Bottom);

                using (SKCanvas canvas = new SKCanvas(croppedBitmap))
                {
                    canvas.DrawBitmap(resourceBitmap, source, dest);
                }

                // create an image COPY
                SKImage image = SKImage.FromBitmap(croppedBitmap);

                // encode the image (defaults to PNG)
                SKData encoded = image.Encode();

                // get a stream over the encoded data

                using (Stream stream = File.Open(outFilePath, FileMode.OpenOrCreate, System.IO.FileAccess.Write, FileShare.ReadWrite))
                {
                    encoded.SaveTo(stream);
                }

                croppedBitmap.Dispose();

                // ------------ Save new MediaObject
                newMediaModel          = theMediaModel.Copy();
                newMediaModel.HLinkKey = newHLinkKey;

                newMediaModel.HomeImageHLink.HLinkKey      = newHLinkKey;
                newMediaModel.HomeImageHLink.HomeImageType = CommonConstants.HomeImageTypeThumbNail;
                newMediaModel.HomeImageHLink.HomeSymbol    = CommonConstants.IconMedia;

                newMediaModel.OriginalFilePath = outFileName;
                newMediaModel.MediaStorageFile = await StoreFolder.FolderGetFileAsync(DataStore.AD.CurrentDataFolder, outFileName).ConfigureAwait(false);

                newMediaModel.HomeImageHLink.HomeImageType = CommonConstants.HomeImageTypeThumbNail;
                newMediaModel.IsClippedFile = true;

                newMediaModel.MetaDataHeight = cropRect.Height;
                newMediaModel.MetaDataWidth  = cropRect.Width;

                DataStore.DS.MediaData.Add(newMediaModel);
                //await StorePostLoad.fixMediaFile(newMediaModel).ConfigureAwait(false);
            }

            resourceBitmap.Dispose();

            return(newMediaModel.HLink);
        }