public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
        {
            int status = SafeNativeMethods.Gdip.GdipPlayMetafileRecord(new HandleRef(this, base.nativeImage), recordType, flags, dataSize, data);

            if (status != 0)
            {
                throw SafeNativeMethods.Gdip.StatusException(status);
            }
        }
Esempio n. 2
0
 private bool method_5(EmfPlusRecordType A_0, int A_1, int A_2, IntPtr A_3, PlayRecordCallback A_4)
 {
     byte[] destination = new byte[A_2];
     if (A_3 != IntPtr.Zero)
     {
         Marshal.Copy(A_3, destination, 0, A_2);
     }
     this.metafile_0.PlayRecord(A_0, A_1, A_2, destination);
     return(true);
 }
Esempio n. 3
0
 internal bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
 {
     if (!data.Equals(IntPtr.Zero))
     {
         byte[] RecordData = new byte[dataSize];
         Marshal.Copy(data, RecordData, 0, dataSize);
         ProcessRecord(flags, recordType, RecordData);
     }
     return(true);
 }
Esempio n. 4
0
        internal bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
        {

            if (!data.Equals(IntPtr.Zero))
            {
                byte[] RecordData = new byte[dataSize];
                Marshal.Copy(data, RecordData, 0, dataSize);
                ProcessRecord(flags, recordType, RecordData);
            }
            return true;
        }
Esempio n. 5
0
        // Metafile 回调
        protected bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;
            if (data != IntPtr.Zero)
            {
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);
            }

            _printMetafile.PlayRecord(recordType, flags, dataSize, dataArray);
            return(true);
        }
Esempio n. 6
0
        /// <summary>
        /// Plays an EMF+ file.
        /// </summary>
        public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
        {
            // Used in conjunction with Graphics.EnumerateMetafile to play an EMF+
            // The data must be DWORD aligned if it's an EMF or EMF+.  It must be
            // WORD aligned if it's a WMF.

            Gdip.CheckStatus(Gdip.GdipPlayMetafileRecord(
                                 new HandleRef(this, nativeImage),
                                 recordType,
                                 flags,
                                 dataSize,
                                 data));
        }
Esempio n. 7
0
 // Metafile 回调
 private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
 {
     byte[] dataArray = null;
     if (data != IntPtr.Zero)
     {
         // Copy the unmanaged record to a managed byte buffer
         // that can be used by PlayRecord.
         dataArray = new byte[dataSize];
         Marshal.Copy(data, dataArray, 0, dataSize);
     }
     _printMetafile.PlayRecord(recordType, flags, dataSize, dataArray);
     return(true);
 }
Esempio n. 8
0
        private static bool MetafileResetCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;
            if (data != IntPtr.Zero)
            {
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);

                if (recordType == EmfPlusRecordType.EmfSetWindowExtEx)
                {
                    bBounds = dataArray;
                }
            }
            return(true);
        }
Esempio n. 9
0
 /// <summary>
 /// Provides a callback method for the EnumerateMetafile method.
 /// </summary>
 /// <param name="recordType">Member of the EmfPlusRecordType enumeration that specifies the type of metafile record.</param>
 /// <param name="flags">Set of flags that specify attributes of the record.</param>
 /// <param name="dataSize">Number of bytes in the record data.</param>
 /// <param name="data">Pointer to a buffer that contains the record data.</param>
 /// <param name="callbackData">Not used.</param>
 /// <returns></returns>
 private bool MetafileCallback(EmfPlusRecordType recordType,
                               int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
 {
     byte[] dataArray = null;
     if (data != IntPtr.Zero)
     {
         // 将 data 所对应的内存指针所对应的数据从内存中复制出来
         // Copy the unmanaged record to a managed byte buffer
         // that can be used by PlayRecord.
         dataArray = new byte[dataSize];
         // Copies data from a managed array to an unmanaged memory pointer, or from an unmanaged memory pointer to a managed array.
         SysMarshal.Copy(data, dataArray, 0, dataSize);
     }
     // 将 矢量图中的这一个小图元显示在 pictureBox1 的绘图面板 Graphics 中
     metafile1.PlayRecord(recordType, flags, dataSize, dataArray); // Plays an individual metafile record.
     return(true);
 }
Esempio n. 10
0
        private bool MetafileCallback(EmfPlusRecordType recordType,   int flags,   int dataSize,   IntPtr data,   PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;
            if (data != IntPtr.Zero)
            {
                // Copy the unmanaged record to a managed byte buffer 
                // that can be used by PlayRecord.
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);
            }

            //m_mf.PlayRecord(recordType, flags, dataSize, dataArray);

            DecodeRecord(recordType, flags, dataArray);

            return true;
        }
