public static int[] GetFieldOffsets(OSPlatform platform, bool is64Bit, NativeCapabilities nativeCapabilities)
        {
            var fieldTypes = new RfbType[FieldTypes.Length];

            Array.Copy(FieldTypes, fieldTypes, fieldTypes.Length);

            if (!nativeCapabilities.HaveLibZ)
            {
                fieldTypes[(int)RfbClientRecPtrField.CompStream]        = RfbType.Skip;
                fieldTypes[(int)RfbClientRecPtrField.CompStreamInited]  = RfbType.Skip;
                fieldTypes[(int)RfbClientRecPtrField.ZlibCompressLevel] = RfbType.Skip;
            }

            if (!nativeCapabilities.HaveLibZ && !nativeCapabilities.HaveLibPng)
            {
                fieldTypes[(int)RfbClientRecPtrField.TightQualityLevel] = RfbType.Skip;

                if (!nativeCapabilities.HaveLibJpeg)
                {
                    fieldTypes[(int)RfbClientRecPtrField.ZsStruct]           = RfbType.Skip;
                    fieldTypes[(int)RfbClientRecPtrField.ZsActive]           = RfbType.Skip;
                    fieldTypes[(int)RfbClientRecPtrField.ZsLevel]            = RfbType.Skip;
                    fieldTypes[(int)RfbClientRecPtrField.TightCompressLevel] = RfbType.Skip;
                }
            }

            if (!nativeCapabilities.HaveLibZ)
            {
                fieldTypes[(int)RfbClientRecPtrField.ZrleData]    = RfbType.Skip;
                fieldTypes[(int)RfbClientRecPtrField.ZywrleLevel] = RfbType.Skip;
                fieldTypes[(int)RfbClientRecPtrField.ZywrleBuf]   = RfbType.Skip;
            }

            if (!nativeCapabilities.HaveLibZ && !nativeCapabilities.HaveLibPng)
            {
                fieldTypes[(int)RfbClientRecPtrField.TightEncoding] = RfbType.Skip;

                if (!nativeCapabilities.HaveLibJpeg)
                {
                    fieldTypes[(int)RfbClientRecPtrField.TurboSubsampLevel] = RfbType.Skip;
                    fieldTypes[(int)RfbClientRecPtrField.TurboQualityLevel] = RfbType.Skip;
                }
            }

            if (nativeCapabilities.HaveWin32Threads)
            {
                fieldTypes[(int)RfbClientRecPtrField.OutputMutex]   = RfbType.Win32Mutex;
                fieldTypes[(int)RfbClientRecPtrField.RefCountMutex] = RfbType.Win32Mutex;
                fieldTypes[(int)RfbClientRecPtrField.SendMutex]     = RfbType.Win32Mutex;
                fieldTypes[(int)RfbClientRecPtrField.UpdateMutex]   = RfbType.Win32Mutex;

                fieldTypes[(int)RfbClientRecPtrField.Pipe_notify_client_thread] = RfbType.Skip;
            }

            return(NativeLayout.GetFieldOffsets(fieldTypes, platform, is64Bit));
        }
        public static int[] GetFieldOffsets(OSPlatform platform, bool is64Bit, NativeCapabilities nativeCapabilities)
        {
            var fieldTypes = new RfbType[FieldTypes.Length];

            Array.Copy(FieldTypes, fieldTypes, fieldTypes.Length);

            if (nativeCapabilities.HaveWin32Threads)
            {
                fieldTypes[(int)RfbScreenInfoPtrField.CursorMutex] = RfbType.Win32Mutex;
            }

            return(NativeLayout.GetFieldOffsets(fieldTypes, platform, is64Bit));
        }
        public static int[] GetFieldOffsets(OSPlatform platform, bool is64Bit)
        {
            NativeCapabilities nativeCapabilities;

            if (platform == OSPlatform.Windows)
            {
                nativeCapabilities = new NativeCapabilities()
                {
                    HaveLibJpeg      = true,
                    HaveLibPng       = true,
                    HaveLibZ         = true,
                    HaveLibPthread   = false,
                    HaveWin32Threads = true,
                };
            }
            else
            {
                nativeCapabilities = NativeCapabilities.Unix;
            }

            return(GetFieldOffsets(platform, is64Bit, nativeCapabilities));
        }