/// <summary> /// Implements common copy code for CloneCore(), CloneCurrentValueCore(), GetAsFrozenCore(), and /// GetCurrentValueAsFrozenCore() /// </summary> /// <param name="sourceBitmapMetadata"></param> private void CopyCommon(BitmapMetadata sourceBitmapMetadata) { BitmapMetadataBlockWriter blockWriter = sourceBitmapMetadata.BlockWriter; if (blockWriter == null) { // If source is a metadata InitializeFromMetadataWriter(sourceBitmapMetadata._metadataHandle, sourceBitmapMetadata._syncObject); } if (_metadataHandle == null) { if (blockWriter != null) { InitializeFromBlockWriter(blockWriter, sourceBitmapMetadata._syncObject); } else { InitializeFromBlockWriter(sourceBitmapMetadata.GuidFormat, false, false); SetQuery("/", sourceBitmapMetadata); } } _fixedSize = sourceBitmapMetadata._fixedSize; }
internal BitmapMetadataBlockWriterEnumerator( BitmapMetadataBlockWriter blockWriter ) { Debug.Assert(blockWriter != null); Debug.Assert(blockWriter.MetadataBlocks != null); _metadataBlocks = blockWriter.MetadataBlocks; _index = 0; }
/// <summary> /// /// </summary> private void InitializeFromBlockWriter(BitmapMetadataBlockWriter sourceBlockWriter, object syncObject) { IntPtr /* IWICMetadataBlockWriter */ blockWriter = IntPtr.Zero; IntPtr /* IWICMetadataQueryWriter */ queryWriter = IntPtr.Zero; using (FactoryMaker factoryMaker = new FactoryMaker()) { try { // Otherwise, simulate a metadata block writer for this imaging container format. _blockWriter = new BitmapMetadataBlockWriter(sourceBlockWriter, syncObject); blockWriter = Marshal.GetComInterfaceForObject( _blockWriter, typeof(System.Windows.Media.Imaging.BitmapMetadata.IWICMetadataBlockWriter)); HRESULT.Check(UnsafeNativeMethods.WICComponentFactory.CreateQueryWriterFromBlockWriter( factoryMaker.ImagingFactoryPtr, blockWriter, ref queryWriter )); _readOnly = false; _fixedSize = false; _metadataHandle = new SafeMILHandle(queryWriter); queryWriter = IntPtr.Zero; _syncObject = _metadataHandle; } finally { if (blockWriter != IntPtr.Zero) { #pragma warning suppress 6031 // Return value ignored on purpose. UnsafeNativeMethods.MILUnknown.Release(blockWriter); } if (queryWriter != IntPtr.Zero) { #pragma warning suppress 6031 // Return value ignored on purpose. UnsafeNativeMethods.MILUnknown.Release(queryWriter); } } } }
internal BitmapMetadataBlockWriter(BitmapMetadataBlockWriter blockWriter, object syncObject) { Guid guidVendor = new Guid(MILGuidData.GUID_VendorMicrosoft); _fixedSize = blockWriter._fixedSize; _containerFormat = blockWriter._containerFormat; _metadataBlocks = new ArrayList(); ArrayList metadataBlocks = blockWriter.MetadataBlocks; using (FactoryMaker factoryMaker = new FactoryMaker()) { foreach (SafeMILHandle metadataHandle in metadataBlocks) { lock (syncObject) { IntPtr pIMetadataWriter = IntPtr.Zero; try { HRESULT.Check(UnsafeNativeMethods.WICComponentFactory.CreateMetadataWriterFromReader( factoryMaker.ImagingFactoryPtr, metadataHandle, ref guidVendor, out pIMetadataWriter )); SafeMILHandle metadataWriter = new SafeMILHandle(pIMetadataWriter); pIMetadataWriter = IntPtr.Zero; _metadataBlocks.Add(metadataWriter); } finally { if (pIMetadataWriter != IntPtr.Zero) { #pragma warning suppress 6031 // Return value ignored on purpose. UnsafeNativeMethods.MILUnknown.Release(pIMetadataWriter); } } } } } }