Esempio n. 11
0
        /// <summary>
        /// Plays an EMF+ file.
        /// </summary>
        public void PlayRecord(EmfPlusRecordType recordType,
            int flags,
            int dataSize,
            byte[] data)
        {
            // Used in conjunction with Graphics.EnumerateMetafile to play an EMF+
            // The data must be DWORD aligned if it's an EMF or EMF+.  It must be
            // WORD aligned if it's a WMF.

            int status = SafeNativeMethods.Gdip.GdipPlayMetafileRecord(new HandleRef(this, nativeImage),
                                                        recordType,
                                                        flags,
                                                        dataSize,
                                                        data);

            if (status != SafeNativeMethods.Gdip.Ok)
                throw SafeNativeMethods.Gdip.StatusException(status);
        }
Esempio n. 12
0
    bool EnumMetafileProc(EmfPlusRecordType eprt, int iFlags,
                          int iDataSize, IntPtr ipData,
                          PlayRecordCallback prc)
    {
        strwrite.Write("{0} ({1}, {2})", eprt, iFlags, iDataSize);

        if (iDataSize > 0)
        {
            byte[] abyData = new Byte[iDataSize];
            Marshal.Copy(ipData, abyData, 0, iDataSize);

            foreach (byte by in abyData)
            {
                strwrite.Write(" {0:X2}", by);
            }
        }
        strwrite.WriteLine();
        return(true);
    }
Esempio n. 13
0
        private bool EnumMetaCB(EmfPlusRecordType recordType, int flags, int dataSize,
                                IntPtr data, PlayRecordCallback callbackData)
        {
            string str = "";

            // Play only EmfPlusRecordType.FillEllipse records.
            if (recordType == EmfPlusRecordType.FillEllipse ||
                recordType == EmfPlusRecordType.FillRects ||
                recordType == EmfPlusRecordType.DrawEllipse ||
                recordType == EmfPlusRecordType.DrawRects)
            {
                str = "Record type:" + recordType.ToString() +
                      ", Flags:" + flags.ToString() +
                      ", DataSize:" + dataSize.ToString() +
                      ", Data:" + data.ToString();
                MessageBox.Show(str);
            }
            return(true);
        }
Esempio n. 14
0
        public IBinaryRecord Read()
        {
            long position = this.reader.BaseStream.Position;
            EmfPlusRecordType recordType    = (EmfPlusRecordType)this.reader.ReadUInt32();
            uint            num             = this.reader.ReadUInt32();
            EmfBinaryRecord emfBinaryRecord = new EmfUnknownRecord();

            emfBinaryRecord.RecordType = recordType;
            emfBinaryRecord.RecordSize = num;
            emfBinaryRecord.Read(this.reader);
            long position2 = this.reader.BaseStream.Position;
            long num2      = position2 - position;
            long num3      = (long)((ulong)num - (ulong)num2);

            if (num3 > 0L)
            {
                this.reader.Skip((int)num3);
            }
            return(emfBinaryRecord);
        }
Esempio n. 15
0
        protected bool MetafileCallback(
            EmfPlusRecordType recordType,
            int flags,
            int dataSize,
            IntPtr data,
            PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;

            if (data != IntPtr.Zero)
            {
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);

                if (recordType == EmfPlusRecordType.WmfEscape && dataSize >= Marshal.SizeOf(m_wmfHeader) && !m_succeeded)
                {
                    m_wmfHeader = (wmfHeader)RawDeserialize(dataArray, 0, m_wmfHeader.GetType());
                    if (m_wmfHeader.strSig.Equals(m_strSig, StringComparison.CurrentCultureIgnoreCase))
                    {
                        System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
                        string strCompanyInfo         = enc.GetString(dataArray, Marshal.SizeOf(m_wmfHeader), m_wmfHeader.iDataLen);
                        int    iNull = strCompanyInfo.IndexOf('\0');
                        if (iNull >= 0)
                        {
                            int mtefStart = Marshal.SizeOf(m_wmfHeader) + iNull + 1;
                            iMTEF_Length = m_wmfHeader.iDataLen;
                            bMTEF        = new byte[iMTEF_Length];
                            Array.Copy(dataArray, mtefStart, bMTEF, 0, iMTEF_Length);
                            m_succeeded = true;
                        }
                    }
                }
            }

            m_metafile.PlayRecord(recordType, flags, dataSize, dataArray);

            return(true);
        }
Esempio n. 16
0
 public void PlayRecord(EmfPlusRecordType recordType,
                        int flags, int dataSize, byte[] data)
 {
     // TODO
 }
Esempio n. 17
0
        internal void ProcessRecord(int flags, EmfPlusRecordType recordType, byte[] RecordData)
        {
            switch (recordType)
            {
            case EmfPlusRecordType.Header:
                break;

            case EmfPlusRecordType.SetPageTransform:
                EMFSetPageTransform P = EMFSetPageTransform.getTransform(flags, RecordData);
                break;

            case EmfPlusRecordType.Object:
                EMFRecordObject O = EMFRecordObject.getObject(flags, RecordData);
                if (O != null)
                {
                    if (ObjectTable.Contains(O.ObjectID))
                    {
                        ObjectTable[O.ObjectID] = O;
                    }
                    else
                    {
                        ObjectTable.Add(O.ObjectID, O);
                    }
                }
                break;

            case EmfPlusRecordType.DrawLines:
                //After each instruction we must do something, as the object table is constantly being changed...
                //and we need to use what is currently in the table!
                DrawLines DL = new DrawLines(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DL.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.DrawString:
                DrawString DS = new DrawString(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DS.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.FillRects:
                FillRects FR = new FillRects(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(FR.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.DrawRects:
                DrawRects DR = new DrawRects(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DR.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.FillPolygon:
                FillPolygon FPo = new FillPolygon(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(FPo.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.DrawEllipse:
                DrawEllipse DE = new DrawEllipse(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DE.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.FillEllipse:
                FillEllipse FE = new FillEllipse(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(FE.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.FillPie:
                FillPie FP = new FillPie(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(FP.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.DrawPie:
                DrawPie DP = new DrawPie(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DP.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.DrawCurve:
                DrawCurve DC = new DrawCurve(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(DC.Process(flags, RecordData));
                break;

            case EmfPlusRecordType.Comment:
                Comment CM = new Comment(X, Y, Width, Height, ObjectTable);
                PageItems.AddRange(CM.Process(flags, RecordData));
                break;

            default:
                break;
            }
        }
Esempio n. 18
0
        public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
        {
            int status = SafeNativeMethods.Gdip.GdipPlayMetafileRecord(nativeImage, recordType, flags, dataSize, data);

            SafeNativeMethods.Gdip.CheckStatus(status);
        }
Esempio n. 19
0
	public void PlayRecord(EmfPlusRecordType recordType,
						   int flags, int dataSize, byte[] data)
			{
				// TODO
			}
Esempio n. 20
0
		private bool ReplaceBrushCallbackProc(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data,
		                                      PlayRecordCallback callbackData)
		{
			try {
				if (data == IntPtr.Zero)
					((Metafile) image).PlayRecord(recordType, flags, 0, null);
				else {
					if (dataSize > metafileDataSize) {
						metafileDataSize = dataSize;
						metafileData = new byte[metafileDataSize];
					}
					// Copy the unmanaged record to a managed byte buffer that can be used by PlayRecord.
					Marshal.Copy(data, metafileData, 0, dataSize);
					// Adjust the color
					switch (recordType) {
						case EmfPlusRecordType.EmfCreateBrushIndirect:
							// This type of record only appears in WMF and 'classic' EMF files, not in EMF+ files.
							// Get color of current brush
							if (!replaceColorFound) {
								Buffers.SetByte(metafileData, 8, FillStyle.BaseColorStyle.Color.R);
								Buffers.SetByte(metafileData, 9, FillStyle.BaseColorStyle.Color.G);
								Buffers.SetByte(metafileData, 10, FillStyle.BaseColorStyle.Color.B);
								Buffers.SetByte(metafileData, 11, FillStyle.BaseColorStyle.Color.A);
								replaceColorFound = true;
							}
							break;
						default: /* nothing to do */
							break;
					}
					((Metafile) image).PlayRecord(recordType, flags, dataSize, metafileData);
				}
			}
			catch (Exception exc) {
				Console.WriteLine("Error while playing metafile record: {0}", exc.Message);
			}
			return true;
		}
Esempio n. 21
0
 internal void ProcessRecord(int flags, EmfPlusRecordType recordType, byte[] RecordData)
 {
     switch (recordType)
     {
         case EmfPlusRecordType.Header:
             break;
         case EmfPlusRecordType.SetPageTransform:
             EMFSetPageTransform P = EMFSetPageTransform.getTransform(flags, RecordData);
             break;
         case EmfPlusRecordType.Object:
             EMFRecordObject O = EMFRecordObject.getObject(flags, RecordData);
             if (O != null)
             {
                 if (ObjectTable.Contains(O.ObjectID))
                 {
                     ObjectTable[O.ObjectID] = O;
                 }
                 else
                 {
                     ObjectTable.Add(O.ObjectID, O);
                 }
             }
             break;
         case EmfPlusRecordType.DrawLines:
             //After each instruction we must do something, as the object table is constantly being changed...
             //and we need to use what is currently in the table!
             DrawLines DL = new DrawLines(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DL.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.DrawString:
             DrawString DS = new DrawString(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DS.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.FillRects:
             FillRects FR = new FillRects(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(FR.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.DrawRects:
             DrawRects DR = new DrawRects(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DR.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.FillPolygon:
             FillPolygon FPo = new FillPolygon(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(FPo.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.DrawEllipse:
             DrawEllipse DE = new DrawEllipse(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DE.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.FillEllipse:
             FillEllipse FE = new FillEllipse(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(FE.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.FillPie:
             FillPie FP = new FillPie(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(FP.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.DrawPie:
             DrawPie DP = new DrawPie(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DP.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.DrawCurve:
             DrawCurve DC = new DrawCurve(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(DC.Process(flags, RecordData));
             break;
         case EmfPlusRecordType.Comment:
             Comment CM = new Comment(X, Y, Width, Height, ObjectTable);
             PageItems.AddRange(CM.Process(flags, RecordData));
             break;
         default:
             break;
     }
 }
Esempio n. 22
0
		private bool FindReplaceColorCallbackProc(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data,
		                                          PlayRecordCallback callbackData)
		{
			switch (recordType) {
				case EmfPlusRecordType.EmfCreateBrushIndirect:
					if (!replaceColorFound) {
						// Copy the unmanaged record to a managed byte buffer that can be used by PlayRecord.
						if (dataSize > metafileDataSize) {
							metafileDataSize = dataSize;
							metafileData = new byte[metafileDataSize];
						}
						Marshal.Copy(data, metafileData, 0, dataSize);
						// Get the RGB color components of the brush
						replaceColor = Color.FromArgb(metafileData[8], metafileData[9], metafileData[10]);
						replaceColorFound = true;
					}
					break;

				default:
					// Nothing to do
					break;
			}
			// No need to play the record as we only search a color to replace
			//((Metafile)image).PlayRecord(recordType, flags, dataSize, dataArray);    //note that every record gets played even if the dataArray is empty
			return true;
		}
Esempio n. 23
0
        private void DecodeRecord(EmfPlusRecordType recordType, int flags, byte[] dataArray)
        {
            //System.Diagnostics.Debug.Write(recordType.ToString() + " ");
            //if (dataArray != null)
            //    System.Diagnostics.Debug.Write(dataArray.GetLength(0).ToString() + "/");
            //System.Diagnostics.Debug.Write(flags.ToString() + "/ ");
            //if (dataArray != null)
            //{
            //    int ilen = dataArray.GetLength(0);
            //    if (recordType != EmfPlusRecordType.EmfBitBlt)
            //        ilen = Math.Min(40, ilen);
            //    for (int i = 0; i < ilen; i++)
            //        System.Diagnostics.Debug.Write(dataArray[i].ToString() + " ");
            //}
            //System.Diagnostics.Debug.WriteLine(" ");

            switch (recordType)
            {
                case EmfPlusRecordType.EmfHeader:
                    DecodeEmfHeader(flags, dataArray);
                    break;
                case EmfPlusRecordType.EmfExtTextOutW:
                    DecodeExtTextOutW(flags, dataArray);
                    break;
                case EmfPlusRecordType.EmfExtCreateFontIndirect:
                    DecodeExtCreateFontIndirect(flags, dataArray);
                    break;
                case EmfPlusRecordType.EmfSelectObject:
                    DecodeSelectObject(flags, dataArray);
                    break;
                case EmfPlusRecordType.EmfSetBkColor:
                    m_canvasLog.UpdateBackgrounColor(DecodeColor(flags, dataArray));
                    break;
                case EmfPlusRecordType.EmfSetTextColor:
                    m_canvasLog.UpdateForegroundColor(  DecodeColor(flags, dataArray) );
                    break;
                case EmfPlusRecordType.EmfMoveToEx:
                    m_canvasLog.MoveTo(DecodePoint(flags, dataArray));
                    break;
                case EmfPlusRecordType.EmfLineTo:
                    m_canvasLog.LineTo(DecodePoint(flags, dataArray));
                    break;
                case EmfPlusRecordType.EmfDeleteObject:
                    m_canvasLog.DeleteObject(new EMFSelectedObject(new DataArrayReader(dataArray)));
                    break;
                case EmfPlusRecordType.EmfCreatePen:
                    m_canvasLog.AddObjectWithHandle(new EMFPen(new DataArrayReader(dataArray)));
                    break;
                case EmfPlusRecordType.EmfSetWindowOrgEx:
                    m_canvasLog.SetWindowOrigin(DecodePoint(flags, dataArray));
                    break;
                case EmfPlusRecordType.SetPageTransform:
                    m_canvasLog.SetPageTransform((GraphicsUnit)flags, DecodeInt(dataArray));
                    break;
                case EmfPlusRecordType.EmfSaveDC:
                    m_canvasLog.SaveContext();
                    break;
                case  EmfPlusRecordType.EmfRestoreDC:
                    m_canvasLog.RestoreContext(DecodeInt(dataArray));
                    break;
                case EmfPlusRecordType.EmfIntersectClipRect:
                    m_canvasLog.IntersectClipRect(DecodeRect(dataArray));
                    break;
                case EmfPlusRecordType.EmfSetBkMode:
                    m_canvasLog.SetBackgroundMode(DecodeInt(dataArray));
                    break;
                case EmfPlusRecordType.EmfBitBlt:
                    DecodeEmfBitBlp(dataArray);
                    break;
                default:
                    break;

            }
        }
Esempio n. 24
0
		internal static extern Status GdipPlayMetafileRecord (IntPtr metafile, EmfPlusRecordType recordType, int flags, int dataSize, byte[] data);
Esempio n. 25
0
		public void PlayRecord (EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
		{
			Status status = GDIPlus.GdipPlayMetafileRecord (nativeObject, recordType, flags, dataSize, data);
			GDIPlus.CheckStatus (status);
		}
Esempio n. 26
0
 public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] datawmfHeader)
 {
     throw new NotImplementedException();
 }
Esempio n. 27
0
 internal static extern int GdipPlayMetafileRecord(HandleRef graphics, EmfPlusRecordType recordType, int flags, int dataSize, byte[] data);
Esempio n. 28
0
		public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] datawmfHeader)
		{
			throw new NotImplementedException ();
		}
Esempio n. 29
0
 internal static extern int GdipPlayMetafileRecord(HandleRef graphics, 
                                                   EmfPlusRecordType recordType, 
                                                   int flags, 
                                                   int dataSize, 
                                                   byte[] data);
Esempio n. 30
0
        /// <summary>
        /// Extends BeginInvoke so that when a state object is not needed, null does not need to be passed.
        /// <example>
        /// playrecordcallback.BeginInvoke(recordType, flags, dataSize, recordData, callback);
        /// </example>
        /// </summary>
        public static IAsyncResult BeginInvoke(this PlayRecordCallback playrecordcallback, EmfPlusRecordType recordType, Int32 flags, Int32 dataSize, IntPtr recordData, AsyncCallback callback)
        {
            if (playrecordcallback == null)
            {
                throw new ArgumentNullException("playrecordcallback");
            }

            return(playrecordcallback.BeginInvoke(recordType, flags, dataSize, recordData, callback, null));
        }
 public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
 {
     int status = SafeNativeMethods.Gdip.GdipPlayMetafileRecord(new HandleRef(this, base.nativeImage), recordType, flags, dataSize, data);
     if (status != 0)
     {
         throw SafeNativeMethods.Gdip.StatusException(status);
     }
 }
Esempio n. 32
0
 public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
 {
     throw null;
 }
        private bool MetafileCallback(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr data, PlayRecordCallback callbackData)
        {
            byte[] dataArray = null;
            if (data != IntPtr.Zero)
            {
                dataArray = new byte[dataSize];
                Marshal.Copy(data, dataArray, 0, dataSize);

                if (recordType == EmfPlusRecordType.DrawString)
                {
                    try
                    {
                        int stringLength = BitConverter.ToInt32(dataArray, 8) * 2;

                        string str = Encoding.Unicode.GetString(dataArray, 28, stringLength);
                        ParsedDrawStrings.Add(str);

                        if (extractTextMode)
                        {
                            GuessWhiteSpaces();

                            parsedExpectedText += str;
                        }
                    }
                    catch
                    {
                        if (IsParseFailedLoggingEnabled)
                        {
                            ParseFailedRecords.Add(new KeyValuePair <EmfPlusRecordType, byte[]>(recordType, dataArray));
                        }
                    }
                }
                else if (recordType == EmfPlusRecordType.EmfSmallTextOut)
                {
                    var x             = BitConverter.ToInt32(dataArray, 0);
                    var y             = BitConverter.ToInt32(dataArray, 4);
                    var cChars        = BitConverter.ToInt32(dataArray, 8);
                    var fuOptions     = BitConverter.ToInt32(dataArray, 12);
                    var iGraphicsMode = BitConverter.ToInt32(dataArray, 16);
                    var exScale       = BitConverter.ToDouble(dataArray, 20);
                    var eyScale       = BitConverter.ToDouble(dataArray, 24);
                    var maybeBound    = BitConverter.ToInt32(dataArray, 28);
                    int num_chars     = BitConverter.ToInt32(dataArray, 28);
                    try
                    {
                        var maybeText = BitConverter.ToChar(dataArray, 28);
                        ParsedSmallTextOuts.Add(maybeText);

                        if (extractTextMode)
                        {
                            GuessWhiteSpaces();

                            parsedExpectedText += maybeText;
                        }
                    }
                    catch
                    {
                        if (IsParseFailedLoggingEnabled)
                        {
                            ParseFailedRecords.Add(new KeyValuePair <EmfPlusRecordType, byte[]>(recordType, dataArray));
                        }
                    }
                }
                else if (recordType == EmfPlusRecordType.EmfExtTextOutW)
                {
                    string txt;
                    try
                    {
                        var length    = BitConverter.ToUInt32(dataArray, 36);
                        var offString = BitConverter.ToUInt32(dataArray, 40);
                        var chars     = new char[length];

                        for (int i = 0; i < length; i++)
                        {
                            chars[i] = BitConverter.ToChar(dataArray, (int)offString - 8 + i * 2);
                        }

                        txt = new string(chars);
                        if (txt.Replace(" ", "").Length > 0)
                        {
                            ParsedExtTextOutWs.Add(txt);

                            if (extractTextMode)
                            {
                                GuessWhiteSpaces();

                                parsedExpectedText += txt;
                            }
                        }
                    }
                    catch
                    {
                        if (IsParseFailedLoggingEnabled)
                        {
                            ParseFailedRecords.Add(new KeyValuePair <EmfPlusRecordType, byte[]>(recordType, dataArray));
                        }
                    }
                }
                else
                {
                    if (extractTextMode)
                    {
                        betweenTextCommands.Add(recordType);
                    }
                }
            }

            _loadedMetafile.PlayRecord(recordType, flags, dataSize, dataArray);

            return(true);
        }
Esempio n. 34
0
        private static bool DelFunc(EmfPlusRecordType recordType, int flags, int dataSize, IntPtr recordData,
                                    PlayRecordCallback callbackData)
        {
            byte[] numArray = new byte[dataSize];
            if (recordData != IntPtr.Zero)
            {
                Marshal.Copy(recordData, numArray, 0, dataSize);
            }
            EmfPlusRecordType emfPlusRecordType = recordType;

            if (emfPlusRecordType <= EmfPlusRecordType.DrawArc)
            {
                if (emfPlusRecordType == EmfPlusRecordType.EmfHeader)
                {
                    MetaForm.imgWidth  = MetaForm.EmfWidthToWidth((int)numArray[24], (int)numArray[25]);
                    MetaForm.imgHeight = MetaForm.EmfWidthToWidth((int)numArray[28], (int)numArray[29]);
                    MetaForm.cn_obj    = (int)MetaForm.Format_Size2(numArray[41], numArray[42]);
                }
                else
                {
                    switch (emfPlusRecordType)
                    {
                    case EmfPlusRecordType.Object:
                    {
                        if ((int)numArray.Length >= 32 || numArray[4] > 1)
                        {
                            if (numArray[4] != 0)
                            {
                                MetaForm.SplitRecObject(numArray);
                                return(true);
                            }
                            if ((int)numArray.Length == 32)
                            {
                                MetaForm.r = numArray[30];
                                MetaForm.g = numArray[29];
                                MetaForm.b = numArray[28];
                            }
                            if ((int)numArray.Length > 32)
                            {
                                MetaForm.r = numArray[34];
                                MetaForm.g = numArray[33];
                                MetaForm.b = numArray[32];
                            }
                            if (numArray[8] == 0)
                            {
                                MetaForm.line_style = 0;
                            }
                            else
                            {
                                MetaForm.line_style = numArray[20];
                            }
                            MetaForm.text_size  = MetaForm.FormatSize((int)numArray[6], (int)numArray[7]);
                            MetaForm.obj_width  = MetaForm.FormatSize((int)numArray[18], (int)numArray[19]);
                            MetaForm.text_style = numArray[12];
                            break;
                        }
                        else
                        {
                            MetaForm.r           = numArray[14];
                            MetaForm.g           = numArray[13];
                            MetaForm.b           = numArray[12];
                            MetaForm.hatch_style = numArray[8];
                            break;
                        }
                    }

                    case EmfPlusRecordType.Clear:
                    case EmfPlusRecordType.FillPie:
                    case EmfPlusRecordType.DrawPie:
                    {
                        return(true);
                    }

                    case EmfPlusRecordType.FillRects:
                    {
                        if (numArray[3] == 255)
                        {
                            MetaForm.r = numArray[2];
                            MetaForm.g = numArray[1];
                            MetaForm.b = numArray[0];
                        }
                        MetaForm.DrawRectangle(numArray, 8, true);
                        MetaForm.hatch_style = -1;
                        break;
                    }

                    case EmfPlusRecordType.DrawRects:
                    {
                        MetaForm.DrawRectangle(numArray, 4, false);
                        break;
                    }

                    case EmfPlusRecordType.FillPolygon:
                    {
                        MetaForm.DrawPolyLine(numArray, 4, true, false);
                        MetaForm.hatch_style = -1;
                        break;
                    }

                    case EmfPlusRecordType.DrawLines:
                    {
                        if (numArray[0] != 2)
                        {
                            MetaForm.DrawPolyLine(numArray, 0, false, false);
                            break;
                        }
                        else
                        {
                            MetaForm.DrawLine(numArray, 4);
                            break;
                        }
                    }

                    case EmfPlusRecordType.FillEllipse:
                    {
                        if (numArray[3] != 0)
                        {
                            MetaForm.r = numArray[2];
                            MetaForm.g = numArray[1];
                            MetaForm.b = numArray[0];
                        }
                        if (numArray[8] != numArray[10])
                        {
                            MetaForm.DrawEllipse(numArray, 4, true);
                        }
                        else
                        {
                            MetaForm.DrawCircle(numArray, 4, true);
                        }
                        MetaForm.hatch_style = -1;
                        break;
                    }

                    case EmfPlusRecordType.DrawEllipse:
                    {
                        if (numArray[4] != numArray[6])
                        {
                            MetaForm.DrawEllipse(numArray, 0, false);
                            break;
                        }
                        else
                        {
                            MetaForm.DrawCircle(numArray, 0, false);
                            break;
                        }
                    }

                    case EmfPlusRecordType.DrawArc:
                    {
                        if (numArray[12] != numArray[14])
                        {
                            MetaForm.DrawEllArc(numArray);
                            break;
                        }
                        else
                        {
                            MetaForm.DrawArc(numArray);
                            break;
                        }
                    }

                    default:
                    {
                        return(true);
                    }
                    }
                }
            }
            else if (emfPlusRecordType == EmfPlusRecordType.DrawBeziers)
            {
                MetaForm.DrawPolyLine(numArray, 0, false, true);
            }
            else if (emfPlusRecordType == EmfPlusRecordType.DrawString)
            {
                MetaForm.r = numArray[2];
                MetaForm.g = numArray[1];
                MetaForm.b = numArray[0];
                MetaForm.DrawString(numArray);
            }
            else
            {
                switch (emfPlusRecordType)
                {
                case EmfPlusRecordType.ResetWorldTransform:
                {
                    MetaForm.transform = false;
                    break;
                }

                case EmfPlusRecordType.MultiplyWorldTransform:
                {
                    return(true);
                }

                case EmfPlusRecordType.TranslateWorldTransform:
                {
                    MetaForm.transform    = true;
                    MetaForm.transPoint.X = MetaForm.FormatSize((int)numArray[2], (int)numArray[3]);
                    MetaForm.transPoint.Y = MetaForm.FormatSize((int)numArray[6], (int)numArray[7]);
                    break;
                }

                default:
                {
                    return(true);
                }
                }
            }
            return(true);
        }
        /// <summary>
        /// Extends BeginInvoke so that when a state object is not needed, null does not need to be passed.
        /// <example>
        /// playrecordcallback.BeginInvoke(recordType, flags, dataSize, recordData, callback);
        /// </example>
        /// </summary>
        public static IAsyncResult BeginInvoke(this PlayRecordCallback playrecordcallback, EmfPlusRecordType recordType, Int32 flags, Int32 dataSize, IntPtr recordData, AsyncCallback callback)
        {
            if(playrecordcallback == null) throw new ArgumentNullException("playrecordcallback");

            return playrecordcallback.BeginInvoke(recordType, flags, dataSize, recordData, callback, null);
        }
Esempio n. 36
0
        public void EnumerateMetafile(Stream emf, float unitSize, PointF destination, DrawLineDelegate drawLine, FillPolygonDelegate fillPolygon)
        {
            this.Transform    = new Matrix();
            this._drawLine    = drawLine;
            this._fillPolygon = fillPolygon;
            this._zero        = destination;
            this._lineBuffer  = new MetafileParser.LineBuffer(unitSize);
            this._objects     = new Dictionary <uint, MetafileParser.ObjectHandle>();
            this._brush       = null;
            using (EmfReader emfReader = new EmfReader(emf))
            {
                while (!emfReader.IsEndOfFile)
                {
                    EmfUnknownRecord emfUnknownRecord = emfReader.Read() as EmfUnknownRecord;
                    if (emfUnknownRecord != null)
                    {
                        EmfPlusRecordType recordType = emfUnknownRecord.RecordType;
                        if (recordType <= EmfPlusRecordType.EmfSetPolyFillMode)
                        {
                            if (recordType != EmfPlusRecordType.EmfHeader && recordType != EmfPlusRecordType.EmfEof && recordType != EmfPlusRecordType.EmfSetPolyFillMode)
                            {
                                goto IL_1FE;
                            }
                        }
                        else
                        {
                            switch (recordType)
                            {
                            case EmfPlusRecordType.EmfMoveToEx:
                                this.ProcessMoveToEx(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfSetMetaRgn:
                            case EmfPlusRecordType.EmfExcludeClipRect:
                            case EmfPlusRecordType.EmfIntersectClipRect:
                            case EmfPlusRecordType.EmfScaleViewportExtEx:
                            case EmfPlusRecordType.EmfScaleWindowExtEx:
                            case EmfPlusRecordType.EmfSetWorldTransform:
                                goto IL_1FE;

                            case EmfPlusRecordType.EmfSaveDC:
                            case EmfPlusRecordType.EmfRestoreDC:
                            case EmfPlusRecordType.EmfCreatePen:
                            case EmfPlusRecordType.EmfDeleteObject:
                                break;

                            case EmfPlusRecordType.EmfModifyWorldTransform:
                                this.ProcessModifyWorldTransform(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfSelectObject:
                                this.ProcessSelectObject(emfUnknownRecord.Data);
                                break;

                            case EmfPlusRecordType.EmfCreateBrushIndirect:
                                this.ProcessCreateBrushIndirect(emfUnknownRecord.Data);
                                break;

                            default:
                                switch (recordType)
                                {
                                case EmfPlusRecordType.EmfSetMiterLimit:
                                    break;

                                case EmfPlusRecordType.EmfBeginPath:
                                    this.ProcessBeginPath(emfUnknownRecord.Data);
                                    break;

                                case EmfPlusRecordType.EmfEndPath:
                                    break;

                                case EmfPlusRecordType.EmfCloseFigure:
                                    this.ProcessCloseFigure(emfUnknownRecord.Data);
                                    break;

                                case EmfPlusRecordType.EmfFillPath:
                                    goto IL_1FE;

                                case EmfPlusRecordType.EmfStrokeAndFillPath:
                                    this.ProcessStrokeAndFillPath(emfUnknownRecord.Data);
                                    break;

                                default:
                                    switch (recordType)
                                    {
                                    case EmfPlusRecordType.EmfPolygon16:
                                        this.ProcessPolygon16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyline16:
                                        this.ProcessPolyline16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyBezierTo16:
                                        this.ProcessPolyBezierTo16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolylineTo16:
                                        this.ProcessPolylineTo16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfPolyPolyline16:
                                    case EmfPlusRecordType.EmfPolyDraw16:
                                    case EmfPlusRecordType.EmfCreateMonoBrush:
                                    case EmfPlusRecordType.EmfCreateDibPatternBrushPt:
                                    case EmfPlusRecordType.EmfPolyTextOutA:
                                    case EmfPlusRecordType.EmfPolyTextOutW:
                                        goto IL_1FE;

                                    case EmfPlusRecordType.EmfPolyPolygon16:
                                        this.ProcessPolyPolygon16(emfUnknownRecord.Data);
                                        break;

                                    case EmfPlusRecordType.EmfExtCreatePen:
                                    case EmfPlusRecordType.EmfSetIcmMode:
                                        break;

                                    default:
                                        goto IL_1FE;
                                    }
                                    break;
                                }
                                break;
                            }
                        }
                        continue;
                        continue;
IL_1FE:
                        throw new NotImplementedException();
                    }
                }
            }
            this.CommitLine();
        }
Esempio n. 37
0
 public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
 {
     throw new PlatformNotSupportedException();
 }
Esempio n. 38
0
        public void PlayRecord(EmfPlusRecordType recordType, int flags, int dataSize, byte[] data)
        {
            Status status = GDIPlus.GdipPlayMetafileRecord(nativeObject, recordType, flags, dataSize, data);

            GDIPlus.CheckStatus(status);
        }
Esempio n. 39
0
 /// <include file='doc\Metafile.uex' path='docs/doc[@for="Metafile.PlayRecord"]/*' />
 /// <devdoc>
 ///    Plays an EMF+ file.
 /// </devdoc>
 public void PlayRecord(EmfPlusRecordType recordType,
                        int flags,
                        int dataSize,
                        byte[] data)
 {
     // Used in conjunction with Graphics.EnumerateMetafile to play an EMF+
     // The data must be DWORD aligned if it's an EMF or EMF+.  It must be
     // WORD aligned if it's a WMF.
     
     int status = SafeNativeMethods.Gdip.GdipPlayMetafileRecord(new HandleRef(this, nativeImage),
                                                 recordType,
                                                 flags,
                                                 dataSize,
                                                 data);
                                                 
     if (status != SafeNativeMethods.Gdip.Ok)
         throw SafeNativeMethods.Gdip.StatusException(status);
 }