2
0
Эх сурвалжийг харах

Removed plugin 's units and fixed

GLScene 2 жил өмнө
parent
commit
5a044c9654
100 өөрчлөгдсөн 125 нэмэгдсэн , 8001 устгасан
  1. 1 1
      Examples/AdvDemos/ActorMS3D/fActorms3dD.pas
  2. 1 1
      Examples/AdvDemos/Archipelago/fArchipelagoC.cpp
  3. 1 1
      Examples/AdvDemos/Archipelago/fArchipelagoC.h
  4. 1 1
      Examples/AdvDemos/Archipelago/fArchipelagoD.pas
  5. 2 2
      Examples/AdvDemos/Forest/fForestD.pas
  6. 1 1
      Examples/AdvDemos/GLSViewer/Source/fMain.pas
  7. 1 1
      Examples/AdvDemos/PanoramViewer/fPanoViewerC.cpp
  8. 1 1
      Examples/AdvDemos/PanoramViewer/fPanoViewerC.h
  9. 1 1
      Examples/AdvDemos/PanoramViewer/fPanoViewerD.pas
  10. 1 1
      Examples/Demos/behaviours/DCEDemo/fDceDemoC.h
  11. 1 1
      Examples/Demos/behaviours/DCEDemo/fDceDemoD.pas
  12. 1 1
      Examples/Demos/behaviours/FPSMovement/fFPSMovementC.h
  13. 1 1
      Examples/Demos/behaviours/FPSMovement/fFPSMovementD.pas
  14. 1 1
      Examples/Demos/cgshaders/CloudSky/fCloudSkyD.pas
  15. 1 1
      Examples/Demos/cgshaders/CloudSky/fSkyClouds.pas
  16. 2 2
      Examples/Demos/collisions/boxedin/fBoxC.cpp
  17. 1 1
      Examples/Demos/collisions/boxedin/fBoxedinD.pas
  18. 1 1
      Examples/Demos/computing/VertexDataGeneration/fVertexGenD.pas
  19. 1 1
      Examples/Demos/glslshaders/GLSLProjectedTexture/fProjectTextureD.pas
  20. 1 1
      Examples/Demos/glslshaders/Mandelbrot/fMandelbrotD.pas
  21. 1 1
      Examples/Demos/glslshaders/ShadersLab/fShaderLabD.pas
  22. 1 1
      Examples/Demos/glslshaders/Shadertoy/fShadertoyD.pas
  23. 3 3
      Examples/Demos/glslshaders/SimpleGLSL/fSimpleShaderC.cpp
  24. 1 1
      Examples/Demos/interface/GameMenu/fGameMenuC.h
  25. 1 1
      Examples/Demos/interface/GameMenu/fGameMenuD.pas
  26. 1 1
      Examples/Demos/interface/GizmoEx/fGizmoExC.h
  27. 1 1
      Examples/Demos/interface/GizmoEx/fGizmoExD.pas
  28. 1 1
      Examples/Demos/interface/camera/fCameraC.h
  29. 1 1
      Examples/Demos/interface/camera/fCameraD.pas
  30. 1 1
      Examples/Demos/materials/TransparencyAdvanced/fTransparencyAdv.pas
  31. 1 1
      Examples/Demos/meshes/actortwocam/fActorTwocamC.h
  32. 2 2
      Examples/Demos/meshes/actortwocam/fActorTwocamD.pas
  33. 1 1
      Examples/Demos/meshes/portal/fPortalC.h
  34. 1 1
      Examples/Demos/meshes/portal/fPortalD.pas
  35. 1 1
      Examples/Demos/meshes/shadedterrain/fShadedTerrainC.h
  36. 1 1
      Examples/Demos/meshes/shadedterrain/fShadedTerrainD.pas
  37. 1 1
      Examples/Demos/meshes/synthterr/fSynthTerrainC.h
  38. 1 1
      Examples/Demos/meshes/synthterr/fSynthTerrainD.pas
  39. 2 2
      Examples/Demos/meshes/terrain/fTerrainC.cpp
  40. 1 1
      Examples/Demos/meshes/terrain/fTerrainD.pas
  41. 1 1
      Examples/Demos/meshes/tiles/fTilesD.pas
  42. 1 1
      Examples/Demos/movements/SmoothNavigator/fSmoothNaviC.h
  43. 1 1
      Examples/Demos/movements/SmoothNavigator/fSmoothNaviD.pas
  44. 1 1
      Examples/Demos/physics/ClothActor/fClothActorD.pas
  45. 1 1
      Examples/Demos/physics/NewtonJoints/fNewtonJointsD.pas
  46. 1 1
      Examples/Demos/physics/NewtonWalkCarry/fNewtonWalkCarryD.pas
  47. 1 1
      Examples/Demos/physics/NewtonWalkShoot/fNGDWalkShootD.pas
  48. 1 1
      Examples/Demos/physics/OdeConveyor/fOdeConveyorD.pas
  49. 1 1
      Examples/Demos/physics/OdeFurball/fOdeFurballC.cpp
  50. 1 1
      Examples/Demos/physics/OdeFurball/fOdeFurballC.h
  51. 1 1
      Examples/Demos/physics/OdeFurball/fOdeFurballD.pas
  52. 1 1
      Examples/Demos/physics/OdeRagdoll/fOdeRagdollD.pas
  53. 1 1
      Examples/Demos/physics/OdeTerrain/fOdeTerrainC.h
  54. 1 1
      Examples/Demos/physics/OdeTerrain/fOdeTerrainD.pas
  55. 1 1
      Examples/Demos/physics/PhysXScatter/PhysXScatterFm.pas
  56. 1 1
      Examples/Demos/rendering/MultiSampleTexture/fMultiTexturesC.h
  57. 1 1
      Examples/Demos/rendering/MultiSampleTexture/fMultiTexturesD.pas
  58. 1 1
      Examples/Demos/rendering/QuadTreeCulling/fQuadtreeCullingD.pas
  59. 1 1
      Examples/Demos/rendering/SkyBox/fSkyBoxC.h
  60. 1 1
      Examples/Demos/rendering/SkyBox/fSkyBoxD.pas
  61. 1 1
      Examples/Demos/rendering/celshading/fCelShadingC.h
  62. 1 1
      Examples/Demos/rendering/celshading/fCelShadingD.pas
  63. 1 1
      Examples/Demos/specialsFX/PFXCursor/fPfxCursor.pas
  64. 1 1
      Examples/Demos/specialsFX/PFXCursor/fPfxCursorD.pas
  65. 1 1
      Examples/Demos/specialsFX/PFXGallery/fPFXGallaryC.cpp
  66. 1 1
      Examples/Demos/specialsFX/PFXGallery/fPFXGalleryD.pas
  67. 1 1
      Examples/Demos/specialsFX/ShadowmappingFBO/fShadowFBOD.pas
  68. 1 1
      Examples/Demos/specialsFX/motionblur/fMotionBlurC.h
  69. 1 1
      Examples/Demos/specialsFX/spiral/fSpiralC.h
  70. 1 1
      Examples/Demos/utilities/GLInfo/fGLInfosD.pas
  71. 1 1
      Examples/Demos/utilities/keymap/fKeymapD.pas
  72. 1 1
      Examples/Demos/utilities/recorder/Unit1.cpp
  73. 1 1
      Examples/Demos/utilities/recorder/Unit1.h
  74. 0 1
      Packages/GLScene_DT.dpk
  75. 0 3
      Packages/GLScene_DT.dproj
  76. 7 8
      Packages/GLScene_RT.dpk
  77. 7 8
      Packages/GLScene_RT.dproj
  78. 8 11
      Packagex/GLArena_RT.dpk
  79. 7 10
      Packagex/GLArena_RT.dproj
  80. 0 0
      Source/Common/Formats.GL2.pas
  81. 0 1
      Source/Common/Formats.LWO.pas
  82. 0 1
      Source/Common/Formats.Q3BSP.pas
  83. 1 1
      Source/Common/Scena.Keyboard.pas
  84. 1 1
      Source/Common/Scena.OpenGLAdapter.pas
  85. 1 1
      Source/Common/Scena.PipelineTransformation.pas
  86. 1 1
      Source/FMX/CUDAx.Context.pas
  87. 0 336
      Source/FMX/Formatx.GL2.pas
  88. 0 2281
      Source/FMX/Formatx.LWObjects.pas
  89. 0 200
      Source/FMX/Formatx.Q3BSP.pas
  90. 1 1
      Source/FMX/Formatx.Q3MD3.pas
  91. 0 4616
      Source/FMX/Formatx.VFW.pas
  92. 1 1
      Source/FMX/GLSLx.ProjectedTextures.pas
  93. 1 1
      Source/FMX/GLX.AVIRecorder.pas
  94. 5 6
      Source/FMX/GLX.Context.pas
  95. 1 1
      Source/FMX/GLX.FBORenderer.pas
  96. 1 1
      Source/FMX/GLX.Feedback.pas
  97. 1 1
      Source/FMX/GLX.FileLWO.pas
  98. 1 1
      Source/FMX/GLX.FileQ3BSP.pas
  99. 1 1
      Source/FMX/GLX.FireFX.pas
  100. 0 428
      Source/FMX/GLX.Generics.pas

+ 1 - 1
Examples/AdvDemos/ActorMS3D/fActorms3dD.pas

@@ -15,7 +15,7 @@ uses
   Vcl.Imaging.jpeg,
   Vcl.Imaging.pngimage,
 
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLS.VectorLists,
   GLS.Cadencer,
   GLS.SceneViewer,

+ 1 - 1
Examples/AdvDemos/Archipelago/fArchipelagoC.cpp

@@ -512,7 +512,7 @@ void __fastcall TForm1::DOWakeProgress(TObject *Sender, const double deltaTime,
 // ---------------------------------------------------------------------------
 void __fastcall TForm1::DOWakeRender(TObject *Sender, TGLRenderContextInfo &rci) {
 	int i, n;
-	Gls::Vectortypes::TVector3f p;
+	Scena::Vectortypes::TVector3f p;
 	TGLVector sbp;
 	float c;
 

+ 1 - 1
Examples/AdvDemos/Archipelago/fArchipelagoC.h

@@ -43,7 +43,7 @@
 #include "Scena.VectorTypes.hpp"
 #include "Scena.VectorGeometry.hpp"
 
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.Context.hpp"
 #include "GLS.State.hpp"
 #include "Scena.TextureFormat.hpp"

+ 1 - 1
Examples/AdvDemos/Archipelago/fArchipelagoD.pas

@@ -38,7 +38,7 @@ uses
   GLS.VectorLists,
   Scena.VectorTypes,
   Scena.VectorGeometry,
-  GLS.Keyboard,
+  Scena.Keyboard,
   Scena.OpenGLTokens,
   GLS.Context,
   GLS.State,

+ 2 - 2
Examples/AdvDemos/Forest/fForestD.pas

@@ -26,7 +26,7 @@ uses
   GLS.Scene,
   GLS.Objects,
   GLS.Tree,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.VectorLists,
   GLS.BitmapFont,
   GLS.Context,
@@ -37,7 +37,7 @@ uses
   GLS.ParticleFX,
   GLS.Graphics,
   GLS.PersistentClasses,
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLS.XOpenGL,
   GLS.BaseClasses,
   GLS.TextureCombiners,

+ 1 - 1
Examples/AdvDemos/GLSViewer/Source/fMain.pas

@@ -48,7 +48,7 @@ uses
   GLS.RenderContextInfo,
   Scena.TextureFormat,
   GLS.Color,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Graphics,
   GLS.PersistentClasses,
   GLS.MeshUtils,

+ 1 - 1
Examples/AdvDemos/PanoramViewer/fPanoViewerC.cpp

@@ -16,7 +16,7 @@
 #pragma link "GLS.Coordinates"
 
 #pragma link "GLS.Material"
-#pragma link "GLS.KeyBoard"
+#pragma link "Scena.Keyboard"
 #pragma resource "*.dfm"
 TForm1* Form1;
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/AdvDemos/PanoramViewer/fPanoViewerC.h

@@ -22,7 +22,7 @@
 #include "GLS.Coordinates.hpp"
 #include "GLS.Material.hpp"
 
-#include "GLS.KeyBoard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.FileJPEG.hpp"
 #include "GLS.Utils.hpp"
 

+ 1 - 1
Examples/AdvDemos/PanoramViewer/fPanoViewerD.pas

@@ -22,7 +22,7 @@ uses
   GLS.Scene,
   GLS.Objects,
   GLS.Texture,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Cadencer,
   GLS.SceneViewer,
   GLS.Material,

+ 1 - 1
Examples/Demos/behaviours/DCEDemo/fDceDemoC.h

@@ -33,7 +33,7 @@
 #include "GLS.FileMD2.hpp"
 #include "GLS.BaseClasses.hpp"
 #include "GLS.RenderContextInfo.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.State.hpp"
 #include "Scena.VectorGeometry.hpp"
 #include "GLS.Context.hpp"

+ 1 - 1
Examples/Demos/behaviours/DCEDemo/fDceDemoD.pas

@@ -35,7 +35,7 @@ uses
   GLS.Context,
   GLS.EllipseCollision,
   GLS.RenderContextInfo,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.ProxyObjects,
   GLS.State,
   GLS.Utils,

+ 1 - 1
Examples/Demos/behaviours/FPSMovement/fFPSMovementC.h

@@ -22,7 +22,7 @@
 #include "GLS.SimpleNavigation.hpp"
 #include "GLS.VectorFileObjects.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.GeomObjects.hpp"
 #include "Scena.VectorGeometry.hpp"
 #include "GLS.Octree.hpp"

+ 1 - 1
Examples/Demos/behaviours/FPSMovement/fFPSMovementD.pas

@@ -20,7 +20,7 @@ uses
   GLS.Texture,
   GLS.Cadencer,
   GLS.FPSMovement,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.State,
   GLS.SceneViewer,
   GLS.Objects,

+ 1 - 1
Examples/Demos/cgshaders/CloudSky/fCloudSkyD.pas

@@ -25,7 +25,7 @@ uses
   GLS.SkyDome,
   GLS.Texture,
   GLS.FileTGA,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Material,
   GLS.Coordinates,
   GLS.BaseClasses,

+ 1 - 1
Examples/Demos/cgshaders/CloudSky/fSkyClouds.pas

@@ -26,7 +26,7 @@ uses
   GLS.Texture,
   CG.Shader,
   GLS.FileTGA,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Material,
   GLS.Coordinates,
   GLS.BaseClasses,

+ 2 - 2
Examples/Demos/collisions/boxedin/fBoxC.cpp

@@ -4,7 +4,7 @@
 #include <tchar.h>
 
 #include <stdlib.h>
-#include <GLS.Keyboard.hpp>
+#include <Scena.Keyboard.hpp>
 #pragma hdrstop
 
 #include "fBoxC.h"
@@ -20,7 +20,7 @@
 #pragma link "GLS.Scene"
 #pragma link "GLS.File3DS"
 #pragma link "Scena.VectorGeometry"
-#pragma link "GLS.Keyboard"
+#pragma link "Scena.Keyboard"
 #pragma link "GLS.Coordinates"
 
 #pragma link "GLS.BaseClasses"

+ 1 - 1
Examples/Demos/collisions/boxedin/fBoxedinD.pas

@@ -13,7 +13,7 @@ uses
   Vcl.StdCtrls,
   Vcl.ComCtrls,
 
-  GLS.Keyboard,
+  Scena.Keyboard,
   Scena.VectorGeometry,
   GLS.Scene,
   GLS.VectorFileObjects,

+ 1 - 1
Examples/Demos/computing/VertexDataGeneration/fVertexGenD.pas

@@ -14,7 +14,7 @@ uses
   GLS.Scene,
   Scena.VectorTypes,
   Scena.VectorGeometry,
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLS.Cadencer,
   GLS.SceneViewer,
  

+ 1 - 1
Examples/Demos/glslshaders/GLSLProjectedTexture/fProjectTextureD.pas

@@ -26,7 +26,7 @@ uses
   GLS.FileLMTS,
   GLS.Context,
   Scena.VectorGeometry,
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLSL.ProjectedTextures,
 
   GLS.Graphics,

+ 1 - 1
Examples/Demos/glslshaders/Mandelbrot/fMandelbrotD.pas

@@ -23,7 +23,7 @@ uses
   GLS.Cadencer,
   GLS.Scene,
   GLS.Context,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Utils,
   GLS.FileTGA,
   GLS.HUDObjects,

+ 1 - 1
Examples/Demos/glslshaders/ShadersLab/fShaderLabD.pas

@@ -27,7 +27,7 @@ uses
   Scena.VectorGeometry,
   GLS.BaseClasses,
   GLS.PersistentClasses,
-  GLS.Keyboard,
+  Scena.Keyboard,
 
   GLS.Material,
   GLS.Scene,

+ 1 - 1
Examples/Demos/glslshaders/Shadertoy/fShadertoyD.pas

@@ -17,7 +17,7 @@ uses
   GLS.Objects,
   GLS.Cadencer,
   GLS.SceneViewer,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.RenderContextInfo,
   GLS.OpenGLAdapter,
   Scena.OpenGLTokens,

+ 3 - 3
Examples/Demos/glslshaders/SimpleGLSL/fSimpleShaderC.cpp

@@ -7,7 +7,7 @@
 
 #include "fSimpleShaderC.h"
 
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.Context.hpp"
 #include "GLS.File3DS.hpp"
 
@@ -26,7 +26,7 @@
 #pragma link "GLS.VectorFileObjects"
 #pragma link "GLS.SceneViewer"
 #pragma link "GLS.WindowsFont"
-#pragma link "GLS.Keyboard"
+#pragma link "Scena.Keyboard"
 #pragma link "GLS.Context"
 #pragma link "GLS.File3DS"
 
@@ -177,7 +177,7 @@ void __fastcall TForm1::Timer1Timer(TObject* Sender)
     Caption = Format("Simple GLSL Shader [%.2f FPS]",
         ARRAYOFCONST((GLSceneViewer1->FramesPerSecond())));
     GLHUDText1->Text =
-        "GLS.Keyboard [1,2,3,4,5,6,7,8,9,0 ] Current Shader: " + CurrShaderName;
+        "Scena.Keyboard [1,2,3,4,5,6,7,8,9,0 ] Current Shader: " + CurrShaderName;
     GLSceneViewer1->ResetPerformanceMonitor();
 }
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/interface/GameMenu/fGameMenuC.h

@@ -24,7 +24,7 @@
 #include "GLS.GameMenu.hpp"
 #include "GLS.Cadencer.hpp"
 #include "GLS.Texture.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 #include "GLS.Material.hpp"
 #include "GLS.Coordinates.hpp"

+ 1 - 1
Examples/Demos/interface/GameMenu/fGameMenuD.pas

@@ -26,7 +26,7 @@ uses
   GLS.GameMenu,
   GLS.Cadencer,
   GLS.Texture,
-  GLS.Keyboard,
+  Scena.Keyboard,
  
   GLS.Material,
   GLS.Coordinates,

+ 1 - 1
Examples/Demos/interface/GizmoEx/fGizmoExC.h

@@ -24,7 +24,7 @@
 #include "GLS.Scene.hpp"
 #include "GLS.SceneViewer.hpp"
 #include "GLS.WindowsFont.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.GizmoEx.hpp"
 
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/interface/GizmoEx/fGizmoExD.pas

@@ -22,7 +22,7 @@ uses
   GLS.Objects,
   Scena.VectorTypes,
   GLS.SceneViewer,
-  GLS.Keyboard,
+  Scena.Keyboard,
 
   GLS.Utils,
   GLS.GizmoEx,

+ 1 - 1
Examples/Demos/interface/camera/fCameraC.h

@@ -17,7 +17,7 @@
 #include "GLS.Scene.hpp"
 #include "GLS.GeomObjects.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 //---------------------------------------------------------------------------
 class TForm1 : public TForm

+ 1 - 1
Examples/Demos/interface/camera/fCameraD.pas

@@ -15,7 +15,7 @@ uses
   Scena.VectorTypes,
   GLS.Objects,
   GLS.PersistentClasses,
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLS.GeomObjects,
   GLS.Coordinates,
   GLS.BaseClasses,

+ 1 - 1
Examples/Demos/materials/TransparencyAdvanced/fTransparencyAdv.pas

@@ -37,7 +37,7 @@ uses
   GLS.HUDObjects,
   GLS.BitmapFont,
   GLS.WindowsFont,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.CompositeImage,
 
   GLS.Utils;

+ 1 - 1
Examples/Demos/meshes/actortwocam/fActorTwocamC.h

@@ -25,7 +25,7 @@
 #include "GLS.Navigator.hpp"
 #include "GLS.SkyDome.hpp"
 #include "GLS.VectorFileObjects.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "Scena.VectorGeometry.hpp"
 
 //---------------------------------------------------------------------------

+ 2 - 2
Examples/Demos/meshes/actortwocam/fActorTwocamD.pas

@@ -33,7 +33,7 @@ uses
   GLS.BaseClasses,
   GLS.Utils,
   Scena.VectorGeometry,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.PersistentClasses, GLS.DCE;
 
 type
@@ -133,7 +133,7 @@ var
   moving: String;
   boost: Single;
 begin
-  // This function uses asynchronous keyboard check (see GLS.Keyboard.pas)
+  // This function uses asynchronous keyboard check (see Scena.Keyboard.pas)
   if IsKeyDown(VK_ESCAPE) then
     Close;
   if IsKeyDown('A') then

+ 1 - 1
Examples/Demos/meshes/portal/fPortalC.h

@@ -20,7 +20,7 @@
 #include "GLS.Portal.hpp"
 #include "GLS.VectorFileObjects.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "JPeg.hpp"
 
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/meshes/portal/fPortalD.pas

@@ -30,7 +30,7 @@ uses
   GLS.Material,
   GLS.Coordinates,
   GLS.BaseClasses,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Utils, GLS.SimpleNavigation;
 
 type

+ 1 - 1
Examples/Demos/meshes/shadedterrain/fShadedTerrainC.h

@@ -27,7 +27,7 @@
 
 #include "GLS.Material.hpp"
 
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include <jpeg.hpp>
 #include "GLSL.TextureShaders.hpp"             // Pascal unit
 

+ 1 - 1
Examples/Demos/meshes/shadedterrain/fShadedTerrainD.pas

@@ -21,7 +21,7 @@ uses
   GLS.Scene,
   GLS.BaseClasses,
   GLS.Objects,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.TerrainRenderer,
   GLS.ROAMPatch,
   GLS.HeightData,

+ 1 - 1
Examples/Demos/meshes/synthterr/fSynthTerrainC.h

@@ -23,7 +23,7 @@
 #include "GLS.HeightData.hpp"
 #include "GLS.SceneViewer.hpp"
 #include "Jpeg.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 
 

+ 1 - 1
Examples/Demos/meshes/synthterr/fSynthTerrainD.pas

@@ -29,7 +29,7 @@ uses
   GLS.Material,
   GLS.Coordinates,
   GLS.BaseClasses,
-  GLS.Keyboard, GLS.ShadowHDS;
+  Scena.Keyboard, GLS.ShadowHDS;
 
 type
   TFormSynthTerrain = class(TForm)

+ 2 - 2
Examples/Demos/meshes/terrain/fTerrainC.cpp

@@ -1,7 +1,7 @@
 //---------------------------------------------------------------------------
 
 #include <vcl.h>
-#include <GLS.Keyboard.hpp>
+#include <Scena.Keyboard.hpp>
 #include <stdlib.h>
 
 #pragma hdrstop
@@ -24,7 +24,7 @@
 #pragma link "GLS.Objects"
 #pragma link "GLS.TerrainRenderer"
 #pragma link "GLS.Scene"
-#pragma link "GLS.Keyboard"
+#pragma link "Scena.Keyboard"
 #pragma link "GLS.BaseClasses"
 #pragma link "GLS.Coordinates"
 

+ 1 - 1
Examples/Demos/meshes/terrain/fTerrainD.pas

@@ -27,7 +27,7 @@ uses
   GLS.Cadencer,
   GLS.Texture,
   GLS.BitmapFont,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.SkyDome,
   GLS.SceneViewer,
   GLS.SoundManager,

+ 1 - 1
Examples/Demos/meshes/tiles/fTilesD.pas

@@ -32,7 +32,7 @@ uses
   GLS.BaseClasses,
   GLS.RenderContextInfo,
   Scena.TextureFormat,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Utils,
   GLS.SimpleNavigation;
 

+ 1 - 1
Examples/Demos/movements/SmoothNavigator/fSmoothNaviC.h

@@ -22,7 +22,7 @@
 #include "GLS.Scene.hpp"
 #include "GLS.SceneViewer.hpp"
 #include "GLS.SmoothNavigator.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.Utils.hpp"
 
 

+ 1 - 1
Examples/Demos/movements/SmoothNavigator/fSmoothNaviD.pas

@@ -14,7 +14,7 @@ uses
 
   GLS.Cadencer, 
   GLS.SceneViewer, 
-  GLS.Keyboard, 
+  Scena.Keyboard, 
   Scena.VectorGeometry, 
   GLS.GeomObjects,
   GLS.Scene, 

+ 1 - 1
Examples/Demos/physics/ClothActor/fClothActorD.pas

@@ -26,7 +26,7 @@ uses
   GLS.VerletTypes,
   GLS.VerletClothify,
   GLS.ShadowVolume,
-  GLS.Keyboard,
+  Scena.Keyboard,
   Scena.VectorGeometry,
   GLS.GeometryBB,
   GLS.SpacePartition,

+ 1 - 1
Examples/Demos/physics/NewtonJoints/fNewtonJointsD.pas

@@ -23,7 +23,7 @@ uses
   GLS.BaseClasses,
   Scena.VectorGeometry,
   GLS.SimpleNavigation,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.GeomObjects,
   GLS.HUDObjects,
   GLS.BitmapFont,

+ 1 - 1
Examples/Demos/physics/NewtonWalkCarry/fNewtonWalkCarryD.pas

@@ -33,7 +33,7 @@ uses
   GLS.Coordinates,
   GLS.File3DS,
   GLS.Navigator,
-  GLS.Keyboard,
+  Scena.Keyboard,
   Scena.VectorTypes,
   GLS.Color,
   GLS.HUDObjects,

+ 1 - 1
Examples/Demos/physics/NewtonWalkShoot/fNGDWalkShootD.pas

@@ -30,7 +30,7 @@ uses
   GLS.File3DS,
   Scena.VectorGeometry,
   GLS.Material,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Utils;
 
 type

+ 1 - 1
Examples/Demos/physics/OdeConveyor/fOdeConveyorD.pas

@@ -27,7 +27,7 @@ uses
   GLS.BaseClasses,
   GLS.SceneViewer,
   Scena.VectorGeometry,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.SimpleNavigation;
 
 type

+ 1 - 1
Examples/Demos/physics/OdeFurball/fOdeFurballC.cpp

@@ -17,7 +17,7 @@
 #pragma link "GLS.Objects"
 #pragma link "GLS.Scene"
 #pragma link "GLS.SceneViewer"
-#pragma link "GLS.Keyboard"
+#pragma link "Scena.Keyboard"
 #pragma link "GLS.VerletTypes"
 
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/physics/OdeFurball/fOdeFurballC.h

@@ -23,7 +23,7 @@
 #include "GLS.Texture.hpp"
 #include "GLS.Objects.hpp"
 #include "GLS.BaseClasses.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.Coordinates.hpp"
 
 #include "GLS.VerletTypes.hpp"

+ 1 - 1
Examples/Demos/physics/OdeFurball/fOdeFurballD.pas

@@ -29,7 +29,7 @@ uses
   GLS.ShadowPlane,
   GLS.Navigator,
   GLS.VerletTypes,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Color,
  
   GLS.Coordinates,

+ 1 - 1
Examples/Demos/physics/OdeRagdoll/fOdeRagdollD.pas

@@ -26,7 +26,7 @@ uses
   GLS.BitmapFont,
   GLS.WindowsFont,
   GLS.HUDObjects,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.VectorFileObjects,
   GLS.Ragdoll,
   GLS.Texture,

+ 1 - 1
Examples/Demos/physics/OdeTerrain/fOdeTerrainC.h

@@ -27,7 +27,7 @@
 #include "GLS.SceneViewer.hpp"
 #include "GLS.Utils.hpp"
 #include "JPeg.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "Physics.ODEManager.hpp"
 
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/physics/OdeTerrain/fOdeTerrainD.pas

@@ -21,7 +21,7 @@ uses
   GLS.TerrainRenderer,
   GLS.Objects,
   GLS.HeightData,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Cadencer,
   GLS.Texture,
   GLS.HUDObjects,

+ 1 - 1
Examples/Demos/physics/PhysXScatter/PhysXScatterFm.pas

@@ -21,7 +21,7 @@ uses
   Scena.VectorTypes,
   GLS.SceneViewer,
   GLS.Color,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.BaseClasses,
   Scena.VectorGeometry,
   GLS.GeomObjects,

+ 1 - 1
Examples/Demos/rendering/MultiSampleTexture/fMultiTexturesC.h

@@ -26,7 +26,7 @@
 #include "GLS.WindowsFont.hpp"
 #include "GLS.State.hpp"
 #include "GLS.Context.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 //---------------------------------------------------------------------------
 class TForm1 : public TForm

+ 1 - 1
Examples/Demos/rendering/MultiSampleTexture/fMultiTexturesD.pas

@@ -35,7 +35,7 @@ uses
   GLS.SimpleNavigation,
   GLS.State,
   GLS.Context,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.MultiSampleImage;
 
 type

+ 1 - 1
Examples/Demos/rendering/QuadTreeCulling/fQuadtreeCullingD.pas

@@ -21,7 +21,7 @@ uses
   GLS.SceneViewer,
   GLS.SkyDome,
   GLS.Objects,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.HeightData,
   GLS.TerrainRenderer,
   GLS.Texture,

+ 1 - 1
Examples/Demos/rendering/SkyBox/fSkyBoxC.h

@@ -19,7 +19,7 @@
 #include "GLS.SimpleNavigation.hpp"
 #include "GLS.SkyDome.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "JPeg.hpp"
 #include "GLS.FileJPEG.hpp"
 #include "GLS.Utils.hpp"

+ 1 - 1
Examples/Demos/rendering/SkyBox/fSkyBoxD.pas

@@ -22,7 +22,7 @@ uses
   GLS.Cadencer,
   GLS.Navigator,
   GLS.SceneViewer,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.LensFlare,
   GLS.Objects,
   GLS.Material,

+ 1 - 1
Examples/Demos/rendering/celshading/fCelShadingC.h

@@ -21,7 +21,7 @@
 #include "GLS.Coordinates.hpp"
 
 #include "GLS.Material.hpp"          // Pascal unit
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.FileMD2.hpp"
 #include "GLS.Utils.hpp"
 

+ 1 - 1
Examples/Demos/rendering/celshading/fCelShadingD.pas

@@ -29,7 +29,7 @@ uses
   GLS.Coordinates,
   GLS.BaseClasses,
   GLS.FileMD2,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.Utils,
   GLSL.ShapeShaders;
 

+ 1 - 1
Examples/Demos/specialsFX/PFXCursor/fPfxCursor.pas

@@ -22,7 +22,7 @@ uses
   GLS.Scene,
   Scena.VectorGeometry,
   GLS.Graphics,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.ParticleFX,
   GLS.Objects,
   GLS.HUDObjects,

+ 1 - 1
Examples/Demos/specialsFX/PFXCursor/fPfxCursorD.pas

@@ -22,7 +22,7 @@ uses
   GLS.Scene,
   Scena.VectorGeometry,
   GLS.Graphics,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.ParticleFX,
   GLS.Objects,
   GLS.HUDObjects,

+ 1 - 1
Examples/Demos/specialsFX/PFXGallery/fPFXGallaryC.cpp

@@ -23,7 +23,7 @@
 #pragma link "GLS.Scene"
 #pragma link "GLS.SpaceText"
 #pragma link "GLS.SceneViewer"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 #pragma resource "*.dfm"
 TForm1 *Form1;

+ 1 - 1
Examples/Demos/specialsFX/PFXGallery/fPFXGalleryD.pas

@@ -28,7 +28,7 @@ uses
   GLS.Texture,
   GLS.Navigator,
   GLS.GeomObjects,
-  GLS.Keyboard,
+  Scena.Keyboard,
   GLS.SpaceText,
   GLS.Behaviours,
   GLS.PerlinPFX,

+ 1 - 1
Examples/Demos/specialsFX/ShadowmappingFBO/fShadowFBOD.pas

@@ -37,7 +37,7 @@ uses
   GLS.RenderContextInfo,
   GLS.SimpleNavigation,
   GLS.VectorFileObjects,
-  GLS.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLS.FileMD2,
   Formats.DDSImage,
   GLS.FileOBJ,

+ 1 - 1
Examples/Demos/specialsFX/motionblur/fMotionBlurC.h

@@ -18,7 +18,7 @@
 #include "GLS.Objects.hpp"
 #include "GLS.Scene.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.VectorFileObjects.hpp"
 //---------------------------------------------------------------------------
 class TForm1 : public TForm

+ 1 - 1
Examples/Demos/specialsFX/spiral/fSpiralC.h

@@ -21,7 +21,7 @@
 #include "GLS.Coordinates.hpp"
 #include "GLS.FullScreenViewer.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 #include "GLS.FullScreenViewer.hpp"
 
 //---------------------------------------------------------------------------

+ 1 - 1
Examples/Demos/utilities/GLInfo/fGLInfosD.pas

@@ -36,7 +36,7 @@ uses
   GLSL.CustomShader,
   GLSL.Shader,
   GLS.Utils,
-  GLS.KeyBoard,
+  Scena.Keyboard,
   GLS.SoundManager,
   Sounds.BASS,
   GLS.FileWAV,

+ 1 - 1
Examples/Demos/utilities/keymap/fKeymapD.pas

@@ -7,7 +7,7 @@ uses
   Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
   Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons,
   
-  GLS.Keyboard;
+  Scena.Keyboard;
 
 type
   TForm1 = class(TForm)

+ 1 - 1
Examples/Demos/utilities/recorder/Unit1.cpp

@@ -13,7 +13,7 @@
 #pragma link "GLS.Objects"
 #pragma link "GLS.Scene"
 #pragma link "GLAVIRecorder"
-#pragma link "GLS.Keyboard"
+#pragma link "Scena.Keyboard"
 #pragma link "GLS.BaseClasses"
 #pragma link "GLS.Coordinates"
 

+ 1 - 1
Examples/Demos/utilities/recorder/Unit1.h

@@ -14,7 +14,7 @@
 #include "GLS.Objects.hpp"
 #include "GLS.Scene.hpp"
 #include "GLS.SceneViewer.hpp"
-#include "GLS.Keyboard.hpp"
+#include "Scena.Keyboard.hpp"
 
 #ifndef Unit1H
 #define Unit1H

+ 0 - 1
Packages/GLScene_DT.dpk

@@ -51,7 +51,6 @@ contains
   FmShaderUniformEditor in '..\Source\Vcl\FmShaderUniformEditor.pas' {GLShaderUniformEditor},
   FmVectorEditor in '..\Source\Vcl\FmVectorEditor.pas' {GLVectorEditorForm},
   FmSceneEditor in '..\Source\Vcl\FmSceneEditor.pas' {GLSceneEditorForm},
-  FmPlugInManagerEditor in '..\Source\Vcl\FmPlugInManagerEditor.pas' {GLPlugInManagerEditorForm},
   FmXCollectionEditor in '..\Source\Vcl\FmXCollectionEditor.pas' {GLXCollectionEditorForm},
   FmInfo in '..\Source\Vcl\FmInfo.pas' {GLInfoForm},
   GLS.SceneRegister in '..\Source\VCL\GLS.SceneRegister.pas',

+ 0 - 3
Packages/GLScene_DT.dproj

@@ -156,9 +156,6 @@
         <DCCReference Include="..\Source\Vcl\FmSceneEditor.pas">
             <Form>GLSceneEditorForm</Form>
         </DCCReference>
-        <DCCReference Include="..\Source\Vcl\FmPlugInManagerEditor.pas">
-            <Form>GLPlugInManagerEditorForm</Form>
-        </DCCReference>
         <DCCReference Include="..\Source\Vcl\FmXCollectionEditor.pas">
             <Form>GLXCollectionEditorForm</Form>
         </DCCReference>

+ 7 - 8
Packages/GLScene_RT.dpk

@@ -44,10 +44,10 @@ contains
   ModuleLoader in '..\Source\Common\ModuleLoader.pas',
   Formats.DDSImage in '..\Source\Formats.DDSImage.pas',
   Formats.HDRImage in '..\Source\Formats.HDRImage.pas',
-  Formats.Q3BSP in '..\Source\Formats.Q3BSP.pas',
+  Formats.Q3BSP in '..\Source\Common\Formats.Q3BSP.pas',
   Formats.B3D in '..\Source\Formats.B3D.pas',
-  Formats.GL2 in '..\Source\Formats.GL2.pas',
-  Formats.LWO in '..\Source\Formats.LWO.pas',
+  Formats.GL2 in '..\Source\Common\Formats.GL2.pas',
+  Formats.LWO in '..\Source\Common\Formats.LWO.pas',
   Formats.MD2 in '..\Source\Formats.MD2.pas',
   Formats.MD3 in '..\Source\Formats.MD3.pas',
   Formats.OCT in '..\Source\Formats.OCT.pas',
@@ -132,7 +132,7 @@ contains
   GLS.FileDEL in '..\Source\GLS.FileDEL.pas',
   GLS.FileVOR in '..\Source\GLS.FileVOR.pas',
   GLS.FullScreenViewer in '..\Source\GLS.FullScreenViewer.pas',
-  GLS.Keyboard in '..\Source\GLS.Keyboard.pas',
+  Scena.Keyboard in '..\Source\Common\Scena.Keyboard.pas',
   GLS.GameMenu in '..\Source\GLS.GameMenu.pas',
   GLS.GeomObjects in '..\Source\GLS.GeomObjects.pas',
   GLS.GeometryBB in '..\Source\GLS.GeometryBB.pas',
@@ -149,7 +149,7 @@ contains
   GLS.Imposter in '..\Source\GLS.Imposter.pas',
   GLS.Isolines in '..\Source\GLS.Isolines.pas',
   GLS.Isosurface in '..\Source\GLS.Isosurface.pas',
-  GLS.Joystick in '..\Source\GLS.Joystick.pas',
+  GLS.Joystick in '..\Source\VCL\GLS.Joystick.pas',
   GLS.LensFlare in '..\Source\GLS.LensFlare.pas',
   GLS.LinePFX in '..\Source\GLS.LinePFX.pas',
   Scena.Logger in '..\Source\Common\Scena.Logger.pas',
@@ -246,13 +246,12 @@ contains
   GLS.WindowsContext in '..\Source\GLS.WindowsContext.pas',
   GLS.WindowsFont in '..\Source\GLS.WindowsFont.pas',
   GLS.zBuffer in '..\Source\GLS.zBuffer.pas',
-  GLS.OpenGLAdapter in '..\Source\GLS.OpenGLAdapter.pas',
+  Scena.OpenGLAdapter in '..\Source\Common\Scena.OpenGLAdapter.pas',
   GLS.PersistentClasses in '..\Source\GLS.PersistentClasses.pas',
-  GLS.PipelineTransformation in '..\Source\GLS.PipelineTransformation.pas',
+  Scena.PipelineTransformation in '..\Source\Common\Scena.PipelineTransformation.pas',
   GLS.Polynomials in '..\Source\GLS.Polynomials.pas',
   Scena.CrossXML in '..\Source\Common\Scena.CrossXML.pas',
   GLS.Silhouette in '..\Source\GLS.Silhouette.pas',
-  GLS.PlugInManager in '..\Source\GLS.PlugInManager.pas',
   GLS.VectorLists in '..\Source\GLS.VectorLists.pas',
   GLS.ScriptBase in '..\Source\GLS.ScriptBase.pas',
   GLS.XCollection in '..\Source\GLS.XCollection.pas',

+ 7 - 8
Packages/GLScene_RT.dproj

@@ -148,10 +148,10 @@
         <DCCReference Include="..\Source\Common\ModuleLoader.pas"/>
         <DCCReference Include="..\Source\Formats.DDSImage.pas"/>
         <DCCReference Include="..\Source\Formats.HDRImage.pas"/>
-        <DCCReference Include="..\Source\Formats.Q3BSP.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.Q3BSP.pas"/>
         <DCCReference Include="..\Source\Formats.B3D.pas"/>
-        <DCCReference Include="..\Source\Formats.GL2.pas"/>
-        <DCCReference Include="..\Source\Formats.LWO.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.GL2.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.LWO.pas"/>
         <DCCReference Include="..\Source\Formats.MD2.pas"/>
         <DCCReference Include="..\Source\Formats.MD3.pas"/>
         <DCCReference Include="..\Source\Formats.OCT.pas"/>
@@ -236,7 +236,7 @@
         <DCCReference Include="..\Source\GLS.FileDEL.pas"/>
         <DCCReference Include="..\Source\GLS.FileVOR.pas"/>
         <DCCReference Include="..\Source\GLS.FullScreenViewer.pas"/>
-        <DCCReference Include="..\Source\GLS.Keyboard.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.Keyboard.pas"/>
         <DCCReference Include="..\Source\GLS.GameMenu.pas"/>
         <DCCReference Include="..\Source\GLS.GeomObjects.pas"/>
         <DCCReference Include="..\Source\GLS.GeometryBB.pas"/>
@@ -253,7 +253,7 @@
         <DCCReference Include="..\Source\GLS.Imposter.pas"/>
         <DCCReference Include="..\Source\GLS.Isolines.pas"/>
         <DCCReference Include="..\Source\GLS.Isosurface.pas"/>
-        <DCCReference Include="..\Source\GLS.Joystick.pas"/>
+        <DCCReference Include="..\Source\VCL\GLS.Joystick.pas"/>
         <DCCReference Include="..\Source\GLS.LensFlare.pas"/>
         <DCCReference Include="..\Source\GLS.LinePFX.pas"/>
         <DCCReference Include="..\Source\Common\Scena.Logger.pas"/>
@@ -350,13 +350,12 @@
         <DCCReference Include="..\Source\GLS.WindowsContext.pas"/>
         <DCCReference Include="..\Source\GLS.WindowsFont.pas"/>
         <DCCReference Include="..\Source\GLS.zBuffer.pas"/>
-        <DCCReference Include="..\Source\GLS.OpenGLAdapter.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.OpenGLAdapter.pas"/>
         <DCCReference Include="..\Source\GLS.PersistentClasses.pas"/>
-        <DCCReference Include="..\Source\GLS.PipelineTransformation.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.PipelineTransformation.pas"/>
         <DCCReference Include="..\Source\GLS.Polynomials.pas"/>
         <DCCReference Include="..\Source\Common\Scena.CrossXML.pas"/>
         <DCCReference Include="..\Source\GLS.Silhouette.pas"/>
-        <DCCReference Include="..\Source\GLS.PlugInManager.pas"/>
         <DCCReference Include="..\Source\GLS.VectorLists.pas"/>
         <DCCReference Include="..\Source\GLS.ScriptBase.pas"/>
         <DCCReference Include="..\Source\GLS.XCollection.pas"/>

+ 8 - 11
Packagex/GLArena_RT.dpk

@@ -38,21 +38,19 @@ contains
   Formats.m3DSConst in '..\Source\Common\Formats.m3DSConst.pas',
   Formats.m3DSTypes in '..\Source\Common\Formats.m3DSTypes.pas',
   Formats.m3DSUtils in '..\Source\Common\Formats.m3DSUtils.pas',
-  Formats.VFW in '..\Source\Common\Formats.VFW.pas',
   Formats.DXTC in '..\Source\Common\Formats.DXTC.pas',
+  Formats.GL2 in '..\Source\Common\Formats.GL2.pas',
+  Formats.LWO in '..\Source\Common\Formats.LWO.pas',
+  Formats.VFW in '..\Source\Common\Formats.VFW.pas',
   Formatx.B3D in '..\Source\FMX\Formatx.B3D.pas',
   Formatx.DDSImage in '..\Source\FMX\Formatx.DDSImage.pas',
   Formatx.HDRImage in '..\Source\FMX\Formatx.HDRImage.pas',
-  Formatx.LWObjects in '..\Source\FMX\Formatx.LWObjects.pas',
   Formatx.MD3 in '..\Source\FMX\Formatx.MD3.pas',
   Formatx.Q3MD3 in '..\Source\FMX\Formatx.Q3MD3.pas',
   Formatx.OCT in '..\Source\FMX\Formatx.OCT.pas',
   Formatx.X in '..\Source\FMX\Formatx.X.pas',
-  Formatx.GL2 in '..\Source\FMX\Formatx.GL2.pas',
   Formatx.MD2 in '..\Source\FMX\Formatx.MD2.pas',
-  Formatx.Q3BSP in '..\Source\FMX\Formatx.Q3BSP.pas',
   Formatx.TGA in '..\Source\FMX\Formatx.TGA.pas',
-  Formatx.VFW in '..\Source\FMX\Formatx.VFW.pas',
   Formatx.VRML in '..\Source\FMX\Formatx.VRML.pas',
   Formatx.VfsPAK in '..\Source\FMX\Formatx.VfsPAK.pas',
   GLX.AnimatedSprite in '..\Source\FMX\GLX.AnimatedSprite.pas',
@@ -180,8 +178,6 @@ contains
   GLX.Perlin in '..\Source\FMX\GLX.Perlin.pas',
   GLX.PerlinPFX in '..\Source\FMX\GLX.PerlinPFX.pas',
   GLX.PictureRegisteredFormats in '..\Source\FMX\GLX.PictureRegisteredFormats.pas',
-  GLX.PipelineTransformation in '..\Source\FMX\GLX.PipelineTransformation.pas',
-  GLX.PlugInManager in '..\Source\FMX\GLX.PlugInManager.pas',
   GLX.Portal in '..\Source\FMX\GLX.Portal.pas',
   GLSLx.PostEffects in '..\Source\FMX\GLSLx.PostEffects.pas',
   GLX.ProcTextures in '..\Source\FMX\GLX.ProcTextures.pas',
@@ -238,12 +234,9 @@ contains
   GLX.ArchiveManager in '..\Source\FMX\GLX.ArchiveManager.pas',
   GLX.BaseClasses in '..\Source\FMX\GLX.BaseClasses.pas',
   GLX.CurvesAndSurfaces in '..\Source\FMX\GLX.CurvesAndSurfaces.pas',
-  GLX.Generics in '..\Source\FMX\GLX.Generics.pas',
   GLX.PAKArchive in '..\Source\FMX\GLX.PAKArchive.pas',
-  GLX.Keyboard in '..\Source\FMX\GLX.Keyboard.pas',
   GLX.Manager in '..\Source\FMX\GLX.Manager.pas',
   GLX.PersistentClasses in '..\Source\FMX\GLX.PersistentClasses.pas',
-  GLX.PlugInInterface in '..\Source\FMX\GLX.PlugInInterface.pas',
   GLX.Polynomials in '..\Source\FMX\GLX.Polynomials.pas',
   GLX.RGBE in '..\Source\FMX\GLX.RGBE.pas',
   GLX.SpacePartition in '..\Source\FMX\GLX.SpacePartition.pas',
@@ -261,6 +254,10 @@ contains
   Scena.VectorGeometry in '..\Source\Common\Scena.VectorGeometry.pas',
   Scena.Spline in '..\Source\Common\Scena.Spline.pas',
   Scena.TextureFormat in '..\Source\Common\Scena.TextureFormat.pas',
-  Scena.Logger in '..\Source\Common\Scena.Logger.pas';
+  Scena.Logger in '..\Source\Common\Scena.Logger.pas',
+  Formats.Q3BSP in '..\Source\Common\Formats.Q3BSP.pas',
+  Scena.Keyboard in '..\Source\Common\Scena.Keyboard.pas',
+  Scena.PipelineTransformation in '..\Source\Common\Scena.PipelineTransformation.pas',
+  Scena.Generics in '..\Source\Common\Scena.Generics.pas';
 
 end.

+ 7 - 10
Packagex/GLArena_RT.dproj

@@ -158,21 +158,19 @@
         <DCCReference Include="..\Source\Common\Formats.m3DSConst.pas"/>
         <DCCReference Include="..\Source\Common\Formats.m3DSTypes.pas"/>
         <DCCReference Include="..\Source\Common\Formats.m3DSUtils.pas"/>
-        <DCCReference Include="..\Source\Common\Formats.VFW.pas"/>
         <DCCReference Include="..\Source\Common\Formats.DXTC.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.GL2.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.LWO.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.VFW.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.B3D.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.DDSImage.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.HDRImage.pas"/>
-        <DCCReference Include="..\Source\FMX\Formatx.LWObjects.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.MD3.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.Q3MD3.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.OCT.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.X.pas"/>
-        <DCCReference Include="..\Source\FMX\Formatx.GL2.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.MD2.pas"/>
-        <DCCReference Include="..\Source\FMX\Formatx.Q3BSP.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.TGA.pas"/>
-        <DCCReference Include="..\Source\FMX\Formatx.VFW.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.VRML.pas"/>
         <DCCReference Include="..\Source\FMX\Formatx.VfsPAK.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.AnimatedSprite.pas"/>
@@ -300,8 +298,6 @@
         <DCCReference Include="..\Source\FMX\GLX.Perlin.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.PerlinPFX.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.PictureRegisteredFormats.pas"/>
-        <DCCReference Include="..\Source\FMX\GLX.PipelineTransformation.pas"/>
-        <DCCReference Include="..\Source\FMX\GLX.PlugInManager.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.Portal.pas"/>
         <DCCReference Include="..\Source\FMX\GLSLx.PostEffects.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.ProcTextures.pas"/>
@@ -358,12 +354,9 @@
         <DCCReference Include="..\Source\FMX\GLX.ArchiveManager.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.BaseClasses.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.CurvesAndSurfaces.pas"/>
-        <DCCReference Include="..\Source\FMX\GLX.Generics.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.PAKArchive.pas"/>
-        <DCCReference Include="..\Source\FMX\GLX.Keyboard.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.Manager.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.PersistentClasses.pas"/>
-        <DCCReference Include="..\Source\FMX\GLX.PlugInInterface.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.Polynomials.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.RGBE.pas"/>
         <DCCReference Include="..\Source\FMX\GLX.SpacePartition.pas"/>
@@ -382,6 +375,10 @@
         <DCCReference Include="..\Source\Common\Scena.Spline.pas"/>
         <DCCReference Include="..\Source\Common\Scena.TextureFormat.pas"/>
         <DCCReference Include="..\Source\Common\Scena.Logger.pas"/>
+        <DCCReference Include="..\Source\Common\Formats.Q3BSP.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.Keyboard.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.PipelineTransformation.pas"/>
+        <DCCReference Include="..\Source\Common\Scena.Generics.pas"/>
         <BuildConfiguration Include="Base">
             <Key>Base</Key>
         </BuildConfiguration>

+ 0 - 0
Source/Formats.GL2.pas → Source/Common/Formats.GL2.pas


+ 0 - 1
Source/Formats.LWO.pas → Source/Common/Formats.LWO.pas

@@ -1,7 +1,6 @@
 //
 // The graphics platform GLScene https://github.com/glscene
 //
-
 unit Formats.LWO;
 
 (* =============================================================

+ 0 - 1
Source/Formats.Q3BSP.pas → Source/Common/Formats.Q3BSP.pas

@@ -1,7 +1,6 @@
 //
 // The graphics platform GLScene https://github.com/glscene
 //
-
 unit Formats.Q3BSP;
 
 (* Simple Quake III BSP file loader. *)

+ 1 - 1
Source/GLS.Keyboard.pas → Source/Common/Scena.Keyboard.pas

@@ -1,7 +1,7 @@
 //
 // The graphics platform GLScene https://github.com/glscene
 //
-unit GLS.Keyboard;
+unit Scena.Keyboard;
 
 (*
   Provides on demand state of any key on the keyboard as well as a set of

+ 1 - 1
Source/GLS.OpenGLAdapter.pas → Source/Common/Scena.OpenGLAdapter.pas

@@ -1,7 +1,7 @@
 //
 // The graphics platform GLScene https://github.com/glscene
 //
-unit GLS.OpenGLAdapter;
+unit Scena.OpenGLAdapter;
 
 (* OpenGL adapter *)
 

+ 1 - 1
Source/GLS.PipelineTransformation.pas → Source/Common/Scena.PipelineTransformation.pas

@@ -1,7 +1,7 @@
 //
 // The graphics platform GLScene https://github.com/glscene
 //
-unit GLS.PipelineTransformation;
+unit Scena.PipelineTransformation;
 
 (* Pipeline transformations *)
 

+ 1 - 1
Source/FMX/CUDAx.Context.pas

@@ -16,7 +16,7 @@ uses
   CUDA.RunTime,
 
   Scena.Strings,
-  GLX.Generics,
+  Scena.Generics,
   GLX.BaseClasses,
   GLX.Context;
 

+ 0 - 336
Source/FMX/Formatx.GL2.pas

@@ -1,336 +0,0 @@
-//
-// The graphics platform GLXcene https://github.com/glscene
-//
-unit Formatx.GL2;
-
-(*
-	Ghoul2 (GLM/GLA) file format loading structures
-	Also referred to as MDX (MDXM/MDXA) format in C source.
-*)
-
-interface
-
-uses
-  System.Classes,
-  System.SysUtils,
-  Scena.VectorTypes,
-  Scena.VectorGeometry;
-
-type
-  TgxMHeader = record
-    fileID           : array[0..3] of char;
-    version          : integer;
-    strFile,
-    animName         : array[0..63] of char;
-    animIndex,
-    numBones,
-    numLODs,
-    ofsLODs,
-    numSurfaces,
-    ofsSurfHierarchy,
-    ofsEnd           : integer;
-  end;
-
-  TgxMSurfaceHeirachyOffsets = array of integer;
-
-  TgxMSurfaceHeirachy = record
-    name         : array[0..63] of Char;
-    flags        : LongWord;
-    shader       : array[0..63] of Char;
-    shaderIndex,
-    parentIndex,
-    numChildren  : integer;
-    childIndices : array of integer;
-  end;
-
-  TgxMSurfaceHeader = record
-    ident, thisSurfaceIndex, ofsHeader, numVerts, ofsVerts, numTriangles,
-      ofsTriangles, numBoneReferences, ofsBoneReferences, ofsEnd: integer;
-  end;
-
-  TgxMTriangle = record
-    indices : array[0..2] of integer;
-  end;
-
-  TgxMVertex = record
-    normal,
-    vertex                     : TVector3f;
-    uiNumWeightsAndBoneIndices : Cardinal; // packed int
-    BoneWeightings             : array[0..3] of Byte;
-  end;
-
-  TgxMSurface = record
-    SurfaceHeader : TgxMSurfaceHeader;
-    Triangles      : array of TgxMTriangle;
-    Vertices       : array of TgxMVertex;
-    TexCoords      : array of TVector2f;
-    BoneReferences : array of Integer;
-  end;
-
-  TgxMLODInfo = record
-    ofsEnd : integer;
-  end;
-
-  TgxMLODSurfaceOffsets = array of integer;
-
-  TgxMLODs = record
-    LODInfo           : TgxMLODInfo;
-    LODSurfaceOffsets : TgxMLODSurfaceOffsets;
-    Surfaces          : array of TgxMSurface;
-  end;
-
-  TgxAHeader = record
-    fileID     : array[0..3] of char;
-    version    : integer;
-    Name       : array[0..63] of char;
-    fScale     : single;
-    numFrames,
-    ofsFrames,
-    numBones,
-    ofsCompBonePool,
-    ofsSkel,
-    ofsEnd     : integer;
-  end;
-
-  TgxABone = array[0..2] of TVector4f;
-  TgxACompQuatBone = array[0..6] of Word; {14 bytes}
-
-  TgxASkeletonOffsets = array of integer;
-
-  TgxASkeleton = record
-    name           : array[0..63] of char;
-    flags          : LongWord;
-    parent         : Integer;
-    BasePoseMat,
-    BasePoseMatInv : TgxABone;
-    numChildren    : Integer;
-    children       : array of Integer;
-  end;
-
-  // Ghoul2 Model structure
-  TFileGLM = class
-    public
-      ModelHeader            : TgxMHeader;
-      SurfaceHeirachyOffsets : TgxMSurfaceHeirachyOffsets;
-      SurfaceHeirachy        : array of TgxMSurfaceHeirachy;
-      LODs                   : array of TgxMLODs;
-      procedure LoadFromStream(aStream : TStream);
-  end;
-
-  // Ghoul2 Animation structure
-  TFileGLA = class
-    public
-      AnimHeader      : TgxAHeader;
-      SkeletonOffsets : TgxASkeletonOffsets;
-      Skeleton        : array of TgxASkeleton;
-      BoneIndices     : array of Integer;
-      CompBonePool    : array of TgxACompQuatBone;
-      function GetCompressedMatrix(Frame,Bone : Integer):TgxACompQuatBone;
-      function GetUnCompressedMatrix(Frame,Bone : Integer):TMatrix4f;
-      procedure LoadFromStream(aStream : TStream);
-  end;
-
-function G2_GetVertWeights(vert:TgxMVertex):Integer;
-function G2_GetVertBoneIndex(vert:TgxMVertex; iWeightNum:Integer):Integer;
-function G2_GetVertBoneWeight(vert:TgxMVertex; iWeightNum:Cardinal;
-  var fTotalWeight:Single; const iNumWeights:Cardinal):single;
-
-procedure MC_UnCompressQuat(var mat : TMatrix4f; const comp : TgxACompQuatBone);
-
-// ------------------------------------------------------------------
-implementation
-// ------------------------------------------------------------------
-
-// ------------------
-// ------------------ Misc routines ------------------
-// ------------------
-
-// Adapted from mdx_format.h
-// static inline int G2_GetVertWeights( const mdxmVertex_t *pVert )
-// static inline int G2_GetVertBoneIndex( const mdxmVertex_t *pVert, const int iWeightNum)
-// static inline float G2_GetVertBoneWeight( const mdxmVertex_t *pVert, const int iWeightNum, float &fTotalWeight, int iNumWeights )
-
-function G2_GetVertWeights(vert:TgxMVertex):Integer;
-begin
-  // Get number of bones per vertex (0..3)+1 = (1..4)
-  result:=(vert.uiNumWeightsAndBoneIndices shr 30)+1;
-end;
-
-function G2_GetVertBoneIndex(vert:TgxMVertex; iWeightNum:Integer):Integer;
-begin
-  // Extract the bone reference array index, a 5-bit integer
-  result:=(vert.uiNumWeightsAndBoneIndices shr (5*iWeightNum)) and 31;
-end;
-
-function G2_GetVertBoneWeight(vert:TgxMVertex; iWeightNum:Cardinal;
-  var fTotalWeight:Single; const iNumWeights:Cardinal):single;
-var
-  fBoneWeight : Single;
-  iTemp       : Cardinal;
-begin
-  if (iWeightNum = iNumWeights-1) then begin
-    // No need to calculate final weight value, return the
-    // weight left over out of 1
-    fBoneWeight:=1-fTotalWeight;
-  end else begin
-    // Get the initial 8-bit bone weight
-    iTemp:=vert.BoneWeightings[iWeightNum];
-    // Get the 2-bit overflow and 'or' it to the front of the
-    // weight to get 10-bit integer weight (0..1023)
-    iTemp:=iTemp or ((vert.uiNumWeightsAndBoneIndices shr (12+(iWeightNum*2))) and $300);
-    // Convert to floating point weight (0..1)
-    fBoneWeight:=iTemp/1023;
-    // Accumulate total weight
-    fTotalWeight:=fTotalWeight+fBoneWeight;
-  end;
-  Result:=fBoneWeight;
-end;
-
-// Adapted from matcomp.c
-// void MC_UnCompressQuat(float mat[3][4],const unsigned char * comp)
-
-procedure MC_UnCompressQuat(var mat : TMatrix4f; const comp : TgxACompQuatBone);
-begin
-  mat:=QuaternionToMatrix(QuaternionMake([comp[1]-32726,comp[2]-32726,comp[3]-32726],comp[0]-32726));
-  mat.W:=VectorMake(comp[4]/64-512,comp[5]/64-512,comp[6]/64-512,1);
-end;
-
-
-// ------------------
-// ------------------ TFileGLM ------------------
-// ------------------
-
-procedure TFileGLM.LoadFromStream(aStream: TStream);
-var
-  idstr   : array[0..3] of char;
-  i,j     : integer;
-  ofs,
-  LODofs  : int64;
-begin
-  aStream.Read(idstr,sizeof(idstr));
-  aStream.Position:=0;
-
-  if not (idstr='2LGM') then begin
-    raise Exception.Create(Format('Unknown or incorrect identity tag: [%s]',[idstr]));
-    exit;
-  end;
-
-  aStream.Read(ModelHeader,SizeOf(ModelHeader));
-
-  if ModelHeader.version<>6 then
-    raise Exception.Create(Format('Only GLM (MDXM) version 6 is supported. File is version %d.',[ModelHeader.version]));
-
-  SetLength(SurfaceHeirachyOffsets,ModelHeader.numSurfaces);
-  aStream.Read(SurfaceHeirachyOffsets[0],sizeof(Integer)*ModelHeader.numSurfaces);
-
-  SetLength(SurfaceHeirachy,ModelHeader.numSurfaces);
-  for i:=0 to ModelHeader.numSurfaces-1 do
-  with SurfaceHeirachy[i] do begin
-    aStream.Read(name,Length(name));
-    aStream.Read(flags,sizeof(LongWord));
-    aStream.Read(shader,Length(shader));
-    aStream.Read(shaderindex,sizeof(Integer));
-    aStream.Read(parentindex,sizeof(Integer));
-    aStream.Read(numChildren,sizeof(Integer));
-    if numChildren>0 then begin
-      SetLength(childIndices,numChildren);
-      aStream.Read(childIndices[0],numChildren*sizeof(Integer));
-    end else SetLength(childIndices,0);
-  end;
-
-  SetLength(LODs,ModelHeader.numLODs);
-  for i:=0 to ModelHeader.numLODs-1 do
-  with LODs[i] do begin
-    LODofs:=aStream.Position;
-    aStream.Read(LODInfo,sizeof(LODInfo));
-    SetLength(LODSurfaceOffsets,ModelHeader.numSurfaces);
-    aStream.Read(LODSurfaceOffsets[0],sizeof(integer)*ModelHeader.numSurfaces);
-    SetLength(Surfaces,ModelHeader.numSurfaces);
-    for j:=0 to ModelHeader.numSurfaces-1 do
-    with Surfaces[j] do begin
-      ofs:=aStream.Position;
-      aStream.Read(SurfaceHeader,SizeOf(TgxMSurfaceHeader));
-      SetLength(Triangles,SurfaceHeader.numTriangles);
-      SetLength(Vertices,SurfaceHeader.numVerts);
-      SetLength(TexCoords,SurfaceHeader.numVerts);
-      SetLength(BoneReferences,SurfaceHeader.numBoneReferences);
-      aStream.Position:=ofs+SurfaceHeader.ofsTriangles;
-      aStream.Read(Triangles[0],SurfaceHeader.numTriangles*SizeOf(TgxMTriangle));
-      aStream.Position:=ofs+SurfaceHeader.ofsVerts;
-      aStream.Read(Vertices[0],SurfaceHeader.numVerts*SizeOf(TgxMVertex));
-      aStream.Read(TexCoords[0],SurfaceHeader.numVerts*SizeOf(TVector2f));
-      aStream.Position:=ofs+SurfaceHeader.ofsBoneReferences;
-      aStream.Read(BoneReferences[0],SurfaceHeader.numBoneReferences*SizeOf(Integer));
-      aStream.Position:=ofs+SurfaceHeader.ofsEnd;
-    end;
-    aStream.Position:=LODofs+LODInfo.ofsEnd;
-  end;
-end;
-
-
-// ------------------
-// ------------------ TFileGLA ------------------
-// ------------------
-
-function TFileGLA.GetCompressedMatrix(Frame, Bone: Integer): TgxACompQuatBone;
-begin
-  Result:=CompBonePool[BoneIndices[Frame*AnimHeader.numBones+Bone]];
-end;
-
-function TFileGLA.GetUnCompressedMatrix(Frame, Bone: Integer): TMatrix4f;
-begin
-  MC_UnCompressQuat(Result,CompBonePool[BoneIndices[Frame*AnimHeader.numBones+Bone]]);
-end;
-
-procedure TFileGLA.LoadFromStream(aStream: TStream);
-var
-  idstr  : array[0..3] of char;
-  i,temp : integer;
-  buf    : array of array[0..2] of Byte;
-begin
-  aStream.Read(idstr,sizeof(idstr));
-  aStream.Position:=0;
-
-  if not (idstr='2LGA') then begin
-    raise Exception.Create(Format('Unknown or incorrect identity tag: [%s]',[idstr]));
-    exit;
-  end;
-
-  aStream.Read(AnimHeader,SizeOf(AnimHeader));
-
-  if AnimHeader.version<>6 then
-    raise Exception.Create(Format('Only GLA (MDXA) version 6 is supported. File is version %d.',[AnimHeader.version]));
-
-  SetLength(SkeletonOffsets,AnimHeader.numBones);
-  aStream.Read(SkeletonOffsets[0],sizeof(Integer)*AnimHeader.numBones);
-
-  SetLength(Skeleton,AnimHeader.numBones);
-  for i:=0 to AnimHeader.numBones-1 do
-  with Skeleton[i] do begin
-    aStream.Read(name,Length(name));
-    aStream.Read(flags,sizeof(LongWord));
-    aStream.Read(Parent,SizeOf(Integer));
-    aStream.Read(basePoseMat,sizeof(TgxABone));
-    aStream.Read(basePoseMatInv,sizeof(TgxABone));
-    aStream.Read(numChildren,sizeof(Integer));
-    if numChildren>0 then begin
-      SetLength(children,numChildren);
-      aStream.Read(children[0],numChildren*sizeof(Integer));
-    end else SetLength(children,0);
-  end;
-
-  aStream.Position:=AnimHeader.ofsFrames;
-  SetLength(BoneIndices,AnimHeader.numFrames*AnimHeader.numBones);
-  SetLength(buf,AnimHeader.numFrames*AnimHeader.numBones*3);
-  aStream.Read(buf[0],AnimHeader.numFrames*AnimHeader.numBones*3);
-  for i:=0 to AnimHeader.numFrames*AnimHeader.numBones-1 do
-    BoneIndices[i]:=(buf[i][2] shl 16) or (buf[i][1] shl 8) or buf[i][0];
-  SetLength(buf,0);
-
-  aStream.Position:=AnimHeader.ofsCompBonePool;
-  temp:=AnimHeader.ofsEnd-AnimHeader.ofsCompBonePool;
-  SetLength(CompBonePool,temp div SizeOf(TgxACompQuatBone));
-  aStream.Read(CompBonePool[0],temp);
-end;
-
-end.

+ 0 - 2281
Source/FMX/Formatx.LWObjects.pas

@@ -1,2281 +0,0 @@
-//
-// The graphics platform GLXcene https://github.com/glscene
-//
-unit Formatx.LWObjects;
-
-interface
-
-{$I Scena.inc}
-
-uses
-  System.Classes,
-  System.SysUtils,
-
-  Scena.VectorGeometry,
-  GLX.ApplicationFileIO;
-
-type
-
-  TID4 = array[0..3] of AnsiChar;
-  PID4 = ^TID4;
-  TID4DynArray = array of TID4;
-
-const
-  ID_NULL = '#0#0#0#0'; // NULL ID
-
-  ID_LWSC: TID4 = 'LWSC';  // Lightwave scene file
-  ID_FORM: TID4 = 'FORM';  // IFF Form
-  ID_LWOB: TID4 = 'LWOB';  // Lightwave Object version 1.0 - 5.x
-  ID_LWLO: TID4 = 'LWLO';  // Lightwave Layered Object
-  ID_LAYR: TID4 = 'LAYR';  // LAYER
-  ID_PNTS: TID4 = 'PNTS';  // Points chunk
-  ID_SRFS: TID4 = 'SRFS';  // Surface Names chunk
-  ID_POLS: TID4 = 'POLS';  // Polygons chunk
-  ID_CRVS: TID4 = 'CRVS';  // Curves chunk
-  ID_PCHS: TID4 = 'PCHS';  // Patches chunk
-  ID_SURF: TID4 = 'SURF';  // Surfaces chunk
-  ID_COLR: TID4 = 'COLR';  // Color chunk
-
-  ID_FLAG: TID4 = 'FLAG';  // Surface Flags
-
-  ID_LUMI: TID4 = 'LUMI';  // Luminosity
-  ID_DIFF: TID4 = 'DIFF';  // Diffuse
-  ID_SPEC: TID4 = 'SPEC';  // Specular
-  ID_REFL: TID4 = 'REFL';  // Reflective
-  ID_TRAN: TID4 = 'TRAN';  // Transparency
-
-  ID_VLUM: TID4 = 'VLUM';  // Luminosity
-  ID_VDIF: TID4 = 'VDIF';  // Diffuse
-  ID_VSPC: TID4 = 'VSPC';  // Specularity
-  ID_VRFL: TID4 = 'VRFL';  // Reflective
-  ID_VTRN: TID4 = 'VTRN';  // Transparency
-
-  ID_GLOS: TID4 = 'GLOS';  // Glossiness SmallInt
-
-  ID_SIDE: TID4 = 'SIDE';  // Sidedness
-
-  ID_RFLT: TID4 = 'RFLT';  // REFLECTION MODE (PRE 6.0)
-
-  ID_RFOP: TID4 = 'RFOP';  // REFLECTION OPTIONS
-  ID_RIMG: TID4 = 'RIMG';  // REFLECTION IMAGE
-  ID_RSAN: TID4 = 'RSAN';  // REFLECTION MAP SEAM ANGLE
-  ID_RIND: TID4 = 'RIND';  // REFRACTIVE INDEX
-  ID_EDGE: TID4 = 'EDGE';  // EDGE TRANSPARENCY THRESHOLD
-  ID_SMAN: TID4 = 'SMAN';  // SMOOTHING ANGLE RADIANS
-  ID_ALPH: TID4 = 'ALPH';  // ALPHA MODE
-  ID_CTEX: TID4 = 'CTEX';  // COLOR TEXTURE
-  ID_DTEX: TID4 = 'DTEX';  // DIFFUSE TEXTURE
-  ID_STEX: TID4 = 'STEX';  // SPECULAR TEXTURE
-  ID_RTEX: TID4 = 'RTEX';  // REFLECTIION TEXTURE
-  ID_TTEX: TID4 = 'TTEX';  // TRANSPARENCY TEXTURE
-  ID_LTEX: TID4 = 'LTEX';  // LUMINANCE TEXTURE
-  ID_BTEX: TID4 = 'BTEX';  // BUMP TEXTURE
-  ID_TFLG: TID4 = 'TFLG';  // TEXTURE FLAGS
-  ID_TSIZ: TID4 = 'TSIZ';  // TEXTURE SIZE
-  ID_TCTR: TID4 = 'TCTR';  // TEXTURE CENTER
-  ID_TFAL: TID4 = 'TFAL';  // TEXTURE FALLOFF
-  ID_TVEL: TID4 = 'TVAL';  // TEXTURE VALUE
-  ID_TREF: TID4 = 'TREF';  // TEXTURE REFERENCE
-  ID_TCLR: TID4 = 'TCLR';  // TEXTURE COLOR
-  ID_TVAL: TID4 = 'TVAL';  // TEXTURE VALUE
-  ID_TAMP: TID4 = 'TAMP';  // TEXTURE AMPLITUDE
-  ID_TFP0: TID4 = 'TFP0';  // TEXTURE PARAMETERS
-  ID_TFP1: TID4 = 'TFP1';  //
-  ID_TFP2: TID4 = 'TFP2';  //
-  ID_TIP0: TID4 = 'TIP0';  //
-  ID_TIP1: TID4 = 'TIP1';  //
-  ID_TIP2: TID4 = 'TIP2';  //
-  ID_TSP0: TID4 = 'TSP0';  //
-  ID_TSP1: TID4 = 'TSP1';  //
-  ID_TSP2: TID4 = 'TSP2';  //
-  ID_TFRQ: TID4 = 'TFRQ';  //
-  ID_TIMG: TID4 = 'TIMG';  // TEXTURE IMG
-  ID_TALP: TID4 = 'TALP';  //
-  ID_TWRP: TID4 = 'TWRP';  // TEXTURE WRAP
-  ID_TAAS: TID4 = 'TAAS';  //
-  ID_TOPC: TID4 = 'TOPC';  //
-  ID_SHDR: TID4 = 'SHDR';  //
-  ID_SDAT: TID4 = 'SDAT';  //
-  ID_IMSQ: TID4 = 'IMSQ';  // IMAGE SEQUENCE
-  ID_FLYR: TID4 = 'FLYR';  // FLYER SEQUENCE
-  ID_IMCC: TID4 = 'IMCC';  //
-
-  SURF_FLAG_LUMINOUS        =     1;
-  SURF_FLAG_OUTLINE         =     2;
-  SURF_FLAG_SMOOTHING       =     4;
-  SURF_FLAG_COLORHIGHLIGHTS =     8;
-  SURF_FLAG_COLORFILTER     =    16;
-  SURF_FLAG_OPAQUEEDGE      =    32;
-  SURF_FLAG_TRANSPARENTEDGE =    64;
-  SURF_FLAG_SHARPTERMINATOR =   128;
-  SURF_FLAG_DOUBLESIDED     =   256;
-  SURF_FLAG_ADDITIVE        =   512;
-  SURF_FLAG_SHADOWALPHA     =  1024;
-
-  CURV_CONTINUITY_FIRST = 1;
-  CURV_CONTINUITY_LAST  = 2;
-
-  IMSQ_FLAG_LOOP      = 1;
-  IMSQ_FLAG_INTERLACE = 2;
-
-  ID_LWO2: TID4 = 'LWO2';   // OBJECT
-  ID_VMAP: TID4 =  'VMAP';   // VERTEX MAP
-  ID_TAGS: TID4 =  'TAGS';   // TAGS?
-  ID_PTAG: TID4 =  'PTAG';   // POLYGON TAG MAP
-  ID_VMAD: TID4 =  'VMAD';   // DISCONTINUOUS VERTEX MAP
-  ID_ENVL: TID4 =  'ENVL';   // ENVELOPE
-  ID_CLIP: TID4 =  'CLIP';   // CLIP
-  ID_BBOX: TID4 =  'BBOX';   // BOUNDING BOX
-  ID_DESC: TID4 =  'DESC';   // DESCRIPTION
-  ID_TEXT: TID4 =  'TEXT';   // TEXT
-  ID_ICON: TID4 =  'ICON';   // ICON
-
-  ENVL_PRE: TID4  = 'PRE'#0;   // PRE-BEHAVIOUR
-  ENVL_POST: TID4 = 'POST';    // POST
-  ENVL_KEY: TID4  = 'KEY'#0;   // KEY
-  ENVL_SPAN: TID4 = 'SPAN';    // SPAN
-  ENVL_CHAN: TID4 = 'CHAN';    // CHAN
-  ENVL_NAME: TID4 = 'NAME';    // NAME
-
-  ID_STIL: TID4 = 'STIL';   // STILL IMAGE FILENAME
-  ID_ISEQ: TID4   = 'ISEQ';   // IMAGE SEQUENCE
-  ID_ANIM: TID4   = 'ANIM';   // PLUGIN ANIMATION
-  ID_STCC: TID4   = 'STCC';   // COLOR CYCLING STILL
-  ID_CONT: TID4   = 'CONT';   // CONTRAST
-  ID_BRIT: TID4   = 'BRIT';   // BRIGHTNESS
-  ID_SATR: TID4   = 'SATR';   // SATURATION
-  ID_HUE: TID4    = 'HUE'#0;  // HUE
-  ID_GAMMA: TID4  = 'GAMM';  // GAMMA
-  ID_NEGA: TID4   = 'NEGA';   // NEGATIVE IMAGE
-  ID_IFLT: TID4   = 'IFLT';   // IMAGE PLUG-IN FILTER
-  ID_PFLT: TID4   = 'PFLT';   // PIXEL PLUG-IN FILTER
-
-  POLS_TYPE_FACE: TID4 = 'FACE';  // FACES
-  POLS_TYPE_CURV: TID4 = 'CURV';  // CURVE
-  POLS_TYPE_PTCH: TID4 = 'PTCH';  // PATCH
-  POLS_TYPE_MBAL: TID4 = 'MBAL';  // METABALL
-  POLS_TYPE_BONE: TID4 = 'BONE';  // SKELEGON?
-
-  VMAP_TYPE_PICK: TID4 = 'PICK';  // SELECTION SET
-  VMAP_TYPE_WGHT: TID4 = 'WGHT';  // WEIGHT MAP
-  VMAP_TYPE_MNVW: TID4 = 'MNVW';  // SUBPATCH WEIGHT MAP
-  VMAP_TYPE_TXUV: TID4 = 'TXUV';  // UV MAP
-  VMAP_TYPE_RGB: TID4  = 'RGB'#0; // RGB MAP
-  VMAP_TYPE_RGBA: TID4 = 'RGBA';  // RGBA MAP
-  VMAP_TYPE_MORF: TID4 = 'MORF';  // MORPH MAP: RELATIVE VERTEX DISPLACEMENT
-  VMAP_TYPE_SPOT: TID4 = 'SPOT';  // SPOT MAP: ABSOLUTE VERTEX POSITIONS
-
-  PTAG_TYPE_SURF: TID4 = 'SURF';  // SURFACE
-  PTAG_TYPE_PART: TID4 = 'PART';  // PARENT PART
-  PTAG_TYPE_SMGP: TID4 = 'SMGP';  // SMOOTH GROUP
-
-  PRE_POST_RESET         = 0; // RESET
-  PRE_POST_CONSTANT      = 1; // CONSTANT
-  PRE_POST_REPEAT        = 2; // REPEAT
-  PRE_POST_OSCILLATE     = 3; // OSCILLATE
-  PRE_POST_OFFSET        = 4; // OFFSET REPEAT
-  PRE_POST_LINEAR        = 5; // LINEAR
-
-  POLS_VCOUNT_MASK       = $3FF;
-  POLS_FLAGS_MASK        = $FC00;
-
-  SIDE_FRONT = 1;
-  SIDE_BACK  = 2;
-  SIDE_FRONT_AND_BACK = SIDE_FRONT and SIDE_BACK;
-
-  RFOP_BACKDROP                = 0;
-  RFOP_RAYTRACEANDBACKDROP     = 1;
-  RFOP_SPHERICALMAP            = 2;
-  RFOP_RAYTRACEANDSPHERICALMAP = 3;
-
-type
-  TI1 = ShortInt;
-  PI1 = ^TI1;
-
-  TI2 = SmallInt;
-  PI2 = ^TI2;
-
-  TI4 = LongInt;
-  PI4 = ^TI4;
-
-  TU1 = Byte;
-  PU1 = ^TU1;
-  TU1DynArray = array of TU1;
-
-  TU2 = Word;
-  PU2 = ^TU2;
-  TU2Array = array [0..65534] of TU2;
-  PU2Array = ^TU2Array;
-  TU2DynArray = array of TU2;
-
-  TU4 = LongWord;
-  PU4 = ^TU4;
-  TU4Array = array [0..65534] of TU4;
-  PU4Array = ^TU4Array;
-  TU4DynArray = array of TU4;
-
-  TF4 = Single;
-  PF4 = ^TF4;
-  TF4Array = array [0..65534] of TF4;
-  PF4Array = ^TF4Array;
-  TF4DynArray = array of TF4;
-
-  TANG4 = TF4;
-  PANG4 = ^TANG4;
-
-//  TS0 = PAnsiChar;
-
-  TVec12 = array[0..2] of  TF4;
-  PVec12 = ^TVec12;
-
-  TVec12Array = array [0..65534] of TVec12;
-  PVec12Array = ^TVec12Array;
-  TVec12DynArray = array of TVec12;
-
-  TColr12 = TVec12;
-  PColr12 = ^TColr12;
-
-  TColr12DynArray = array of TColr12;
-
-  TColr4 = array[0..3] of TU1;
-  PColr4 = ^TColr4;
-
-  // Lightwave Chunk Struct - Used in TLWOReadCallback
-  PLWChunkRec = ^TLWChunkRec;
-  TLWChunkRec = record
-    id: TID4;
-    size: TU4;
-    data: Pointer;
-  end;
-
-  // Lightwave SubChunk Struct - Used in TLWOReadCallback
-  PLWSubChunkRec = ^TLWSubChunkRec;
-  TLWSubChunkRec = record
-    id: TID4;
-    size: TU2;
-    data: Pointer;
-  end;
-
-  TLWPolsInfo = record
-    norm: TVec12;
-    vnorms: TVec12DynArray;
-    surfid: TU2;
-  end;
-  TLWPolsInfoDynArray = array of TLWPolsInfo;
-
-  TLWPntsInfo = record
-    npols: TU2;
-    pols: TU2DynArray;
-  end;
-  TLWPntsInfoDynArray = array of TLWPntsInfo;
-
-
-  TLWPolsDynArray = TU2DynArray;
-
-  TLWPolyTagMapDynArray = TU2DynArray;
-  TLWPolyTagMap = record
-     poly: TU2;
-     tag: TU2;
-  end;
-  PLWPolyTagMap = ^TLWPolyTagMap;
-
-  // Value Map
-  TLWVertexMap = record
-    vert: TU2;
-    values: TF4DynArray;
-  end;
-  TLWVertexMapDynArray = array of TLWVertexMap;
-
-  TLWChunkList = class;
-  TLWParentChunk = class;
-
-
-  TLWChunk = class (TPersistent)
-  private
-    FData: Pointer;
-    FID: TID4;
-    FSize: TU4;
-    FParentChunk: TLWParentChunk;
-    FOwner: TLWChunkList;
-    function GetRootChunks: TLWChunkList;
-    function GetIndex: Integer;
-  protected
-    procedure Clear; virtual;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            virtual;
-    procedure Loaded; virtual;
-  public
-    destructor Destroy; override;
-    class function GetID: TID4; virtual;
-    procedure LoadFromStream(AStream: TStream); virtual;
-    property Data: Pointer read FData;
-    property ID: TID4 read FID;
-    property Size: TU4 read FSize;
-    // ParentChunk may be nil indicating this is a root chunk. ie. TLWLayr
-    property ParentChunk: TLWParentChunk read FParentChunk;
-    property RootChunks: TLWChunkList read GetRootChunks;
-    property Index: Integer read GetIndex;
-    property Owner: TLWChunkList read FOwner;
-  end;
-
-  TLWChunkClass = class of TLWChunk;
-
-  TLWSubChunk = class (TLWChunk)
-  public
-    procedure LoadFromStream(AStream: TStream); override;
-  end;
-
-  TLWChunkFind = procedure(AChunk: TLWChunk; Criteria: Pointer; var Found: boolean);
-
-  TLWChunkList = class (TList)
-  private
-    FOwnsItems: Boolean;
-    FOwner: TObject;
-    function GetItem(Index: Integer): TLWChunk;
-  protected
-    procedure Loaded; virtual;
-  public
-    constructor Create(AOwnsItems: boolean; AOwner: TObject);
-    destructor Destroy; override;
-    function Add(AChunk: TLWChunk): Integer;
-    procedure Clear; override;
-    procedure Delete(Index: Integer);
-    function FindChunk(ChunkFind: TLWChunkFind; Criteria: Pointer; StartIndex: Integer = 0): Integer;
-    property Items[Index: Integer]: TLWChunk read GetItem; default;
-    property OwnsItems: Boolean read FOwnsItems;
-    property Owner: TObject read FOwner;
-  end;
-
-  TLWParentChunk = class (TLWChunk)
-  private
-    FItems: TLWChunkList;
-    function GetItems: TLWChunkList;
-    function GetFloatParam(Param: TID4): Single;
-    function GetWordParam(Param: TID4): Word;
-    function GetVec3Param(Param: TID4): TVec12;
-    function GetLongParam(Param: TID4): LongWord;
-    function GetVXParam(Param: TID4): Word;
-  protected
-    function GetParamAddr(Param: TID4): Pointer; virtual;
-    procedure Clear; override;
-    procedure Loaded; override;
-  public
-    property Items: TLWChunkList read GetItems;
-    property ParamAddr[Param: TID4]: Pointer read GetParamAddr;
-    property FloatParam[Param: TID4]: Single read GetFloatParam;
-    property WordParam[Param: TID4]: Word read GetWordParam;
-    property LongParam[Param: TID4]: LongWord read GetLongParam;
-    property Vec3Param[Param: TID4]: TVec12 read GetVec3Param;
-    property VXParam[Param: TID4]: Word read GetVXParam;
-  end;
-
-
-  TLWVMap = class;
-
-  TLWPnts = class (TLWParentChunk)
-  private
-    FPnts: TVEC12DynArray;
-    FPntsInfo: TLWPntsInfoDynArray;
-    function GetPntsCount: LongWord;
-    function AddPoly(PntIdx, PolyIdx: Integer): Integer;
-  protected
-    procedure Clear; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    class function GetID: TID4; override;
-    function GetVMap(VMapID: TID4; out VMap: TLWVMap): Boolean;
-    property PntsCount: LongWord read GetPntsCount;
-    property Pnts: TVEC12DynArray read FPnts;
-    property PntsInfo: TLWPntsInfoDynArray read FPntsInfo;
-  end;
-
-  TLWPols = class (TLWParentChunk)
-  private
-    FPolsType: TID4;
-    FPols: TLWPolsDynArray;
-    FPolsInfo: TLWPolsInfoDynArray;
-    FPolsCount: Integer;
-    function GetPolsByIndex(AIndex: TU2): Integer;
-    function GetIndiceCount: TU4;
-    function GetIndice(AIndex: Integer): TU2;
-    function GetPolsCount: Integer;
-    procedure CalcPolsNormals;
-    procedure CalcPntsNormals;
-  protected
-    procedure Clear; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-    procedure Loaded; override;
-  public
-    class function GetID: TID4; override;
-    function GetPolsByPntIdx(VertIdx: TU2; var VertPolys: TU2DynArray): Integer;
-    property PolsByIndex[AIndex: TU2]: Integer read GetPolsByIndex;
-    property IndiceCount: TU4 read GetIndiceCount;
-    property Indices[AIndex: Integer]: TU2 read GetIndice;
-    property PolsType: TID4 read FPolsType;
-    property PolsCount: Integer read GetPolsCount;
-    property PolsInfo: TLWPolsInfoDynArray read FPolsInfo;
-  end;
-
-  TLWVMap = class (TLWChunk)
-  private
-    FDimensions: TU2;
-    FName: string;
-    FValues: TLWVertexMapDynArray;
-    FVMapType: TID4;
-    function GetValue(AIndex: TU2): TLWVertexMap;
-    function GetValueCount: Integer;
-  protected
-    procedure Clear; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    class function GetID: TID4; override;
-    property Dimensions: TU2 read FDimensions;
-    property Name: string read FName;
-    property Value[AIndex: TU2]: TLWVertexMap read GetValue;
-    property ValueCount: Integer read GetValueCount;
-    property VMapType: TID4 read FVMapType;
-  end;
-
-  TLWTags = class (TLWChunk)
-  private
-    FTags: TStrings;
-    function GetTags: TStrings;
-  protected
-    procedure Clear; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    destructor Destroy; override;
-    class function GetID: TID4; override;
-    function TagToName(Tag: TU2): string;
-    property Tags: TStrings read GetTags;
-  end;
-
-  TLWSurf = class (TLWParentChunk)
-  private
-    FName: string;
-    FSource: string;
-    function GetSurfId: Integer;
-  protected
-    function GetParamAddr(Param: TID4): Pointer; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    destructor Destroy; override;
-    class function GetID: TID4; override;
-    property SurfId: Integer read GetSurfId;
-    property Name: string read FName;
-    property Source: string read FSource;
-  end;
-
-  TLWLayr = class (TLWParentChunk)
-  private
-    FFlags: TU2;
-    FName: string;
-    FNumber: TU2;
-    FParent: TU2;
-    FPivot: TVec12;
-  protected
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    destructor Destroy; override;
-    class function GetID: TID4; override;
-    property Flags: TU2 read FFlags;
-    property Name: string read FName;
-    property Number: TU2 read FNumber;
-    property Parent: TU2 read FParent;
-    property Pivot: TVec12 read FPivot;
-  end;
-
-  TLWPTag = class (TLWChunk)
-  private
-    FMapType: TID4;
-    FTagMaps: TLWPolyTagMapDynArray;
-    FTags: TU2DynArray;
-    function AddTag(Value: TU2): Integer;
-    function GetTag(AIndex: Integer): TU2;
-    function GetTagCount: Integer;
-    function GetTagMapCount: Integer;
-    function GetTagMaps(AIndex: Integer): TLWPolyTagMap;
-    procedure ValidateTagInfo;
-  protected
-    procedure Clear; override;
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord); 
-            override;
-  public
-    constructor Create;
-    function GetPolsByTag(Tag: TU2; var PolyIndices: TU2DynArray): Integer;
-    class function GetID: TID4; override;
-    property MapType: TID4 read FMapType;
-    property TagCount: Integer read GetTagCount;
-    property TagMapCount: Integer read GetTagMapCount;
-    property TagMaps[AIndex: Integer]: TLWPolyTagMap read GetTagMaps; default;
-    property Tags[AIndex: Integer]: TU2 read GetTag;
-  end;
-  
-  TLWObjectFile = class (TObject)
-  private
-    FChunks: TLWChunkList;
-    FFileName: string;
-    function GetChunks: TLWChunkList;
-    function GetCount: Integer;
-    function GetSurfaceByName(Index: string): TLWSurf;
-    function GetSurfaceByTag(Index: TU2): TLWSurf;
-  public
-    constructor Create;
-    destructor Destroy; override;
-    function TagToName(Tag: TU2): string;
-    procedure LoadFromFile(const AFilename: string);
-    procedure LoadFromStream(AStream: TStream);
-    property ChunkCount: Integer read GetCount;
-    property Chunks: TLWChunkList read GetChunks;
-    property FileName: string read FFileName;
-    property SurfaceByName[Index: string]: TLWSurf read GetSurfaceByName;
-    property SurfaceByTag[Index: TU2]: TLWSurf read GetSurfaceByTag;
-  end;
-
-  TLWClip = class(TLWParentChunk)
-  private
-    FClipIndex: TU4;
-  protected
-    procedure LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-            override;
-  public
-    class function GetID: TID4; override;
-    property ClipIndex: TU4 read FClipIndex;
-  end;
-
-  TLWContentNotify = procedure(Sender: TObject; var Content: string) of object;
-
-  TLWContentDir = class
-  private
-    FSubDirs: TStrings;
-    FRoot: string;
-    function GetSubDirs: TStrings;
-    procedure SetRoot(const Value: string);
-    procedure SetSubDirs(const Value: TStrings);
-//    function ContentSearch(AFilename: string): string;
-  public
-    destructor Destroy; override;
-    function FindContent(AFilename: string): string;
-    property Root: string read FRoot write SetRoot;
-    property SubDirs: TStrings read GetSubDirs write SetSubDirs;
-  end;
-
-  TLWOReadCallback = procedure(Chunk: TLWChunkRec; Data: Pointer); cdecl;
-
-  procedure RegisterChunkClass(ChunkClass: TLWChunkClass);
-
-  function LoadLW0FromStream(Stream: TStream; ReadCallback: TLWOReadCallback; UserData: Pointer): LongWord; cdecl;
-  function LoadLWOFromFile(const AFilename: string; ReadCallback: TLWOReadCallback; UserData: Pointer): LongWord;
-
-  procedure ReadMotorolaNumber(Stream: TStream; Data: Pointer; ElementSize:
-          Integer; Count: Integer = 1);
-  function WriteMotorolaNumber(Stream: TStream; Data: Pointer; ElementSize:
-          Integer; Count: Integer = 1): Integer;
-
-  function ReadS0(Stream: TStream; out Str: string): Integer;
-  procedure WriteS0(Stream: TStream; Data: string);
-
-  procedure WriteU4AsVX(Stream:TStream; Data: Pointer; Count: Integer);
-  function ReadVXAsU4(Stream: TStream; Data: Pointer; Count: Integer = 1): Integer;
-
-  procedure ReverseByteOrder(ValueIn: Pointer; Size: Integer; Count: Integer = 1);
-
-  function ToDosPath(const Path: string): string;
-  function ToUnixPath(const Path: string): string;
-
-  function ID4ToInt(const Id: TID4): Integer;
-
-  // ChunkFind procedures
-  procedure FindChunkById(AChunk: TLWChunk; Data: Pointer; var Found: boolean);
-  procedure FindSurfaceByName(AChunk: TLWChunk; AName: Pointer; var Found: boolean);
-  procedure FindSurfaceByTag(AChunk: TLWChunk; ATag: Pointer; var Found: boolean);
-
-  procedure FindVMapByName(AChunk: TLWChunk; AName: Pointer; var Found: boolean);
-  procedure FindClipByClipIndex(AChunk: TLWChunk; AIndex: Pointer; var Found: boolean);
-
-  function GetContentDir: TLWContentDir;
-
-//--------------------------------------------
-implementation
-//--------------------------------------------
-
-type
-  PWord = ^Word;
-  PLongWord = ^LongWord;
-
-var
-  ChunkClasses: TList;
-  ContentDir: TLWContentDir;
-
-function ToDosPath(const Path: string): string;
-var
-  i: Integer;
-begin
-  result := Path;
-  for i := 1 to Length(result) do
-    if result[i] = '/' then
-      result[i] := '\';
-end;
-
-function ToUnixPath(const Path: string): string;
-var
-  i: Integer;
-begin
-  result := Path;
-  for i := 1 to Length(result) do
-    if result[i] = '\' then
-      result[i] := '/';
-end;
-
-function GetContentDir: TLWContentDir;
-begin
-  if ContentDir = nil then
-    ContentDir := TLWContentDir.Create;
-  result := ContentDir;
-end;
-
-procedure FindChunkById(AChunk: TLWChunk; Data: Pointer; var Found: boolean);
-begin
-  if AChunk.FID = PID4(Data)^ then
-    Found := true
-  else
-    Found := false;
-end;
-
-procedure FindClipByClipIndex(AChunk: TLWChunk; AIndex: Pointer; var Found: boolean);
-begin
-  if (AChunk is TLWClip) and
-    (TLWClip(AChunk).ClipIndex = PU2(AIndex)^) then
-      Found := true;
-end;
-
-procedure FindSurfaceByName(AChunk: TLWChunk; AName: Pointer; var Found: boolean);
-begin
-  if (AChunk is TLWSurf) and
-    (TLWSurf(AChunk).Name = PString(AName)^) then
-      Found := true;
-end;
-
-procedure FindSurfaceByTag(AChunk: TLWChunk; ATag: Pointer; var Found: boolean);
-begin
-  if (AChunk is TLWSurf) and
-    (TLWSurf(AChunk).SurfId = PU2(ATag)^) then
-      Found := true;
-end;
-
-procedure FindVMapByName(AChunk: TLWChunk; AName: Pointer; var Found: boolean);
-begin
-  if (AChunk is TLWVMap) and
-    (TLWVMap(AChunk).Name = PString(AName)^) then
-      Found := true;
-end;
-
-function VecAdd(v1,v2: TVec12):TVec12;
-begin
-  result[0]:=v1[0]+v2[0];
-  result[1]:=v1[1]+v2[1];
-  result[2]:=v1[2]+v2[2];
-end;
-
-function VecSub(v1,v2: TVec12): TVec12;
-begin
-  result[0]:=v1[0]-v2[0];
-  result[1]:=v1[1]-v2[1];
-  result[2]:=v1[2]-v2[2];
-end;
-
-function VecCross(v1,v2: TVec12): TVec12;
-begin
-  result[0]:=v1[1]*v2[2]-v1[2]*v2[1];
-  result[1]:=v1[2]*v2[0]-v1[0]*v2[2];
-  result[2]:=v1[0]*v2[1]-v1[1]*v2[0];
-end;
-
-function VecDot(v1, v2: TVec12): TF4;
-begin
-  result:=v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
-end;
-
-function VecNorm(v: TVec12) : TVec12;
-var
-  mag: TF4;
-begin
-  mag := Sqrt(VecDot(v,v));
-
-  if mag >0 then mag := 1/mag;
-
-  result[0]:=v[0]*mag;
-  result[1]:=v[1]*mag;
-  result[2]:=v[2]*mag;
-end;
-
-function CalcPlaneNormal(v1,v2,v3: TVec12): TVec12;
-var
-  e1, e2: TVec12;
-begin
-  e1:=VecSub(v2,v1);
-  e2:=VecSub(v3,v1);
-  result:=VecCross(e1,e2);
-  result:=VecNorm(result);
-end;
-
-procedure FindSurfByName(Chunk: TLWChunk; var Found: boolean);
-begin
-
-end;
-
-(*----------------------------------------------------------------------------
-  Procedure: GetChunkClasses
-  Date:      08-Aug-2002
-  Arguments: None
-  Result:    TClassList
-
-  Singleton access for the chunk class list.
------------------------------------------------------------------------------*)
-function GetChunkClasses: TList;
-begin
-  if ChunkClasses=nil then
-    ChunkClasses:=TList.Create;
-  result:=ChunkClasses;
-end;
-
-procedure UnRegisterChunkClasses;
-var
-  i: Integer;
-begin
-  with GetChunkClasses do
-    for i:=0 to Count-1 do
-      UnregisterClass(TPersistentClass(Items[i]));
-end;
-
-
-(*-----------------------------------------------------------------------------
-  Procedure: RegisterChunkClass
-  Date:      08-Aug-2002
-  Arguments: ChunkClass: TLWChunkClass
-  Result:    None
-
-  Adds a user defined chunk class to the chunk class list.
------------------------------------------------------------------------------*)
-procedure RegisterChunkClass(ChunkClass: TLWChunkClass);
-begin
-  GetChunkClasses.Add(ChunkClass);
-//  if FindClass(ChunkClass.ClassName) <> nil then
-//    UnRegisterClass(ChunkClass);
-//  RegisterClass(ChunkClass);
-end;
-
-(*-----------------------------------------------------------------------------
-  Procedure: GetChunkClass
-  Date:      08-Aug-2002
-  Arguments: ChunkID: TID4
-  Result:    TLWChunkClass
-
-  Returns the chunk class associated with ChunkID.
------------------------------------------------------------------------------*)
-function GetChunkClass(ChunkID: TID4; ADefault: TLWChunkClass): TLWChunkClass;
-var
-  i: Integer;
-begin
-
-  if ADefault = nil then
-    result:=TLWChunk
-  else
-    result:=ADefault;
-
-  for i:=0 to ChunkClasses.Count-1 do
-  begin
-
-    if TLWChunkClass(ChunkClasses.Items[i]).GetID=ChunkID then
-    begin
-
-      result:=TLWChunkClass(ChunkClasses.Items[i]);
-      Exit;
-
-    end;
-
-  end;
-
-end;
-
-(*-----------------------------------------------------------------------------
-  Procedure: Tokenize
-  Date:      08-Aug-2002
-  Arguments: const Src: string; Delimiter: Char; Dst: TStrings
-  Result:    None
-
-  Breaks up a string into TStrings items when the Delimiter character is
-  encountered.
------------------------------------------------------------------------------*)
-procedure Tokenize(const Src: string; Delimiter: Char; Dst: TStrings);
-var
-  i,L,SL: Integer;
-  SubStr: string;
-begin
-  if Dst=nil then Exit;
-
-  L:=Length(Src);
-  if (L=0) or (Dst=nil) then Exit;
-  SubStr:='';
-  for i:=1 to L do
-  begin
-    if (Src[i]<>Delimiter) then SubStr:=SubStr+Src[i] else
-    begin
-      SL:=Length(SubStr);
-      if SL>0 then
-      begin
-        Dst.Add(SubStr);
-        SubStr:='';
-      end;
-    end;
-  end;
-  if Length(SubStr)>0 then Dst.Add(SubStr);
-end;
-
-(*-----------------------------------------------------------------------------
-  Procedure: LoadLW0FromStream
-  Date:      08-Aug-2002
-  Arguments: Stream: TStream; ReadCallback: TLWOReadCallback; UserData: Pointer
-  Result:    LongWord
------------------------------------------------------------------------------*)
-function LoadLW0FromStream(Stream: TStream; ReadCallback: TLWOReadCallback; UserData: Pointer): LongWord;
-var
-  Chunk: TLWChunkRec;
-  CurId: TID4;
-  StartPos, CurSize: TU4;
-
-begin
-  try
-    Stream.Read(CurId,4);
-    ReadMotorolaNumber(Stream,@CurSize,4);
-    if UpperCase(string(CurId)) = 'FORM' then
-    begin
-      Stream.Read(CurId,4);
-    end
-    else
-      raise Exception.Create('Invalid magic number. Not a valid Lightwave Object');
-    with Stream do while Position < Size do
-    begin
-      Read(Chunk,8);
-      ReverseByteOrder(@Chunk.size,4);
-      StartPos:=Position;
-      GetMem(Chunk.data,Chunk.size);
-      Stream.Read(Chunk.data^,Chunk.size);
-      if Assigned(ReadCallback) then ReadCallback(Chunk,UserData);
-      FreeMem(Chunk.data,Chunk.size);
-      Position:=StartPos+Chunk.size+(StartPos+Chunk.size) mod 2;
-    end;
-    Stream.Free;
-    result:=High(LongWord);
-  except
-    On E: Exception do
-    begin
-      Stream.Free;
-      result := 0;
-    end;
-  end;
-end;
-
-function LoadLWOFromFile(const aFilename : String; readCallback : TLWOReadCallback; userData : Pointer) : LongWord;
-var
-   stream: TStream;
-begin
-   stream := TFileStream.Create(aFilename, fmOpenRead);
-   try
-      Result := LoadLW0FromStream(stream, readCallback, userData);
-   finally
-      stream.Free;
-   end;
-end;
-
-procedure ReverseByteOrder(ValueIn: Pointer; Size: Integer; Count: Integer = 1);
-var
-  W: Word;
-  pB: PByte;
-  Blo, Bhi: Byte;
-  L: LongWord;
-  i: Integer;
-begin
-  i:=0;
-  case Size of
-    2: begin
-      while i < Count do
-      begin
-        W := PU2Array(ValueIn)^[i];
-        pB := @W;
-        Blo := pB^;
-        Inc(pB);
-        Bhi := pB^;
-        pB^ := Blo;
-        Dec(pB);
-        pB^ := Bhi;
-        PU2Array(ValueIn)^[i] := w;
-        Inc(i);
-      end;
-    end;
-
-    4: begin
-      while i < Count do
-      begin
-        L := PU4Array(ValueIn)^[i];
-        pB := @W;
-        Blo := pB^;
-        Inc(pB);
-        Bhi := pB^;
-        pB^ := Blo;
-        Dec(pB);
-        pB^ := Bhi;
-
-        PU4Array(ValueIn)^[i] := l;
-        Inc(i);
-      end;
-    end;
-
-  else
-    raise Exception.Create('Lightwave.ReverseByteOrder: Invalid Size = ' + IntToStr(Size));
-  end;
-end;
-
-procedure ReadMotorolaNumber(Stream: TStream; Data: Pointer; ElementSize:
-        Integer; Count: Integer = 1);
-begin
-  Stream.Read(Data^,Count * ElementSize);
-  if (ElementSize = 2) or (ElementSize = 4) then
-    ReverseByteOrder(Data,ElementSize,Count);
-end;
-
-function WriteMotorolaNumber(Stream: TStream; Data: Pointer; ElementSize:
-        Integer; Count: Integer = 1): Integer;
-var
-  TempData: Pointer;
-begin
-  result := 0;
-  if Data <> nil then
-  begin
-    TempData := AllocMem(ElementSize * Count);
-    try
-      if (ElementSize = 2) or (ElementSize = 4) then
-        ReverseByteOrder(TempData,ElementSize,Count);
-      result := Stream.Write(Data,Count * ElementSize);
-    except
-      on E: Exception do
-      begin
-        FreeMem(TempData,Count * ElementSize);
-        raise;
-      end;
-    end;
-  end;
-
-end;
-
-function ReadS0(Stream: TStream; out Str: string): Integer;
-var
-  Buf: array[0..1] of AnsiChar;
-  StrBuf: string;
-begin
-
-  Stream.Read(Buf,2);
-  StrBuf:='';
-  while Buf[1] <> #0 do
-  begin
-    StrBuf := StrBuf + string(Buf);
-    Stream.Read(Buf,2);
-  end;
-  if Buf[0] <> #0 then StrBuf := StrBuf + Char(Buf[0]);
-  Str := Copy(StrBuf,1,Length(StrBuf));
-  result := Length(Str) + 1;
-  result := result + (result mod 2);
-end;
-
-
-function ValueOfVX(VX: Pointer): TU4;
-var
-  TmpU2: TU2;
-  TmpU4: TU4;
-begin
-  if PU1(VX)^ = $FF then
-  begin
-    TmpU4 := TU4(PU1(VX)^) and $FFFFFFF0;
-    ReverseByteOrder(@TmpU4,4);
-  end else
-  begin
-    TmpU2 := TU2(PU2(VX)^);
-    ReverseByteOrder(@TmpU2,2);
-    TmpU4 := TmpU2;
-  end;
-  result := TmpU4;
-end;
-
-function ReadVXAsU4(Stream: TStream; Data: Pointer; Count: Integer = 1): Integer;
-var
-  i, ReadCount: Integer;
-  BufByte: byte;
-  TempU2: TU2;
-begin
-  ReadCount := 0;
-  for i := 0 to Count -1 do
-  begin
-    Stream.Read(BufByte,1);
-    Stream.Position := Stream.Position - 1;
-    if  BufByte = 255 then
-    begin
-      Stream.Read(Data^,SizeOf(TU4));
-      PU4Array(Data)^[i] := PU4Array(Data)^[i] and $FFFFFFF0;
-      ReverseByteOrder(Data,SizeOf(TU4));
-      Inc(ReadCount,4);
-    end else
-    begin
-      Stream.Read(TempU2,SizeOf(TU2));
-      ReverseByteOrder(@TempU2,SizeOf(TU2));
-      PU4Array(Data)^[i] := TempU2;
-      Inc(ReadCount,2);
-    end;
-  end;
-  result := ReadCount;
-end;
-
-function ReadVXAsU2(Stream: TStream; Data: Pointer; Count: Integer = 1): Integer;
-var
-  i, ReadCount: Integer;
-  BufByte: byte;
-  TempU2: TU2;
-begin
-  ReadCount := 0;
-  for i := 0 to Count -1 do
-  begin
-    Stream.Read(BufByte,1);
-    Stream.Position := Stream.Position - 1;
-    if  BufByte = 255 then
-    begin
-      Stream.Position := Stream.Position + 4;
-      PU2Array(Data)^[i] := 0;
-      Inc(ReadCount,4);
-    end else
-    begin
-      Stream.Read(TempU2,SizeOf(TU2));
-      ReverseByteOrder(@TempU2,SizeOf(TU2));
-      PU2Array(Data)^[i] := TempU2;
-      Inc(ReadCount,2);
-    end;
-  end;
-  result := ReadCount;
-end;
-
-
-
-procedure WriteS0(Stream: TStream; Data: string);
-begin
-  // ToDo: WriteS0
-end;
-
-procedure WriteU4AsVX(Stream:TStream; Data: Pointer; Count: Integer);
-var
-  i: Integer;
-  TempU2: TU2;
-begin
-  for i := 0 to Count - 1 do
-  begin
-    if PU4Array(Data)^[i] < 65280 then
-    begin
-      TempU2 := PU4Array(Data)^[i];
-      WriteMotorolaNumber(Stream,@TempU2,SizeOf(TU2));
-    end else
-      WriteMotorolaNumber(Stream,Data,SizeOf(TU4));
-  end;
-end;
-
-type
-  PInteger = ^Integer;
-
-function ID4ToInt(const Id: TId4): Integer;
-var
-  TmpId: AnsiString;
-begin
-  TmpId := Id;
-  TmpId := AnsiString(UpperCase(string(Id)));
-  result := PInteger(@TmpId)^;
-end;
-
-(*********************************** TLWChunk ********************************)
-destructor TLWChunk.Destroy;
-begin
-  Clear;
-  inherited;
-end;
-
-procedure TLWChunk.Clear;
-begin
-  FreeMem(FData,FSize);
-  FSize := 0;
-  FData := nil;
-end;
-
-class function TLWChunk.GetID: TID4;
-begin
-  result := #0#0#0#0;
-end;
-
-procedure TLWChunk.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-begin
-  GetMem(FData,DataSize);
-  AStream.Read(PByteArray(FData)^[0],DataSize);
-end;
-
-procedure TLWChunk.LoadFromStream(AStream: TStream);
-var
-  DataStart: Integer;
-  DataSize: TU4;
-begin
-  with AStream do
-  begin
-  
-    ReadMotorolaNumber(AStream,@DataSize,4);
-  
-    DataStart := Position;
-
-    FSize := DataSize;
-  
-    LoadData(AStream, DataStart,DataSize);
-  
-    Position := Cardinal(DataStart) + DataSize + (Cardinal(DataStart) + DataSize) mod 2;
-  
-  end;
-end;
-
-(******************************* TLWChunkList ********************************)
-constructor TLWChunkList.Create(AOwnsItems: boolean; AOwner: TObject);
-begin
-  inherited Create;
-  FOwnsItems := AOwnsItems;
-  FOwner := AOwner;
-end;
-
-destructor TLWChunkList.Destroy;
-begin
-  Clear;
-  inherited;
-end;
-
-procedure TLWChunkList.Clear;
-begin
-  while Count > 0 do
-    Delete(Count - 1);
-  inherited;
-end;
-
-procedure TLWChunkList.Delete(Index: Integer);
-begin
-  if FOwnsItems then
-    Items[Index].Free;
-  inherited Delete(Index);
-end;
-
-
-function TLWChunkList.GetItem(Index: Integer): TLWChunk;
-begin
-  result := TLWChunk(inherited Items[Index]);
-end;
-
-(***************************** TLWObjectFile ********************************)
-constructor TLWObjectFile.Create;
-begin
-  inherited;
-end;
-
-destructor TLWObjectFile.Destroy;
-begin
-  FreeAndNil(FChunks);
-  inherited;
-end;
-
-function TLWObjectFile.GetChunks: TLWChunkList;
-begin
-  if FChunks = nil then
-    FChunks := TLWChunkList.Create(true,Self);
-  result := FChunks;
-end;
-
-function TLWObjectFile.GetCount: Integer;
-begin
-  result := Chunks.Count;
-end;
-
-function TLWObjectFile.GetSurfaceByName(Index: string): TLWSurf;
-var
-  SurfIdx: Integer;
-begin
-  SurfIdx := Chunks.FindChunk(@FindSurfaceByName,@Index,0);
-  if SurfIdx <> -1 then
-    result := TLWSurf(Chunks[SurfIdx])
-  else
-    result := nil;
-end;
-
-function TLWObjectFile.GetSurfaceByTag(Index: TU2): TLWSurf;
-var
-  TagName: string;
-begin
-  TagName := TagToName(Index);
-  result := SurfaceByName[TagName];
-end;
-
-procedure TLWObjectFile.LoadFromFile(const AFilename: string);
-var
-  Stream: TMemoryStream;
-begin
-
-  Stream := TMemoryStream.Create;
-  try
-    Stream.LoadFromFile(AFilename);
-
-    LoadFromStream(Stream);
-    Stream.Free;
-    FFileName := AFilename;
-  except
-    on E: Exception do
-    begin
-      Stream.Free;
-      raise;
-    end;
-  end;
-
-end;
-
-procedure TLWObjectFile.LoadFromStream(AStream: TStream);
-var
-  CurId: TID4;
-  CurSize: LongWord;
-  CurPnts, CurPols, CurItems: TLWChunkList;
-begin
-   CurPols:=nil;
-   CurPnts:=nil;
-
-  AStream.Read(CurId,4);
-
-  ReadMotorolaNumber(AStream,@CurSize,4);
-
-  if UpperCase(string(CurId)) = 'FORM' then
-  begin
-
-    AStream.Read(CurId,4);
-
-    if CurId <> 'LWO2' then
-      raise Exception.Create('Only Version 6.0+ version objects are supported.');
-
-  end else raise Exception.Create('Invalid magic number. Not a valid Lightwave Object');
-
-  CurItems := Chunks;
-
-  while AStream.Position < AStream.Size do
-  begin
-    AStream.Read(CurId,4);
-
-    if (CurId = ID_PTAG) then
-    begin
-      CurPols.Add(GetChunkClass(CurId, TLWChunk).Create);
-
-      with CurPols[CurPols.Count - 1] do
-      begin
-        FID := CurId;
-        LoadFromStream(AStream);
-      end;
-
-    end else
-    if (CurId = ID_VMAP) or (CurId = ID_VMAD) then
-    begin
-      CurPnts.Add(GetChunkClass(CurId, TLWChunk).Create);
-
-      with CurPnts[CurPnts.Count - 1] do
-      begin
-
-        FID := CurId;
-        LoadFromStream(AStream);
-
-      end;
-    end else
-
-    begin
-
-      if (CurId = ID_LAYR) or (CurId = ID_SURF) or
-        (CurId = ID_TAGS) or (CurId = ID_CLIP) then CurItems := Chunks;
-
-      CurItems.Add(GetChunkClass(CurId, TLWChunk).Create);
-
-      with CurItems[CurItems.Count - 1] do
-      begin
-        FID := CurId;
-        LoadFromStream(AStream);
-      end;
-
-    end;
-
-    if CurId = ID_LAYR then
-      CurItems := TLWParentChunk(CurItems[CurItems.Count - 1]).Items
-    else if CurId = ID_POLS then
-      CurPols := TLWParentChunk(CurItems[CurItems.Count - 1]).Items
-    else if CurId = ID_PNTS then
-      CurPnts := TLWParentChunk(CurItems[CurItems.Count - 1]).Items;
-  end;
-  Chunks.Loaded;
-end;
-
-(********************************** TLWPnts **********************************)
-function TLWPnts.AddPoly(PntIdx, PolyIdx: Integer): Integer;
-var
-  i,L: Integer;
-begin
-  // DONE: Pnts.AddPoly
-  for i := 0 to FPntsInfo[PntIdx].npols -1 do
-  begin
-    if FPntsInfo[PntIdx].pols[i] = PolyIdx then
-    begin
-      result := i;
-      Exit;
-    end;
-  end;
-
-  L := Length(FPntsInfo[PntIdx].pols);
-  SetLength(FPntsInfo[PntIdx].pols,L + 1);
-  FPntsInfo[PntIdx].npols := L + 1;
-  FPntsInfo[PntIdx].pols[L] := PolyIdx;
-  result := L;
-end;
-
-procedure TLWPnts.Clear;
-var
-  i: Integer;
-begin
-  for i := 0 to PntsCount -1 do
-    SetLength(FPntsInfo[i].pols,0);
-  SetLength(FPntsInfo,0);
-  SetLength(FPnts,0);
-end;
-
-function TLWPnts.GetPntsCount: LongWord;
-begin
-  result := Length(FPnts);
-end;
-
-class function TLWPnts.GetID: TID4;
-begin
-  result := ID_PNTS;
-end;
-
-function TLWPnts.GetVMap(VMapID: TID4; out VMap: TLWVMap): Boolean;
-var
-  i: Integer;
-begin
-  result := false;
-  for i := 0 to Items.Count - 1 do
-  begin
-    if (Items[i] is TLWVMap) and (TLWVMap(Items[i]).VMapType = VMapID) then
-    begin
-  
-      result := true;
-      VMap := TLWVMap(Items[i]);
-      Exit;
-    end;
-  
-  end;
-  
-end;
-
-procedure TLWPnts.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-begin
-  SetLength(FPnts,DataSize div 12); // allocate storage for DataSize div 12 points
-  SetLength(FPntsInfo,DataSize div 12); // Point info
-  ReadMotorolaNumber(AStream,@FPnts[0],4,DataSize div 4); // read the point data
-end;
-
-(******************************** TLWPols ************************************)
-procedure TLWPols.CalcPolsNormals;
-var
-  i,j,PolyIdx: Integer;
-  Pnts: TLWPnts;
-begin
-  if IndiceCount = 0 then Exit;
-
-  with ParentChunk as TLWLayr do
-    Pnts := TLWPnts(Items[Items.FindChunk(@FindChunkById,@ID_PNTS,0)]);
-
-  for PolyIdx := 0 to FPolsCount - 1 do
-  begin
-    // DONE: call Pnts.AddPoly
-    i := PolsByIndex[PolyIdx];
-
-    with Pnts do
-    begin
-
-      for j := 1 to Indices[i] do
-        AddPoly(Indices[i + j],PolyIdx);
-
-      SetLength(FPolsInfo[PolyIdx].vnorms,Indices[i]);
-
-      if Indices[PolyIdx]>2 then
-        FPolsInfo[PolyIdx].norm:=CalcPlaneNormal(Pnts[Indices[i+1]],Pnts[Indices[i+2]],Pnts[Indices[i+3]])
-      else
-        FPolsInfo[PolyIdx].norm := VecNorm(Pnts[Indices[i+1]]);
-    end;
-  end;
-end;
-
-procedure TLWPols.Clear;
-var
-  i: Integer;
-begin
-  for i := 0 to FPolsCount-1 do
-    SetLength(FPolsInfo[i].vnorms,0);
-  SetLength(FPolsInfo,0);
-  SetLength(FPols,0);
-end;
-
-function TLWPols.GetPolsByIndex(AIndex: TU2): Integer;
-var
-  i, cnt: Cardinal;
-begin
-  result := -1;
-  i := 0;
-  cnt := 0;
-
-  if AIndex = 0 then
-  begin
-    result := 0;
-    Exit;
-  end;
-
-  while (i < IndiceCount - 1) and (cnt <> AIndex) do
-  begin
-    Inc(i,Indices[i]+1);
-    Inc(cnt);
-  end;
-  if cnt = AIndex then
-    result := i;
-end;
-
-class function TLWPols.GetID: TID4;
-begin
-  result := ID_POLS;
-end;
-
-function TLWPols.GetIndiceCount: TU4;
-begin
-  result := Length(FPols);
-end;
-
-function TLWPols.GetIndice(AIndex: Integer): TU2;
-begin
-  result := FPols[AIndex];
-end;
-
-function TLWPols.GetPolsCount: Integer;
-begin
-  result := FPolsCount;
-end;
-
-procedure TLWPols.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-var
-  EndPos: Integer;
-  Idx: TU4;
-  TmpU2: TU2;
-begin
-
-  Idx := 0;
-  EndPos := DataStart + DataSize;
-
-  with AStream do
-  begin
-
-    Read(FPolsType,4);
-
-    // To avoid memory manager hits, set an estimate length of indices
-    SetLength(FPols,(DataSize - 4) div 2);
-    while Position < EndPos do
-    begin
-      ReadMotorolaNumber(AStream,@FPols[Idx],2);
-      TmpU2 := FPols[Idx] and POLS_VCOUNT_MASK;
-      ReadVXAsU2(AStream,@FPols[Idx + 1],TmpU2);
-      Inc(Idx,FPols[Idx] + 1);
-      Inc(FPolsCount);
-    end;
-    // correct length estimate errors if any
-    if (Idx + 1) < Cardinal(Length(FPols)) then
-      SetLength(FPols,Idx + 1);
-  end;
-  SetLength(FPolsInfo,FPolsCount);
-  CalcPolsNormals;
-end;
-
-
-(********************************** TLWVMap *********************************)
-procedure TLWVMap.Clear;
-var
-  i: Integer;
-begin
-  for i := 0 to Length(FValues) - 1 do
-    SetLength(FValues[i].values,0);
-  
-  SetLength(FValues,0);
-end;
-
-class function TLWVMap.GetID: TID4;
-begin
-  result := ID_VMAP;
-end;
-
-function TLWVMap.GetValue(AIndex: TU2): TLWVertexMap;
-begin
-  result := FValues[AIndex];
-end;
-
-function TLWVMap.GetValueCount: Integer;
-begin
-  result := Length(FValues);
-end;
-
-procedure TLWVMap.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-var
-  Idx: TU4;
-begin
-  Idx := 0;
-  with AStream do
-  begin
-    Read(FVMapType,4);
-    ReadMotorolaNumber(AStream,@FDimensions,2);
-    ReadS0(AStream,FName);
-    if FDimensions > 0 then
-    begin
-      while Cardinal(Position) < (DataStart + DataSize) do
-      begin
-        SetLength(FValues,Length(FValues) + 1);
-        ReadVXAsU2(AStream,@FValues[Idx].vert,1);
-        SetLength(FValues[Idx].values,Dimensions * 4);
-        ReadMotorolaNumber(AStream,@FValues[Idx].values[0],4,Dimensions);
-        Inc(Idx);
-      end;
-    end;
-  end;
-end;
-
-(********************************* TLWTags ***********************************)
-destructor TLWTags.Destroy;
-begin
-  inherited;
-end;
-
-procedure TLWTags.Clear;
-begin
-  FreeAndNil(FTags);
-end;
-
-class function TLWTags.GetID: TID4;
-begin
-  result := ID_TAGS;
-end;
-
-function TLWTags.GetTags: TStrings;
-begin
-  if FTags = nil then
-    FTags := TStringList.Create;
-  result := FTags;
-end;
-
-procedure TLWTags.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-var
-  EndPos: TU4;
-  TmpStr: string;
-begin
-  EndPos := DataStart + DataSize;
-  while Cardinal(AStream.Position) < Cardinal(EndPos) do
-  begin
-    ReadS0(AStream,TmpStr);
-    Tags.Add(TmpStr);
-    TmpStr := '';
-  end;
-end;
-
-function TLWTags.TagToName(Tag: TU2): string;
-begin
-  result := Tags[Tag];
-end;
-
-(****************************** TLWSubChunk **********************************)
-procedure TLWSubChunk.LoadFromStream(AStream: TStream);
-var
-  DataStart: Integer;
-  DataSize: TU2;
-begin
-  
-  with AStream do
-  begin
-
-    ReadMotorolaNumber(AStream,@DataSize,2);
-
-    DataStart := Position;
-
-    FSize := DataSize;
-
-    LoadData(AStream,DataStart,DataSize);
-
-    Position := DataStart + DataSize + (DataStart + DataSize) mod 2;
-  
-  end;
-  
-end;
-
-
-(******************************** TLWLayr ************************************)
-destructor TLWLayr.Destroy;
-begin
-  inherited;
-end;
-
-class function TLWLayr.GetID: TID4;
-begin
-  result := ID_LAYR;
-end;
-
-procedure TLWLayr.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-begin
-  
-  ReadMotorolaNumber(AStream,@FNumber,2);
-  ReadMotorolaNumber(AStream,@FFlags,2);
-  ReadMotorolaNumber(AStream,@FPivot,4,3);
-  ReadS0(AStream,FName);
-  
-   if ((DataStart + DataSize) - Cardinal(AStream.Position)) > 2 then
-      ReadMotorolaNumber(AStream,@FParent,2);
-end;
-
-(******************************** TLWSurf ************************************)
-destructor TLWSurf.Destroy;
-begin
-  inherited;
-end;
-
-class function TLWSurf.GetID: TID4;
-begin
-  result := ID_SURF;
-end;
-
-function TLWSurf.GetParamAddr(Param: TID4): Pointer;
-var
-  Idx: Integer;
-  sParam: string;
-begin
-  result:=inherited GetParamAddr(Param);
-
-  if (result=nil) and (Source<>'') then
-  begin
-    sParam := string(Param);
-    Idx:=RootChunks.FindChunk(@FindSurfaceByName,@sParam,0);
-
-    if Idx<>-1 then
-      result:=TLWSurf(RootChunks[Idx]).ParamAddr[Param];
-  end;
-end;
-
-function TLWSurf.GetSurfId: Integer;
-var
-  c, SurfIdx: Integer;
-begin
-  c := 0;
-  SurfIdx := Owner.FindChunk(@FindChunkById,@ID_SURF);
-
-  while (SurfIdx <> -1) and (Owner[SurfIdx] <> Self) do
-  begin
-    SurfIdx := Owner.FindChunk(@FindChunkById,@ID_SURF,SurfIdx + 1);
-    Inc(c);
-  end;
-  result := c;
-end;
-
-procedure TLWSurf.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-var
-  CurId: TID4;
-begin
-
-  ReadS0(AStream,FName);
-
-  ReadS0(AStream,FSource);
-
-  while Cardinal(AStream.Position) < (DataStart + DataSize) do
-  begin
-
-    AStream.Read(CurId,4);
-
-    Items.Add(GetChunkClass(CurId, TLWSubChunk).Create);
-
-    with Items[Items.Count - 1] do
-    begin
-
-      FID:=CurId;
-      LoadFromStream(AStream);
-
-    end;
-
-  end;
-
-end;
-
-(******************************** TLWPTag ************************************)
-constructor TLWPTag.Create;
-begin
-  inherited;
-end;
-
-function TLWPTag.AddTag(Value: TU2): Integer;
-var
-  i, L: Integer;
-begin
-  result := -1;
-  L := Length(FTags);
-
-  for i := 0 to L - 1 do
-    if Value = FTags[i] then
-    begin
-      result := i;
-      Exit;
-    end;
-  if result = -1 then
-  begin
-    SetLength(FTags,L + 1);
-    FTags[L] := Value;
-    result := L;
-  end;
-end;
-
-procedure TLWPTag.Clear;
-begin
-  SetLength(FTagMaps,0);
-  SetLength(FTags,0);
-end;
-
-function TLWPTag.GetPolsByTag(Tag: TU2; var PolyIndices: TU2DynArray): Integer;
-var
-  i: Integer;
-  procedure AddPoly(Value: TU2);
-  var
-    L: Integer;
-  begin
-    L := Length(PolyIndices);
-    SetLength(PolyIndices,L+1);
-    PolyIndices[L] := Value;
-  end;
-begin
-  for i := 0 to TagMapCount -1 do
-    if TagMaps[i].tag = Tag then
-      AddPoly(TagMaps[i].poly);
-  result := Length(PolyIndices);
-end;
-
-class function TLWPTag.GetID: TID4;
-begin
-  result := ID_PTAG;
-end;
-
-function TLWPTag.GetTag(AIndex: Integer): TU2;
-begin
-  ValidateTagInfo;
-  result := FTags[AIndex];
-end;
-
-function TLWPTag.GetTagCount: Integer;
-begin
-  ValidateTagInfo;
-  result := Length(FTags);
-end;
-
-function TLWPTag.GetTagMapCount: Integer;
-begin
-  result := Length(FTagMaps) div 2;
-end;
-
-function TLWPTag.GetTagMaps(AIndex: Integer): TLWPolyTagMap;
-begin
-  result := PLWPolyTagMap(@FTagMaps[AIndex * 2])^;
-end;
-
-procedure TLWPTag.LoadData(AStream: TStream; DataStart, DataSize: LongWord);
-var
-  Idx: Integer;
-begin
-
-  Idx := 0;
-
-  with AStream do
-  begin
-    Read(FMapType,4);
-
-    SetLength(FTagMaps,(DataSize - 4) div 2);
-
-    while Cardinal(Position) < (DataStart + DataSize) do
-    begin
-      ReadVXAsU2(AStream, @FTagMaps[Idx]);
-      ReadMotorolaNumber(AStream,@FTagMaps[Idx + 1],2);
-      Inc(Idx, 2);
-    end;
-    // correct length guestimate errors if any
-    if (Idx + 1) < Length(FTagMaps) then
-      SetLength(FTagMaps,Idx + 1);
-  end;
-end;
-
-procedure TLWPTag.ValidateTagInfo;
-var
-  i: Integer;
-begin
-  if Length(FTags) > 0 then Exit;
-  for i := 0 to TagMapCount -1 do
-    AddTag(TagMaps[i].tag);
-end;
-
-(***************************** TLWParentChunk ********************************)
-procedure TLWParentChunk.Clear;
-begin
-  FreeAndNil(FItems);
-  inherited;
-end;
-
-function TLWParentChunk.GetFloatParam(Param: TID4): Single;
-var
-  pdata: Pointer;
-begin
-  pdata:=ParamAddr[Param];
-  if pdata <> nil then
-  begin
-    result:=PF4(pdata)^;
-    ReverseByteOrder(@result,4);
-  end else
-    result:=0.0;
-end;
-
-function TLWParentChunk.GetItems: TLWChunkList;
-begin
-  if FItems = nil then
-    FItems := TLWChunkList.Create(true,Self);
-  result := FItems;
-end;
-
-function TLWParentChunk.GetLongParam(Param: TID4): LongWord;
-var
-  pdata: Pointer;
-begin
-  pdata:=ParamAddr[Param];
-  if pdata <> nil then
-  begin
-
-    result:=PU4(pdata)^;
-    ReverseByteOrder(@result,4);
-
-  end else
-
-    result:=0;
-end;
-
-function TLWParentChunk.GetParamAddr(Param: TID4): Pointer;
-var
-  Idx: Integer;
-begin
-
-  result := nil;
-
-  Idx := Items.FindChunk(@FindChunkById,@Param,0);
-  if Idx <> -1 then
-    result := Items[Idx].Data;
-end;
-
-function TLWPols.GetPolsByPntIdx(VertIdx: TU2;
-  var VertPolys: TU2DynArray): Integer;
-var
-  i,j,L: Integer;
-begin
-   L:=0;
-
-  if Length(VertPolys) >0 then
-    SetLength(VertPolys,0);
-
-  for i := 0 to PolsCount -1 do
-  begin
-
-    for j := 1 to Indices[PolsByIndex[i]] do
-    begin
-
-      if Indices[PolsByIndex[i] + j] = VertIdx then
-      begin
-
-        L := Length(VertPolys);
-        SetLength(VertPolys, L + 1);
-        VertPolys[L] := i;
-
-      end;
-
-    end;
-
-  end;
-
-  result := L;
-
-end;
-
-function TLWChunkList.Add(AChunk: TLWChunk): Integer;
-begin
-  if (FOwner<>nil) and (FOwner is TLWParentChunk) then
-    AChunk.FParentChunk := TLWParentChunk(FOwner);
-
-  AChunk.FOwner := self;
-  result := inherited Add(AChunk);
-end;
-
-procedure TLWPols.CalcPntsNormals;
-var
-  i,j,k,PntIdx,PolyIdx,SurfIdx: Integer;
-  Pnts: TLWPnts;
-//  PTags: TLWPTag;
-  TmpAddr: Pointer;
-  sman: TF4;
-begin
-  {Todo: CalcPntsNormals}
-
-  if IndiceCount = 0 then Exit;
-
-  with ParentChunk as TLWLayr do
-    Pnts := TLWPnts(Items[Items.FindChunk(@FindChunkById,@ID_PNTS,0)]);
-
-  for PolyIdx := 0 to PolsCount-1 do
-  begin
-    i := PolsByIndex[PolyIdx];
-
-    SurfIdx := RootChunks.FindChunk(@FindSurfaceByTag,@FPolsInfo[PolyIdx].surfid);
-
-    TmpAddr := TLWSurf(RootChunks[SurfIdx]).ParamAddr[ID_SMAN];
-
-    if TmpAddr <> nil then
-    begin
-      sman := PF4(TmpAddr)^;
-      ReverseByteOrder(@sman,4);
-    end else
-      sman := 0;
-
-    for j := 1 to Indices[i] do
-    begin
-
-      FPolsInfo[PolyIdx].vnorms[j-1] := FPolsInfo[PolyIdx].norm;
-
-      if sman <= 0 then continue;
-
-      PntIdx := Indices[i + j];
-
-
-      for k := 0 to Pnts.PntsInfo[PntIdx].npols -1 do
-      begin
-        if Pnts.PntsInfo[PntIdx].pols[k] = PolyIdx then continue;
-
-        if ArcCosine(VecDot(FPolsInfo[PolyIdx].norm,FPolsInfo[Pnts.PntsInfo[PntIdx].pols[k]].norm)) > sman then continue;
-
-        FPolsInfo[PolyIdx].vnorms[j-1]:=VecAdd(FPolsInfo[PolyIdx].vnorms[j-1],FPolsInfo[Pnts.PntsInfo[PntIdx].pols[k]].norm);
-      end;
-
-      FPolsInfo[PolyIdx].vnorms[j-1]:=VecNorm(FPolsInfo[PolyIdx].vnorms[j-1]);
-
-    end;
-  end;
-end;
-
-function TLWChunk.GetRootChunks: TLWChunkList;
-var
-  Parent: TLWParentChunk;
-begin
-  result := nil;
-  if (FParentChunk = nil) then
-  begin
-
-    if (FOwner is TLWChunkList) then
-    begin
-      result := FOwner;
-      Exit;
-    end;
-
-  end else
-  begin
-    Parent := FParentChunk;
-    while not(Parent.ParentChunk = nil) do
-      Parent := Parent.ParentChunk;
-    result := Parent.Owner;
-  end;
-end;
-
-function TLWChunkList.FindChunk(ChunkFind: TLWChunkFind; Criteria: Pointer; StartIndex: Integer): Integer;
-var
-  Found: boolean;
-begin
-  Found := false;
-  result := -1;
-  while (StartIndex < Count) and (not Found) do
-  begin
-    ChunkFind(Items[StartIndex],Criteria,Found);
-    if Found then
-    begin
-      result := StartIndex;
-      Exit;
-    end;
-    Inc(StartIndex);
-  end;
-end;
-
-function TLWChunk.GetIndex: Integer;
-begin
-  result := Owner.IndexOf(Self);
-end;
-
-procedure TLWChunk.Loaded;
-begin
-  // do nothing
-end;
-
-procedure TLWChunkList.Loaded;
-var
-  i: Integer;
-begin
-  for i := 0 to Count-1 do
-  begin
-    Items[i].Loaded;
-  end;
-end;
-
-function TLWParentChunk.GetVec3Param(Param: TID4): TVec12;
-var
-  pdata: Pointer;
-begin
-  pdata:=ParamAddr[Param];
-  if pdata <> nil then
-  begin
-
-    result:=PVec12(pdata)^;
-    ReverseByteOrder(@result,4,3);
-
-  end else
-  begin
-
-    result[0]:=0;
-    result[1]:=1;
-    result[2]:=2;
-
-  end;
-end;
-
-function TLWParentChunk.GetVXParam(Param: TID4): Word;
-var
-  pdata: Pointer;
-begin
-  pdata:=ParamAddr[Param];
-  if pdata <> nil then
-
-    result:=ValueOfVX(pdata)
-
-  else
-
-    result:=0;
-
-end;
-
-function TLWParentChunk.GetWordParam(Param: TID4): Word;
-var
-  pdata: Pointer;
-begin
-  pdata:=ParamAddr[Param];
-  if pdata <> nil then
-  begin
-
-    result:=PU4(pdata)^;
-    ReverseByteOrder(@result,2);
-
-  end else
-
-    result:=0;
-end;
-
-procedure TLWParentChunk.Loaded;
-begin
-  Items.Loaded;
-end;
-
-procedure TLWPols.Loaded;
-begin
-  inherited;
-  CalcPntsNormals;
-end;
-
-function TLWObjectFile.TagToName(Tag: TU2): string;
-var
-  TagsIdx: Integer;
-begin
-  TagsIdx := Chunks.FindChunk(@FindChunkById,@ID_TAGS);
-  if TagsIdx <> -1 then
-    result := TLWTags(Chunks[TagsIdx]).TagToName(Tag);
-end;
-
-//---------------------------------
-// TLWClip
-//---------------------------------
-
-class function TLWClip.GetID: TID4;
-begin
-  result := ID_CLIP;
-end;
-
-procedure TLWClip.LoadData(AStream: TStream; DataStart,
-  DataSize: LongWord);
-var
-  CurId: TID4;
-begin
-  ReadMotorolaNumber(AStream,@FClipIndex,4);
-  while Cardinal(AStream.Position) < (DataStart + DataSize) do
-  begin
-
-    AStream.Read(CurId,4);
-
-    Items.Add(GetChunkClass(CurId, TLWSubChunk).Create);
-
-    with Items[Items.Count - 1] do
-    begin
-
-      FID:=CurId;
-      LoadFromStream(AStream);
-
-    end;
-
-  end;
-
-end;
-
-//---------------------------------
-// TLWContentDir
-//---------------------------------
-
-(*
-function TLWContentDir.ContentSearch(AFilename: string): string;
-var
-  i: Integer;
-begin
-
-  if not FileExists(AFilename) then
-  begin
-
-    result := ExtractFileName(AFilename);
-
-    if not FileExists(result) then
-    begin
-
-      for i := 0 to SubDirs.Count - 1 do
-      begin
-
-        if FileExists(Root+'\'+SubDirs[i]+'\'+result) then
-        begin
-          result:=Root+'\'+SubDirs[i]+'\'+result;
-          Exit;
-        end;
-
-      end;
-      result := '';
-
-    end;
-
-  end;
-end;
-*)
-
-destructor TLWContentDir.Destroy;
-begin
-  FreeAndNil(FSubDirs);
-  inherited;
-end;
-
-function TLWContentDir.FindContent(AFilename: string): string;
-var
-  i: Integer;
-begin
-
-  if not FileExists(AFilename) then
-  begin
-
-    result := ExtractFileName(AFilename);
-
-    if not FileExists(result) then
-    begin
-
-      for i := 0 to SubDirs.Count - 1 do
-      begin
-
-        if FileExists(Root+'\'+SubDirs[i]+'\'+result) then
-        begin
-          result:=Root+'\'+SubDirs[i]+'\'+result;
-          Exit;
-        end;
-
-      end;
-      result := '';
-
-    end;
-
-  end;
-end;
-
-function TLWContentDir.GetSubDirs: TStrings;
-begin
-  if FSubDirs = nil then
-   FSubDirs := TStringList.Create;
-  result := FSubDirs;
-end;
-
-procedure TLWContentDir.SetRoot(const Value: string);
-begin
-  FRoot := Value;
-end;
-
-procedure TLWContentDir.SetSubDirs(const Value: TStrings);
-begin
-  SubDirs.Assign(Value);
-end;
-
-//-----------------------------------
-initialization
-//-----------------------------------
-
-  // Pnts
-  RegisterChunkClass(TLWPnts);
-
-  // Pols
-  RegisterChunkClass(TLWPols);
-
-  // VMap
-  RegisterChunkClass(TLWVMap);
-
-  // Tags
-  RegisterChunkClass(TLWTags);
-
-  // PTAG
-  RegisterChunkClass(TLWPTAG);
-
-  // SURF
-  RegisterChunkClass(TLWSurf);
-
-  // LAYR
-  RegisterChunkClass(TLWLayr);
-
-  // CLIP
-  RegisterChunkClass(TLWClip);
-
-//------------------------------------
-finalization
-//------------------------------------
-
-  FreeAndNil(ChunkClasses);
-  FreeAndNil(ContentDir);
-
-end.

+ 0 - 200
Source/FMX/Formatx.Q3BSP.pas

@@ -1,200 +0,0 @@
-//
-// The graphics platform GLXcene https://github.com/glscene
-//
-unit Formatx.Q3BSP;
-
-(* Simple Quake III BSP file loader *)
-
-interface
-
-uses
-  System.Classes,
-  System.SysUtils,
-  Scena.VectorTypes;
-
-const FACE_POLYGON = 1;
-const MAX_TEXTURES = 1000;
-
-type
-
-   TBSPHeader = record
-      StrID : array [0..3] of AnsiChar;    // This should always be 'IBSP'
-      Version : Integer;               // This should be 0x2e for Quake 3 files
-   end;
-
-   TBSPLump = record
-      Offset : Integer;                // The offset into the file for the start of this lump
-      Length : Integer;                // The length in bytes for this lump
-   end;
-
-   TBSPBBox = array [0..5] of Integer;
-
-   TBSPNode = record
-      Plane : Integer;                       // Space partitioning plane
-      Children : array [0..1] of Integer;    // Back and front child nodes
-      BBox : TBSPBBox;                       // Bounding box of node
-   end;
-
-   TBSPLeaf = record
-      Cluster : Integer;                  // Visibility cluster number
-      Area : Integer;                     // Volume of the leaf
-      BBox : TBSPBBox;                    // Bounding box of leaf
-      FirstFace, NumFaces : Integer;      // Lookup for the face list (indexes are for faces)
-      FirstBrush, NumBrushes : Integer;   // Lookup for the brush list (indexes are for brushes)
-   end;
-
-   TBSPModel = record
-      BBox : TBSPBBox;                    // Bounding box of model
-      FirstFace, NumFaces : Integer;      // Lookup for the face list (indexes are for faces)
-      FirstBrush, NumBrushes : Integer;   // Lookup for the brush list (indexes are for brushes)
-   end;
-
-   TBSPVertex = record
-      Position      : TVector3f;             // (x, y, z) position.
-      TextureCoord  : TVector2f;             // (u, v) texture coordinate
-      LightmapCoord : TVector2f;             // (u, v) lightmap coordinate
-      Normal        : TVector3f;             // (x, y, z) normal vector
-      Color         : array [0..3] of Byte   // RGBA color for the vertex
-   end;
-   PBSPVertex = ^TBSPVertex;
-
-   TBSPFace = record
-      textureID : Integer;                   // The index into the texture array
-      effect    : Integer;                   // The index for the effects (or -1 = n/a)
-      FaceType  : Integer;                   // 1=polygon, 2=patch, 3=mesh, 4=billboard
-      startVertIndex : Integer;              // The starting index into this face's first vertex
-      numOfVerts     : Integer;              // The number of vertices for this face
-      meshVertIndex  : Integer;              // The index into the first meshvertex
-      numMeshVerts   : Integer;              // The number of mesh vertices
-      lightmapID     : Integer;              // The texture index for the lightmap
-      lMapCorner : array [0..1] of Integer;  // The face's lightmap corner in the image
-      lMapSize   : array [0..1] of Integer;  // The size of the lightmap section
-      lMapPos  : TVector3f;                  // The 3D origin of lightmap.
-      lMapVecs : array [0..1] of TVector3f;  // The 3D space for s and t unit vectors.
-      vNormal  : TVector3f;                  // The face normal.
-      Size : array [0..1] of Integer;        // The bezier patch dimensions.
-   end;
-   PBSPFace = ^TBSPFace;
-
-   TBSPTexture = record
-      TextureName : array [0..63] of AnsiChar;   // The name of the texture w/o the extension
-      flags    : Integer;                    // The surface flags (unknown)
-      contents : Integer;                    // The content flags (unknown)
-   end;
-   PBSPTexture = ^TBSPTexture;
-
-   TBSPLightmap = record
-      imageBits : array [0..49151] of Byte;     // The RGB data in a 128x128 image
-   end;
-   PBSPLightmap = ^TBSPLightmap;
-
-   TBSPVisData = record
-      numOfClusters : Integer;
-      bytesPerCluster : Integer;
-      bitSets : array of Byte;
-   end;
-
-   TQ3BSP = class (TObject)
-      public
-         
-         Header         : TBSPHeader;
-         Lumps          : array of TBSPLump;
-         NumOfVerts     : Integer;
-         NumOfNodes     : Integer;
-         NumOfPlanes    : Integer;
-         NumOfLeaves    : Integer;
-         NumOfFaces     : Integer;
-         NumOfTextures  : Integer;
-         NumOfLightmaps : Integer;
-         Vertices       : array of TBSPVertex;
-         Nodes          : array of TBSPNode;
-         Planes         : array of TVector4f;
-         Leaves         : array of TBSPLeaf;
-         Faces          : array of TBSPFace;
-         Textures       : array of TBSPTexture; // texture names (without extension)
-         Lightmaps      : array of TBSPLightmap;
-         VisData        : TBSPVisData;
-         constructor Create(bspStream : TStream);
-   end;
-
-const
-   kEntities    = 0;            // Stores player/object positions, etc...
-   kTextures    = 1;            // Stores texture information
-   kPlanes      = 2;            // Stores the splitting planes
-   kNodes       = 3;            // Stores the BSP nodes
-   kLeafs       = 4;            // Stores the leafs of the nodes
-   kLeafFaces   = 5;            // Stores the leaf's indices into the faces
-   kLeafBrushes = 6;            // Stores the leaf's indices into the brushes
-   kModels      = 7;            // Stores the info of world models
-   kBrushes     = 8;            // Stores the brushes info (for collision)
-   kBrushSides  = 9;            // Stores the brush surfaces info
-   kVertices    = 10;           // Stores the level vertices
-   kMeshVerts   = 11;           // Stores the model vertices offsets
-   kShaders     = 12;           // Stores the shader files (blending, anims..)
-   kFaces       = 13;           // Stores the faces for the level
-   kLightmaps   = 14;           // Stores the lightmaps for the level
-   kLightVolumes= 15;           // Stores extra world lighting information
-   kVisData     = 16;           // Stores PVS and cluster info (visibility)
-   kMaxLumps    = 17;           // A constant to store the number of lumps
-
-//==========================================================================
-implementation
-//==========================================================================
-
-// ------------------
-// ------------------ TQ3BSP ------------------
-// ------------------
-
-constructor TQ3BSP.Create(bspStream : TStream);
-begin
-   SetLength(Lumps, kMaxLumps);
-
-   // Read in the header and lump data
-   bspStream.Read(Header, SizeOf(Header));
-   bspStream.Read(Lumps[0], kMaxLumps*SizeOf(TBSPLump));
-
-   NumOfNodes:=Round(lumps[kNodes].length/SizeOf(TBSPNode));
-   SetLength(Nodes, NumOfNodes);
-   bspStream.Position:=lumps[kNodes].offset;
-   bspStream.Read(Nodes[0], NumOfNodes*SizeOf(TBSPNode));
-
-   NumOfPlanes:=Round(lumps[kPlanes].length/SizeOf(TVector4f));
-   SetLength(Planes, NumOfPlanes);
-   bspStream.Position:=lumps[kPlanes].offset;
-   bspStream.Read(Planes[0], NumOfPlanes*SizeOf(TVector4f));
-
-   NumOfLeaves:=Round(lumps[kLeafs].length/SizeOf(TBSPLeaf));
-   SetLength(Leaves, NumOfLeaves);
-   bspStream.Position:=lumps[kLeafs].offset;
-   bspStream.Read(Leaves[0], NumOfLeaves*SizeOf(TBSPLeaf));
-
-   NumOfVerts:=Round(lumps[kVertices].length/SizeOf(TBSPVertex));
-   SetLength(Vertices, numOfVerts);
-   bspStream.Position:=lumps[kVertices].offset;
-   bspStream.Read(Vertices[0], numOfVerts*SizeOf(TBSPVertex));
-
-   numOfFaces:=Round(lumps[kFaces].length/SizeOf(TBSPFace));
-   SetLength(Faces, numOfFaces);
-   bspStream.Position:=lumps[kFaces].offset;
-   bspStream.Read(Faces[0], numOfFaces*SizeOf(TBSPFace));
-
-   NumOfTextures:=Round(lumps[kTextures].length/SizeOf(TBSPTexture));
-   SetLength(Textures, NumOfTextures);
-   bspStream.Position:=lumps[kTextures].offset;
-   bspStream.Read(Textures[0], NumOfTextures*SizeOf(TBSPTexture));
-
-   NumOfLightmaps:=Round(lumps[kLightmaps].length/SizeOf(TBSPLightmap));
-   SetLength(Lightmaps, NumOfLightmaps);
-   bspStream.Position:=lumps[kLightmaps].offset;
-   bspStream.Read(Lightmaps[0], NumOfLightmaps*SizeOf(TBSPLightmap));
-
-   bspStream.Position:=lumps[kVisData].offset;
-   bspStream.Read(VisData.numOfClusters, SizeOf(Integer));
-   bspStream.Read(VisData.bytesPerCluster, SizeOf(Integer));
-   if VisData.numOfClusters*VisData.bytesPerCluster>0 then begin
-      SetLength(VisData.bitSets, VisData.numOfClusters*VisData.bytesPerCluster);
-      bspStream.Read(VisData.bitSets[0], VisData.numOfClusters*VisData.bytesPerCluster);
-   end;
-end;
-
-end.

+ 1 - 1
Source/FMX/Formatx.Q3MD3.pas

@@ -1,5 +1,5 @@
 //
-// The graphics platform GLXcene https://github.com/glscene
+// The graphics platform GLArena https://github.com/glscene
 //
 unit Formatx.Q3MD3;
 

+ 0 - 4616
Source/FMX/Formatx.VFW.pas

@@ -1,4616 +0,0 @@
-//
-// The graphics platform GLXcene https://github.com/glscene
-//
-unit Formatx.VFW;
-
-(***************************************************************************
- *
- *      VfW.H - Video for windows include file for WIN32
- *
- *      Copyright (c) 1991-1999, Microsoft Corp.  All rights reserved.
- *
- *      This include files defines interfaces to the following
- *      video components
- *
- *          COMPMAN         - Installable Compression Manager.
- *          DRAWDIB         - Routines for drawing to the display.
- *          VIDEO           - Video Capture Driver Interface
- *
- *          AVIFMT          - AVI File Format structure definitions.
- *          MMREG           - FOURCC and other things
- *
- *          AVIFile         - Interface for reading AVI Files and AVI Streams
- *          MCIWND          - MCI/AVI window class
- *          AVICAP          - AVI Capture Window class
- *
- *          MSACM           - Audio compression manager.
- *
- *      The following symbols control inclusion of various parts of this file:
- *
- *          NOCOMPMAN       - dont include COMPMAN
- *          NODRAWDIB       - dont include DRAWDIB
- *          NOVIDEO         - dont include video capture interface
- *
- *          NOAVIFMT        - dont include AVI file format structs
- *          NOMMREG         - dont include MMREG
- *
- *          NOAVIFILE       - dont include AVIFile interface
- *          NOMCIWND        - dont include AVIWnd class.
- *          NOAVICAP        - dont include AVICap class.
- *
- *          NOMSACM         - dont include ACM stuff.
- *
- ***************************************************************************)
-
-interface
-
-{.$UNDEF UNICODE}
-
-{$I Scena.inc}
-
-uses
-    Winapi.Windows,
-    Winapi.MMSystem,
-    Winapi.Messages,
-    Winapi.CommDlg,
-    Winapi.ActiveX;
-
-type
-  PVOID = pointer;
-  LONG  = longint;
-  PLONG = ^LONG;
-  int   = integer;
-
-(**********************************
- *
- *  VideoForWindowsVersion() - returns version of VfW
- *
- ********************************)
-
-function VideoForWindowsVersion: DWORD; pascal;
-
-(**********************************
- *
- *  call these to start stop using VfW from your app.
- *
- ********************************)
-                                {
-function InitVFW: LONG; stdcall;
-function TermVFW: LONG; stdcall;  }
-
-(**********************************/
-/*                                                                          */
-/*        Macros                                                            */
-/*                                                                          */
-/*  should we define this??                                                 */
-/*                                                                          */
-/*********************************)
-
-function MKFOURCC(ch0, ch1, ch2, ch3: AnsiChar): FOURCC;
-
-//  COMPMAN - Installable Compression Manager.
-
-const
-  ICVERSION                   = $0104 ;
-
-type
-  HIC                         = THandle;  // Handle to an Installable Compressor
-
-//
-// this code in biCompression means the DIB must be accesed via
-// 48 bit pointers! using *ONLY* the selector given.
-//
-const
-  BI_1632                     = $32333631;    // '1632'
-
-function mmioFOURCC(ch0, ch1, ch2, ch3: AnsiChar): FOURCC;
-
-type
-  TWOCC                       = word;
-
-function aviTWOCC(ch0, ch1: AnsiChar): TWOCC;
-
-const
-  ICTYPE_VIDEO                = $63646976;  {vidc}
-  ICTYPE_AUDIO                = $63647561;  {audc}
-
-const
-  ICERR_OK                    = 0 ;
-  ICERR_DONTDRAW              = 1 ;
-  ICERR_NEWPALETTE            = 2 ;
-  ICERR_GOTOKEYFRAME          = 3 ;
-  ICERR_STOPDRAWING           = 4 ;
-
-  ICERR_UNSUPPORTED           = -1 ;
-  ICERR_BADFORMAT             = -2 ;
-  ICERR_MEMORY                = -3 ;
-  ICERR_INTERNAL              = -4 ;
-  ICERR_BADFLAGS              = -5 ;
-  ICERR_BADPARAM              = -6 ;
-  ICERR_BADSIZE               = -7 ;
-  ICERR_BADHANDLE             = -8 ;
-  ICERR_CANTUPDATE            = -9 ;
-  ICERR_ABORT                 = -10 ;
-  ICERR_ERROR                 = -100 ;
-  ICERR_BADBITDEPTH           = -200 ;
-  ICERR_BADIMAGESIZE          = -201 ;
-
-  ICERR_CUSTOM                = -400 ;    // errors less than ICERR_CUSTOM...
-
-//-- Values for dwFlags of ICOpen() ----
-
-  ICMODE_COMPRESS             = 1 ;
-  ICMODE_DECOMPRESS           = 2 ;
-  ICMODE_FASTDECOMPRESS       = 3 ;
-  ICMODE_QUERY                = 4 ;
-  ICMODE_FASTCOMPRESS         = 5 ;
-  ICMODE_DRAW                 = 8 ;
-
-//-- Flags for AVI file index -------------------------------------------------
-
-  AVIIF_LIST                  = $00000001 ;
-  AVIIF_TWOCC                 = $00000002 ;
-  AVIIF_KEYFRAME              = $00000010 ;
-
-//-- quality flags ------------------------------------------------------------
-
-  ICQUALITY_LOW               = 0 ;
-  ICQUALITY_HIGH              = 10000 ;
-  ICQUALITY_DEFAULT           = -1 ;
-
-//*****************************
-
-  ICM_USER                    = (DRV_USER+$0000) ;
-
-  ICM_RESERVED_LOW            = (DRV_USER+$1000) ;
-  ICM_RESERVED_HIGH           = (DRV_USER+$2000) ;
-  ICM_RESERVED                = ICM_RESERVED_LOW ;
-
-
-//    messages.
-
-  ICM_GETSTATE                = (ICM_RESERVED+0) ;    // Get compressor state
-  ICM_SETSTATE                = (ICM_RESERVED+1) ;    // Set compressor state
-  ICM_GETINFO                 = (ICM_RESERVED+2) ;    // Query info about the compressor
-
-  ICM_CONFIGURE               = (ICM_RESERVED+10);    // show the configure dialog
-  ICM_ABOUT                   = (ICM_RESERVED+11);    // show the about box
-
-  ICM_GETDEFAULTQUALITY       = (ICM_RESERVED+30);    // get the default value for quality
-  ICM_GETQUALITY              = (ICM_RESERVED+31);    // get the current value for quality
-  ICM_SETQUALITY              = (ICM_RESERVED+32);    // set the default value for quality
-
-  ICM_SET                     = (ICM_RESERVED+40);    // Tell the driver something
-  ICM_GET                     = (ICM_RESERVED+41);    // Ask the driver something
-
-{-- Constants for ICM_SET: ---------------------------------------------------}
-
-  ICM_FRAMERATE               = $526D7246;  {FrmR}
-  ICM_KEYFRAMERATE            = $5279654B;  {KeyR}
-
-(******************************
-
-    ICM specific messages.
-
-*****************************)
-
-  ICM_COMPRESS_GET_FORMAT     = (ICM_USER+4)  ;   // get compress format or size
-  ICM_COMPRESS_GET_SIZE       = (ICM_USER+5)  ;   // get output size
-  ICM_COMPRESS_QUERY          = (ICM_USER+6)  ;   // query support for compress
-  ICM_COMPRESS_BEGIN          = (ICM_USER+7)  ;   // begin a series of compress calls.
-  ICM_COMPRESS                = (ICM_USER+8)  ;   // compress a frame
-  ICM_COMPRESS_END            = (ICM_USER+9)  ;   // end of a series of compress calls.
-
-  ICM_DECOMPRESS_GET_FORMAT   = (ICM_USER+10) ;   // get decompress format or size
-  ICM_DECOMPRESS_QUERY        = (ICM_USER+11) ;   // query support for dempress
-  ICM_DECOMPRESS_BEGIN        = (ICM_USER+12) ;   // start a series of decompress calls
-  ICM_DECOMPRESS              = (ICM_USER+13) ;   // decompress a frame
-  ICM_DECOMPRESS_END          = (ICM_USER+14) ;   // end a series of decompress calls
-  ICM_DECOMPRESS_SET_PALETTE  = (ICM_USER+29) ;   // fill in the DIB color table
-  ICM_DECOMPRESS_GET_PALETTE  = (ICM_USER+30) ;   // fill in the DIB color table
-
-  ICM_DRAW_QUERY              = (ICM_USER+31) ;   // query support for dempress
-  ICM_DRAW_BEGIN              = (ICM_USER+15) ;   // start a series of draw calls
-  ICM_DRAW_GET_PALETTE        = (ICM_USER+16) ;   // get the palette needed for drawing
-  ICM_DRAW_START              = (ICM_USER+18) ;   // start decompress clock
-  ICM_DRAW_STOP               = (ICM_USER+19) ;   // stop decompress clock
-  ICM_DRAW_END                = (ICM_USER+21) ;   // end a series of draw calls
-  ICM_DRAW_GETTIME            = (ICM_USER+32) ;   // get value of decompress clock
-  ICM_DRAW                    = (ICM_USER+33) ;   // generalized "render" message
-  ICM_DRAW_WINDOW             = (ICM_USER+34) ;   // drawing window has moved or hidden
-  ICM_DRAW_SETTIME            = (ICM_USER+35) ;   // set correct value for decompress clock
-  ICM_DRAW_REALIZE            = (ICM_USER+36) ;   // realize palette for drawing
-  ICM_DRAW_FLUSH              = (ICM_USER+37) ;   // clear out buffered frames
-  ICM_DRAW_RENDERBUFFER       = (ICM_USER+38) ;   // draw undrawn things in queue
-
-  ICM_DRAW_START_PLAY         = (ICM_USER+39) ;   // start of a play
-  ICM_DRAW_STOP_PLAY          = (ICM_USER+40) ;   // end of a play
-
-  ICM_DRAW_SUGGESTFORMAT      = (ICM_USER+50) ;   // Like ICGetDisplayFormat
-  ICM_DRAW_CHANGEPALETTE      = (ICM_USER+51) ;   // for animating palette
-
-  ICM_GETBUFFERSWANTED        = (ICM_USER+41) ;   // ask about prebuffering
-
-  ICM_GETDEFAULTKEYFRAMERATE  = (ICM_USER+42) ;   // get the default value for key frames
-
-  ICM_DECOMPRESSEX_BEGIN      = (ICM_USER+60) ;   // start a series of decompress calls
-  ICM_DECOMPRESSEX_QUERY      = (ICM_USER+61) ;   // start a series of decompress calls
-  ICM_DECOMPRESSEX            = (ICM_USER+62) ;   // decompress a frame
-  ICM_DECOMPRESSEX_END        = (ICM_USER+63) ;   // end a series of decompress calls
-
-  ICM_COMPRESS_FRAMES_INFO    = (ICM_USER+70) ;   // tell about compress to come
-  ICM_SET_STATUS_PROC         = (ICM_USER+72) ;   // set status callback
-
-//*****************************
-
-type
-  PICOPEN = ^TICOPEN;
-  TICOPEN = packed record
-    dwSize                  : DWORD   ; // sizeof(ICOPEN)
-    fccType                 : DWORD   ; // 'vidc'
-    fccHandler              : DWORD   ; //
-    dwVersion               : DWORD   ; // version of compman opening you
-    dwFlags                 : DWORD   ; // LOWORD is type specific
-    dwError                 : DWORD   ; // error return.
-    pV1Reserved             : PVOID   ; // Reserved
-    pV2Reserved             : PVOID   ; // Reserved
-    dnDevNode               : DWORD   ; // Devnode for PnP devices
-  end;
-
-//*****************************
-
-  PICINFO = ^TICINFO;
-  TICINFO = packed record
-    dwSize                  : DWORD;    // sizeof(ICINFO)
-    fccType                 : DWORD;    // compressor type     'vidc' 'audc'
-    fccHandler              : DWORD;    // compressor sub-type 'rle ' 'jpeg' 'pcm '
-    dwFlags                 : DWORD;    // flags LOWORD is type specific
-    dwVersion               : DWORD;    // version of the driver
-    dwVersionICM            : DWORD;    // version of the ICM used
-    //
-    // under Win32, the driver always returns UNICODE strings.
-    //
-    szName                  : array[0..15] of WChar  ; // short name
-    szDescription           : array[0..127] of WChar ; // DWORD name
-    szDriver                : array[0..127] of WChar ; // driver that contains compressor
-  end;
-
-//-- Flags for the <dwFlags> field of the <ICINFO> structure. ------------
-
-const
-  VIDCF_QUALITY               = $0001 ;  // supports quality
-  VIDCF_CRUNCH                = $0002 ;  // supports crunching to a frame size
-  VIDCF_TEMPORAL              = $0004 ;  // supports inter-frame compress
-  VIDCF_COMPRESSFRAMES        = $0008 ;  // wants the compress all frames message
-  VIDCF_DRAW                  = $0010 ;  // supports drawing
-  VIDCF_FASTTEMPORALC         = $0020 ;  // does not need prev frame on compress
-  VIDCF_FASTTEMPORALD         = $0080 ;  // does not need prev frame on decompress
-  //VIDCF_QUALITYTIME         = $0040 ;  // supports temporal quality
-
-  //VIDCF_FASTTEMPORAL        = (VIDCF_FASTTEMPORALC or VIDCF_FASTTEMPORALD)
-
-//*****************************
-
-  ICCOMPRESS_KEYFRAME         = $00000001;
-
-type
-  PICCOMPRESS = ^TICCOMPRESS;
-  TICCOMPRESS = packed record
-    dwFlags                 : DWORD;                // flags
-
-    lpbiOutput              : PBITMAPINFOHEADER ;   // output format
-    lpOutput                : PVOID ;               // output data
-
-    lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
-    lpInput                 : PVOID ;               // frame data to compress
-
-    lpckid                  : PDWORD ;              // ckid for data in AVI file
-    lpdwFlags               : PDWORD;               // flags in the AVI index.
-    lFrameNum               : LONG ;               // frame number of seq.
-    dwFrameSize             : DWORD ;               // reqested size in bytes. (if non zero)
-
-    dwQuality               : DWORD ;               // quality
-
-    // these are new fields
-
-    lpbiPrev                : PBITMAPINFOHEADER ;   // format of previous frame
-    lpPrev                  : PVOID ;               // previous frame
-  end;
-
-//*****************************
-
-const
-  ICCOMPRESSFRAMES_PADDING    = $00000001 ;
-
-type
-  TICCompressProc    = function(lInputOutput: LPARAM; lFrame: DWORD; lpBits: PVOID; len: LONG): LONG; stdcall;
-
-  PICCOMPRESSFRAMES  = ^TICCOMPRESSFRAMES;
-  TICCOMPRESSFRAMES  = packed record
-    dwFlags                 : DWORD ;               // flags
-
-    lpbiOutput              : PBITMAPINFOHEADER ;   // output format
-    lOutput                 : LPARAM ;              // output identifier
-
-    lpbiInput               : PBITMAPINFOHEADER ;   // format of frame to compress
-    lInput                  : LPARAM ;              // input identifier
-
-    lStartFrame             : LONG ;                // start frame
-    lFrameCount             : LONG ;                // # of frames
-
-    lQuality                : LONG ;                // quality
-    lDataRate               : LONG ;                // data rate
-    lKeyRate                : LONG ;                // key frame rate
-
-    dwRate                  : DWORD ;               // frame rate, as always
-    dwScale                 : DWORD ;
-
-    dwOverheadPerFrame      : DWORD ;
-    dwReserved2             : DWORD ;
-
-    GetData                 : TICCompressProc;
-    PutData                 : TICCompressProc;
-  end;
-
-//-- Messages for Status callback ---------------------------------------------
-
-const
-    ICSTATUS_START              = 0 ;
-    ICSTATUS_STATUS             = 1 ;   // l = % done
-    ICSTATUS_END                = 2 ;
-    ICSTATUS_ERROR              = 3 ;   // l = error string (LPSTR)
-    ICSTATUS_YIELD              = 4 ;
-
-type
-  // return nonzero means abort operation in progress
-  TICStatusProc    = function(lParam: LPARAM; message: UINT; l: LONG): LONG; stdcall;
-
-  PICSETSTATUSPROC = ^TICSETSTATUSPROC;
-  TICSETSTATUSPROC = packed record
-    dwFlags                 : DWORD ;
-    lParam                  : LPARAM ;
-    Status                  : TICStatusProc;
-  end;
-
-//*****************************
-
-const
-    ICDECOMPRESS_HURRYUP        = $80000000 ;   // don't draw just buffer (hurry up!)
-    ICDECOMPRESS_UPDATE         = $40000000 ;   // don't draw just update screen
-    ICDECOMPRESS_PREROLL        = $20000000 ;   // this frame is before real start
-    ICDECOMPRESS_NULLFRAME      = $10000000 ;   // repeat last frame
-    ICDECOMPRESS_NOTKEYFRAME    = $08000000 ;   // this frame is not a key frame
-
-type
-  PICDECOMPRESS = ^TICDECOMPRESS;
-  TICDECOMPRESS = packed record
-    dwFlags                 : DWORD ;               // flags (from AVI index...)
-    lpbiInput               : PBITMAPINFOHEADER ;   // BITMAPINFO of compressed data
-                                                        // biSizeImage has the chunk size
-    lpInput                 : PVOID ;               // compressed data
-    lpbiOutput              : PBITMAPINFOHEADER ;   // DIB to decompress to
-    lpOutput                : PVOID ;
-    ckid                    : DWORD ;               // ckid from AVI file
-  end;
-
-  PICDECOMPRESSEX = ^TICDECOMPRESSEX;
-  TICDECOMPRESSEX = packed record
-
-    //
-    // same as ICM_DECOMPRESS
-    //
-
-    dwFlags                 : DWORD;
-    lpbiSrc                 : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
-    lpSrc                   : PVOID;                // compressed data
-    lpbiDst                 : PBITMAPINFOHEADER;    // DIB to decompress to
-    lpDst                   : PVOID;                // output data
-
-    //
-    // new for ICM_DECOMPRESSEX
-    //
-
-    xDst                    : int; // destination rectangle
-    yDst                    : int;
-    dxDst                   : int;
-    dyDst                   : int;
-
-    xSrc                    : int; // source rectangle
-    ySrc                    : int;
-    dxSrc                   : int;
-    dySrc                   : int;
-  end;
-
-//*****************************
-
-const
-    ICDRAW_QUERY                = $00000001 ; // test for support
-    ICDRAW_FULLSCREEN           = $00000002 ; // draw to full screen
-    ICDRAW_HDC                  = $00000004 ; // draw to a HDC/HWND
-    ICDRAW_ANIMATE              = $00000008 ;   // expect palette animation
-    ICDRAW_CONTINUE             = $00000010 ;   // draw is a continuation of previous draw
-    ICDRAW_MEMORYDC             = $00000020 ;   // DC is offscreen, by the way
-    ICDRAW_UPDATING             = $00000040 ;   // We're updating, as opposed to playing
-    ICDRAW_RENDER               = $00000080 ; // used to render data not draw it
-    ICDRAW_BUFFER               = $00000100 ; // please buffer this data offscreen, we will need to update it
-
-type
-  PICDRAWBEGIN = ^TICDRAWBEGIN;
-  TICDRAWBEGIN = packed record
-    dwFlags                 : DWORD ;       // flags
-
-    hpal                    : HPALETTE ;    // palette to draw with
-    hwnd                    : HWND ;        // window to draw to
-    hdc                     : HDC ;         // HDC to draw to
-
-    xDst                    : int ;         // destination rectangle
-    yDst                    : int ;
-    dxDst                   : int ;
-    dyDst                   : int ;
-
-    lpbi                    : PBITMAPINFOHEADER ;
-                                                // format of frame to draw
-
-    xSrc                    : int ;         // source rectangle
-    ySrc                    : int ;
-    dxSrc                   : int ;
-    dySrc                   : int ;
-
-    dwRate                  : DWORD ;       // frames/second = (dwRate/dwScale)
-    dwScale                 : DWORD ;
-  end;
-
-//*****************************
-
-const
-    ICDRAW_HURRYUP              = $80000000 ;   // don't draw just buffer (hurry up!)
-    ICDRAW_UPDATE               = $40000000 ;   // don't draw just update screen
-    ICDRAW_PREROLL              = $20000000 ;   // this frame is before real start
-    ICDRAW_NULLFRAME            = $10000000 ;   // repeat last frame
-    ICDRAW_NOTKEYFRAME          = $08000000 ;   // this frame is not a key frame
-
-type
-    PICDRAW                     = ^TICDRAW;
-    TICDRAW                     = packed record
-        dwFlags                 : DWORD ;   // flags
-        lpFormat                : PVOID ;   // format of frame to decompress
-        lpData                  : PVOID ;   // frame data to decompress
-        cbData                  : DWORD ;
-        lTime                   : LONG  ;   // time in drawbegin units (see dwRate and dwScale)
-    end;
-
-    PICDRAWSUGGEST              = ^TICDRAWSUGGEST;
-    TICDRAWSUGGEST              = packed record
-        lpbiIn                  : PBITMAPINFOHEADER ;   // format to be drawn
-        lpbiSuggest             : PBITMAPINFOHEADER ;   // location for suggested format (or NULL to get size)
-        dxSrc                   : int ;                 // source extent or 0
-        dySrc                   : int ;
-        dxDst                   : int ;                 // dest extent or 0
-        dyDst                   : int ;
-        hicDecompressor         : HIC ;                 // decompressor you can talk to
-    end;
-
-//*****************************
-
-    PICPALETTE                  = ^TICPALETTE;
-    TICPALETTE                  = packed record
-        dwFlags                 : DWORD ;           // flags (from AVI index...)
-        iStart                  : int ;             // first palette to change
-        iLen                    : int ;             // count of entries to change.
-        lppe                    : PPALETTEENTRY ;   // palette
-    end;
-
-//    ICM function declarations
-
-function    ICInfo(fccType, fccHandler: DWORD; lpicinfo: PICINFO) : BOOL ; stdcall ;
-function    ICInstall(fccType, fccHandler: DWORD; lParam: LPARAM; szDesc: LPSTR; wFlags: UINT) : BOOL ; stdcall ;
-function    ICRemove(fccType, fccHandler: DWORD; wFlags: UINT) : BOOL ; stdcall ;
-function    ICGetInfo(hic: HIC; picinfo: PICINFO; cb: DWORD) : DWORD ; stdcall ;
-
-function    ICOpen(fccType, fccHandler: DWORD; wMode: UINT) : HIC ; stdcall ;
-function    ICOpenFunction(fccType, fccHandler: DWORD; wMode: UINT; lpfnHandler: TFarProc) : HIC ; stdcall ;
-function    ICClose(hic: HIC) : DWORD; stdcall ;
-
-function    ICSendMessage(hic: HIC; msg: UINT; dw1, dw2: DWORD) : DWORD ; stdcall ;
-
-//-- Values for wFlags of ICInstall -------------------------------------------
-
-const
-    ICINSTALL_UNICODE           = $8000 ;
-
-    ICINSTALL_FUNCTION          = $0001 ; // lParam is a DriverProc (function ptr)
-    ICINSTALL_DRIVER            = $0002 ; // lParam is a driver name (string)
-    ICINSTALL_HDRV              = $0004 ; // lParam is a HDRVR (driver handle)
-
-    ICINSTALL_DRIVERW           = $8002 ; // lParam is a unicode driver name
-
-//-- Query macros -------------------------------------------------------------
-
-    ICMF_CONFIGURE_QUERY        = $00000001 ;
-    ICMF_ABOUT_QUERY            = $00000001 ;
-
-function    ICQueryAbout(hic: HIC): BOOL;
-function    ICAbout(hic: HIC; hwnd: HWND): DWORD;
-function    ICQueryConfigure(hic: HIC): BOOL;
-function    ICConfigure(hic: HIC; hwnd: HWND): DWORD;
-
-//-- Get/Set state macros -----------------------------------------------------
-
-function    ICGetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
-function    ICSetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
-function    ICGetStateSize(hic: HIC): DWORD;
-
-{-- Get value macros ---------------------------------------------------------}
-
-function    ICGetDefaultQuality(hic: HIC): DWORD;
-function    ICGetDefaultKeyFrameRate(hic: HIC): DWORD;
-
-{-- Draw window macro --------------------------------------------------------}
-
-function    ICDrawWindow(hic: HIC; prc: PRECT): DWORD;
-
-//    compression functions
-
-(*
- *  ICCompress()
- *
- *  compress a single frame
- *
- *)
-function ICCompress(
-    hic             : HIC;
-    dwFlags         : DWORD;                // flags
-    lpbiOutput      : PBITMAPINFOHEADER;    // output format
-    lpData          : PVOID;                // output data
-    lpbiInput       : PBITMAPINFOHEADER;    // format of frame to compress
-    lpBits          : PVOID;                // frame data to compress
-    lpckid          : PDWORD;               // ckid for data in AVI file
-    lpdwFlags       : PDWORD;               // flags in the AVI index.
-    lFrameNum       : DWORD;                 // frame number of seq.
-    dwFrameSize     : DWORD;                // reqested size in bytes. (if non zero)
-    dwQuality       : DWORD;                // quality within one frame
-    lpbiPrev        : PBITMAPINFOHEADER;    // format of previous frame
-    lpPrev          : PVOID                 // previous frame
-    ): DWORD; cdecl;
-
-(*
- *  ICCompressBegin()
- *
- *  start compression from a source format (lpbiInput) to a dest
- *  format (lpbiOuput) is supported.
- *
- *)
-
-function    ICCompressBegin(hic: HIC; lpbiInput: PBITMAPINFOHEADER; lpbiOutput: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICCompressQuery()
- *
- *  determines if compression from a source format (lpbiInput) to a dest
- *  format (lpbiOuput) is supported.
- *
- *)
-
-function    ICCompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICCompressGetFormat()
- *
- *  get the output format, (format of compressed data)
- *  if lpbiOutput is NULL return the size in bytes needed for format.
- *
- *)
-
-function    ICCompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-function    ICCompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICCompressSize()
- *
- *  return the maximal size of a compressed frame
- *
- *)
-
-function    ICCompressGetSize(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-function    ICCompressEnd(hic: HIC): DWORD;
-
-(******************************
-
-    decompression functions
-
-*****************************)
-
-(*
- *  ICDecompress()
- *
- *  decompress a single frame
- *
- *)
-
-function    ICDecompress(
-    hic             : HIC;
-    dwFlags         : DWORD;                // flags (from AVI index...)
-    lpbiFormat      : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
-                                            // biSizeImage has the chunk size
-    lpData          : PVOID;                // data
-    lpbi            : PBITMAPINFOHEADER;    // DIB to decompress to
-    lpBits          : PVOID
-    ): DWORD; cdecl;
-
-(*
- *  ICDecompressBegin()
- *
- *  start compression from a source format (lpbiInput) to a dest
- *  format (lpbiOutput) is supported.
- *
- *)
-
-function    ICDecompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICDecompressQuery()
- *
- *  determines if compression from a source format (lpbiInput) to a dest
- *  format (lpbiOutput) is supported.
- *
- *)
-
-function    ICDecompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICDecompressGetFormat()
- *
- *  get the output format, (format of un-compressed data)
- *  if lpbiOutput is NULL return the size in bytes needed for format.
- *
- *)
-
-function    ICDecompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-function    ICDecompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
-
-(*
- *  ICDecompressGetPalette()
- *
- *  get the output palette
- *
- *)
-
-function    ICDecompressGetPalette(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-function    ICDecompressSetPalette(hic: HIC; lpbiPalette: PBITMAPINFOHEADER): DWORD;
-
-function    ICDecompressEnd(hic: HIC): DWORD;
-
-(******************************
-
-    decompression (ex) functions
-
-*****************************)
-
-//
-// on Win16 these functions are macros that call ICMessage. ICMessage will
-// not work on NT. rather than add new entrypoints we have given
-// them as static inline functions
-//
-
-(*
- *  ICDecompressEx()
- *
- *  decompress a single frame
- *
- *)
-
-function    ICDecompressEx(
-    hic         : HIC;
-    dwFlags     : DWORD;
-    lpbiSrc     : PBITMAPINFOHEADER;
-    lpSrc       : PVOID;
-    xSrc        : int;
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    lpbiDst     : PBITMAPINFOHEADER;
-    lpDst       : PVOID;
-    xDst        : int;
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int
-    ): DWORD; stdcall;
-
-(*
- *  ICDecompressExBegin()
- *
- *  start compression from a source format (lpbiInput) to a dest
- *  format (lpbiOutput) is supported.
- *
- *)
-
-function    ICDecompressExBegin(
-    hic         : HIC;
-    dwFlags     : DWORD;
-    lpbiSrc     : PBITMAPINFOHEADER;
-    lpSrc       : PVOID;
-    xSrc        : int;
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    lpbiDst     : PBITMAPINFOHEADER;
-    lpDst       : PVOID;
-    xDst        : int;
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int
-    ): DWORD; stdcall;
-
-(*
- *  ICDecompressExQuery()
- *)
-
-function    ICDecompressExQuery(
-    hic         : HIC;
-    dwFlags     : DWORD;
-    lpbiSrc     : PBITMAPINFOHEADER;
-    lpSrc       : PVOID;
-    xSrc        : int;
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    lpbiDst     : PBITMAPINFOHEADER;
-    lpDst       : PVOID;
-    xDst        : int;
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int
-    ): DWORD; stdcall;
-
-function ICDecompressExEnd(hic: HIC): DWORD;
-
-(******************************
-
-    drawing functions
-
-*****************************)
-
-(*
- *  ICDrawBegin()
- *
- *  start decompressing data with format (lpbiInput) directly to the screen
- *
- *  return zero if the decompressor supports drawing.
- *
- *)
-
-function    ICDrawBegin(
-    hic         : HIC;
-    dwFlags     : DWORD;                // flags
-    hpal        : HPALETTE;             // palette to draw with
-    hwnd        : HWND;                 // window to draw to
-    hdc         : HDC;                  // HDC to draw to
-    xDst        : int;                  // destination rectangle
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;    // format of frame to draw
-    xSrc        : int;                  // source rectangle
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    dwRate      : DWORD;                // frames/second = (dwRate/dwScale)
-    dwScale     : DWORD
-    ): DWORD; cdecl;
-
-(*
- *  ICDraw()
- *
- *  decompress data directly to the screen
- *
- *)
-
-function    ICDraw(
-    hic         : HIC;
-    dwFlags     : DWORD;                // flags
-    lpFormat    : PVOID;                // format of frame to decompress
-    lpData      : PVOID;                // frame data to decompress
-    cbData      : DWORD;                // size of data
-    lTime       : DWORD                  // time to draw this frame
-    ): DWORD; cdecl;
-
-// ICMessage is not supported on Win32, so provide a static inline function
-// to do the same job
-function    ICDrawSuggestFormat(
-    hic         : HIC;
-    lpbiIn      : PBITMAPINFOHEADER;
-    lpbiOut     : PBITMAPINFOHEADER;
-    dxSrc       : int;
-    dySrc       : int;
-    dxDst       : int;
-    dyDst       : int;
-    hicDecomp   : HIC
-    ): DWORD; stdcall;
-
-(*
- *  ICDrawQuery()
- *
- *  determines if the compressor is willing to render the specified format.
- *
- *)
-
-function    ICDrawQuery(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
-function    ICDrawChangePalette(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
-function    ICGetBuffersWanted(hic: HIC; lpdwBuffers: PDWORD): DWORD;
-function    ICDrawEnd(hic: HIC): DWORD;
-function    ICDrawStart(hic: HIC): DWORD;
-function    ICDrawStartPlay(hic: HIC; lFrom, lTo: DWORD): DWORD;
-function    ICDrawStop(hic: HIC): DWORD;
-function    ICDrawStopPlay(hic: HIC): DWORD;
-function    ICDrawGetTime(hic: HIC; lplTime: PDWORD): DWORD;
-function    ICDrawSetTime(hic: HIC; lTime: DWORD): DWORD;
-function    ICDrawRealize(hic: HIC; hdc: HDC; fBackground: BOOL): DWORD;
-function    ICDrawFlush(hic: HIC): DWORD;
-function    ICDrawRenderBuffer(hic: HIC): DWORD;
-
-(******************************
-
-    Status callback functions
-
-*************************************************************************)
-
-(*
- *  ICSetStatusProc()
- *
- *  Set the status callback function
- *
- *)
-
-
-// ICMessage is not supported on NT
-function    ICSetStatusProc(
-    hic         : HIC;
-    dwFlags     : DWORD;
-    lParam      : DWORD;
-    fpfnStatus  : TICStatusProc
-    ): DWORD; stdcall;
-
-
-//helper routines for DrawDib and MCIAVI...
-
-function    ICLocate(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER; wFlags: WORD): HIC; stdcall;
-function    ICGetDisplayFormat(hic: HIC; lpbiIn, lpbiOut: PBITMAPINFOHEADER; BitDepth: int; dx, dy: int): HIC; stdcall;
-
-function    ICDecompressOpen(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER): HIC;
-function    ICDrawOpen(fccType, fccHandler: DWORD; lpbiIn: PBITMAPINFOHEADER): HIC;
-
-(******************************
-Higher level functions
-*****************************)
-
-function    ICImageCompress(
-    hic         : HIC;                  // compressor to use
-    uiFlags     : UINT;                 // flags (none yet)
-    lpbiIn      : PBITMAPINFO;          // format to compress from
-    lpBits      : PVOID;                // data to compress
-    lpbiOut     : PBITMAPINFO;          // compress to this (NULL ==> default)
-    lQuality    : LONG;                 // quality to use
-    plSize      : PDWORD                 // compress to this size (0=whatever)
-    ): THANDLE; stdcall;
-
-function    ICImageDecompress(
-    hic         : HIC;                  // compressor to use
-    uiFlags     : UINT;                 // flags (none yet)
-    lpbiIn      : PBITMAPINFO;          // format to decompress from
-    lpBits      : PVOID;                // data to decompress
-    lpbiOut     : PBITMAPINFO           // decompress to this (NULL ==> default)
-    ): THANDLE; stdcall;
-
-{-- TCompVars ----------------------------------------------------------------}
-
-//
-// Structure used by ICSeqCompressFrame and ICCompressorChoose routines
-// Make sure this matches the autodoc in icm.c!
-//
-
-type
-  PCOMPVARS       = ^TCOMPVARS;
-  TCOMPVARS       = packed record
-        cbSize      : DWORD;            // set to sizeof(COMPVARS) before
-                                        // calling ICCompressorChoose
-        dwFlags     : DWORD;            // see below...
-        hic         : HIC;              // HIC of chosen compressor
-        fccType     : DWORD;            // basically ICTYPE_VIDEO
-        fccHandler  : DWORD;            // handler of chosen compressor or
-                                        // "" or "DIB "
-        lpbiIn      : PBITMAPINFO;      // input format
-        lpbiOut     : PBITMAPINFO;      // output format - will compress to this
-        lpBitsOut   : PVOID;
-        lpBitsPrev  : PVOID;
-        lFrame      : LONG;
-        lKey        : LONG;             // key frames how often?
-        lDataRate   : LONG;             // desired data rate KB/Sec
-        lQ          : LONG;             // desired quality
-        lKeyCount   : LONG;
-        lpState     : PVOID;            // state of compressor
-        cbState     : LONG;             // size of the state
-    end;
-
-// FLAGS for dwFlags element of COMPVARS structure:
-// set this flag if you initialize COMPVARS before calling ICCompressorChoose
-
-const
-    ICMF_COMPVARS_VALID         = $00000001;    // COMPVARS contains valid data
-
-//
-//  allows user to choose compressor, quality etc...
-//
-function    ICCompressorChoose(
-    hwnd        : HWND;                     // parent window for dialog
-    uiFlags     : UINT;                     // flags
-    pvIn        : PVOID;                    // input format (optional)
-    lpData      : PVOID;                    // input data (optional)
-    pc          : PCOMPVARS;                // data about the compressor/dlg
-    lpszTitle   : LPSTR                     // dialog title (optional)
-    ): BOOL; stdcall;
-
-// defines for uiFlags
-
-const
-    ICMF_CHOOSE_KEYFRAME        = $0001;    // show KeyFrame Every box
-    ICMF_CHOOSE_DATARATE        = $0002;    // show DataRate box
-    ICMF_CHOOSE_PREVIEW         = $0004;    // allow expanded preview dialog
-    ICMF_CHOOSE_ALLCOMPRESSORS  = $0008;    // don't only show those that
-                                            // can handle the input format
-                                            // or input data
-
-function    ICSeqCompressFrameStart(pc: PCOMPVARS; lpbiIn: PBITMAPINFO): BOOL; stdcall;
-procedure   ICSeqCompressFrameEnd(pc: PCOMPVARS); stdcall;
-
-function    ICSeqCompressFrame(
-    pc          : PCOMPVARS;                // set by ICCompressorChoose
-    uiFlags     : UINT;                     // flags
-    lpBits      : PVOID;                    // input DIB bits
-    pfKey       : PBOOL;                    // did it end up being a key frame?
-    plSize      : PDWORD                     // size to compress to/of returned image
-    ): PVOID; stdcall;
-
-procedure   ICCompressorFree(pc: PCOMPVARS); stdcall;
-
-
-(********************************
- *
- *  DRAWDIB - Routines for drawing to the display.
- *
- ******************************)
-
-type
-    HDRAWDIB                    = THandle;  // hdd
-
-(***************************
-
-  DrawDib Flags
-
-***************************)
-
-const
-    DDF_UPDATE                  = $0002;    // re-draw the last DIB
-    DDF_SAME_HDC                = $0004;    // HDC same as last call (all setup)
-    DDF_SAME_DRAW               = $0008;    // draw params are the same
-    DDF_DONTDRAW                = $0010;    // dont draw frame, just decompress
-    DDF_ANIMATE                 = $0020;    // allow palette animation
-    DDF_BUFFER                  = $0040;    // always buffer image
-    DDF_JUSTDRAWIT              = $0080;    // just draw it with GDI
-    DDF_FULLSCREEN              = $0100;    // use DisplayDib
-    DDF_BACKGROUNDPAL           = $0200;    // Realize palette in background
-    DDF_NOTKEYFRAME             = $0400;    // this is a partial frame update, hint
-    DDF_HURRYUP                 = $0800;    // hurry up please!
-    DDF_HALFTONE                = $1000;    // always halftone
-
-    DDF_PREROLL                 = DDF_DONTDRAW; // Builing up a non-keyframe
-    DDF_SAME_DIB                = DDF_SAME_DRAW;
-    DDF_SAME_SIZE               = DDF_SAME_DRAW;
-
-(***************************
-
-    DrawDib functions
-
-**************************)
-
-{-- DrawDibOpen() ------------------------------------------------------------}
-
-function    DrawDibOpen: HDRAWDIB; stdcall;
-
-{-- DrawDibClose() -----------------------------------------------------------}
-
-function    DrawDibClose(hdd: HDRAWDIB): BOOL; stdcall;
-
-{-- DrawDibGetBuffer() -------------------------------------------------------}
-
-function    DrawDibGetBuffer(hdd: HDRAWDIB; lpbi: PBITMAPINFOHEADER; dwSize: DWORD; dwFlags: DWORD): PVOID; stdcall;
-
-{-- DrawDibGetPalette() - get the palette used for drawing DIBs --------------}
-
-function    DrawDibGetPalette(hdd: HDRAWDIB): HPALETTE; stdcall;
-
-{-- DrawDibSetPalette() - set the palette used for drawing DIBs --------------}
-
-function    DrawDibSetPalette(hdd: HDRAWDIB; hpal: HPALETTE): BOOL; stdcall;
-
-{-- DrawDibChangePalette() ---------------------------------------------------}
-
-function    DrawDibChangePalette(hdd: HDRAWDIB; iStart, iLen: int; lppe: PPALETTEENTRY): BOOL; stdcall;
-
-{-- DrawDibRealize() - realize the palette in a HDD --------------------------}
-
-function    DrawDibRealize(hdd: HDRAWDIB; hdc: HDC; fBackground: BOOL): UINT; stdcall;
-
-{-- DrawDibStart() - start of streaming playback -----------------------------}
-
-function    DrawDibStart(hdd: HDRAWDIB; rate: DWORD): BOOL; stdcall;
-
-{-- DrawDibStop() - start of streaming playback ------------------------------}
-
-function    DrawDibStop(hdd: HDRAWDIB): BOOL; stdcall;
-
-{-- DrawDibBegin() - prepare to draw -----------------------------------------}
-
-function    DrawDibBegin(
-    hdd         : HDRAWDIB;
-    hdc         : HDC;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;
-    dxSrc       : int;
-    dySrc       : int;
-    wFlags      : UINT
-    ): BOOL; stdcall;
-
-{-- DrawDibDraw() - actually draw a DIB to the screen ------------------------}
-
-function    DrawDibDraw(
-    hdd         : HDRAWDIB;
-    hdc         : HDC;
-    xDst        : int;
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;
-    lpBits      : PVOID;
-    xSrc        : int;
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    wFlags      : UINT
-    ): BOOL; stdcall;
-
-{-- DrawDibUpdate() - redraw last image (may only be valid with DDF_BUFFER) --}
-
-function    DrawDibUpdate(hdd: HDRAWDIB; hdc: HDC; x, y: int): BOOL;
-
-{-- DrawDibEnd() -------------------------------------------------------------}
-
-function    DrawDibEnd(hdd: HDRAWDIB): BOOL; stdcall;
-
-{-- DrawDibTime() - for debugging purposes only ------------------------------}
-
-type
-    PDRAWDIBTIME        = ^TDRAWDIBTIME;
-    TDRAWDIBTIME        = packed record
-        timeCount       : LONG;
-        timeDraw        : LONG;
-        timeDecompress  : LONG;
-        timeDither      : LONG;
-        timeStretch     : LONG;
-        timeBlt         : LONG;
-        timeSetDIBits   : LONG;
-    end;
-
-function    DrawDibTime(hdd: HDRAWDIB; lpddtime: PDRAWDIBTIME): BOOL; stdcall;
-
-{-- Display profiling --------------------------------------------------------}
-
-const
-    PD_CAN_DRAW_DIB             = $0001;    // if you can draw at all
-    PD_CAN_STRETCHDIB           = $0002;    // basicly RC_STRETCHDIB
-    PD_STRETCHDIB_1_1_OK        = $0004;    // is it fast?
-    PD_STRETCHDIB_1_2_OK        = $0008;    // ...
-    PD_STRETCHDIB_1_N_OK        = $0010;    // ...
-
-function    DrawDibProfileDisplay(lpbi: PBITMAPINFOHEADER): DWORD; stdcall;
-
-(**********************************
- *
- *  AVIFMT - AVI file format definitions
- *
- *********************************)
-
-//
-// The following is a short description of the AVI file format.  Please
-// see the accompanying documentation for a full explanation.
-//
-// An AVI file is the following RIFF form:
-//
-//  RIFF('AVI'
-//        LIST('hdrl'
-//          avih(<MainAVIHeader>)
-//                  LIST ('strl'
-//                      strh(<Stream header>)
-//                      strf(<Stream format>)
-//                      ... additional header data
-//            LIST('movi'
-//            { LIST('rec'
-//                    SubChunk...
-//                 )
-//                | SubChunk } ....
-//            )
-//            [ <AVIIndex> ]
-//      )
-//
-//  The main file header specifies how many streams are present.  For
-//  each one, there must be a stream header chunk and a stream format
-//  chunk, enlosed in a 'strl' LIST chunk.  The 'strf' chunk contains
-//  type-specific format information; for a video stream, this should
-//  be a BITMAPINFO structure, including palette.  For an audio stream,
-//  this should be a WAVEFORMAT (or PCMWAVEFORMAT) structure.
-//
-//  The actual data is contained in subchunks within the 'movi' LIST
-//  chunk.  The first two characters of each data chunk are the
-//  stream number with which that data is associated.
-//
-//  Some defined chunk types:
-//           Video Streams:
-//                  ##db:   RGB DIB bits
-//                  ##dc:   RLE8 compressed DIB bits
-//                  ##pc:   Palette Change
-//
-//           Audio Streams:
-//                  ##wb:   waveform audio bytes
-//
-// The grouping into LIST 'rec' chunks implies only that the contents of
-//   the chunk should be read into memory at the same time.  This
-//   grouping is used for files specifically intended to be played from
-//   CD-ROM.
-//
-// The index chunk at the end of the file should contain one entry for
-//   each data chunk in the file.
-//
-// Limitations for the current software:
-//  Only one video stream and one audio stream are allowed.
-//  The streams must start at the beginning of the file.
-//
-//
-// To register codec types please obtain a copy of the Multimedia
-// Developer Registration Kit from:
-//
-//  Microsoft Corporation
-//  Multimedia Systems Group
-//  Product Marketing
-//  One Microsoft Way
-//  Redmond, WA 98052-6399
-//
-
-{-- form types, list types and chunk types -----------------------------------}
-
-const
-    formtypeAVI                 = $20495641; // mmioFOURCC('A', 'V', 'I', ' ')
-    listtypeAVIHEADER           = $6C726468; // mmioFOURCC('h', 'd', 'r', 'l')
-    ckidAVIMAINHDR              = $68697661; // mmioFOURCC('a', 'v', 'i', 'h')
-    listtypeSTREAMHEADER        = $6C727473; // mmioFOURCC('s', 't', 'r', 'l')
-    ckidSTREAMHEADER            = $68727473; // mmioFOURCC('s', 't', 'r', 'h')
-    ckidSTREAMFORMAT            = $66727473; // mmioFOURCC('s', 't', 'r', 'f')
-    ckidSTREAMHANDLERDATA       = $64727473; // mmioFOURCC('s', 't', 'r', 'd')
-    ckidSTREAMNAME              = $6E727473; // mmioFOURCC('s', 't', 'r', 'n')
-
-    listtypeAVIMOVIE            = $69766F6D; // mmioFOURCC('m', 'o', 'v', 'i')
-    listtypeAVIRECORD           = $20636572; // mmioFOURCC('r', 'e', 'c', ' ')
-
-    ckidAVINEWINDEX             = $31786469; // mmioFOURCC('i', 'd', 'x', '1')
-
-{-- Stream types for the <fccType> field of the stream header ----------------}
-
-    streamtypeVIDEO             = $73646976; // mmioFOURCC('v', 'i', 'd', 's')
-    streamtypeAUDIO             = $73647561; // mmioFOURCC('a', 'u', 'd', 's')
-    streamtypeMIDI              = $7364696D; // mmioFOURCC('m', 'i', 'd', 's')
-    streamtypeTEXT              = $73747874; // mmioFOURCC('t', 'x', 't', 's')
-
-{-- Basic chunk types --------------------------------------------------------}
-
-    cktypeDIBbits               = $6264; // aviTWOCC('d', 'b')
-    cktypeDIBcompressed         = $6364; // aviTWOCC('d', 'c')
-    cktypePALchange             = $6370; // aviTWOCC('p', 'c')
-    cktypeWAVEbytes             = $6277; // aviTWOCC('w', 'b')
-
-{-- Chunk id to use for extra chunks for padding -----------------------------}
-
-    ckidAVIPADDING              = $4B4E554A; // mmioFOURCC('J', 'U', 'N', 'K')
-
-(*
-** Useful macros
-**
-** Warning: These are nasty macro, and MS C 6.0 compiles some of them
-** incorrectly if optimizations are on.  Ack.
-*)
-
-{-- Macro to get stream number out of a FOURCC ckid --------------------------}
-
-function    FromHex(n: BYTE): BYTE;
-function    StreamFromFOURCC(fcc: DWORD): BYTE;
-
-{-- Macro to get TWOCC chunk type out of a FOURCC ckid -----------------------}
-
-function    TWOCCFromFOURCC(fcc: DWORD): WORD;
-
-{-- Macro to make a ckid for a chunk out of a TWOCC and a stream num (0-255) -}
-
-function    ToHex(n: BYTE): BYTE;
-function    MAKEAVICKID(tcc: WORD; stream: BYTE): DWORD;
-
-{-- Main AVI file header -----------------------------------------------------}
-
-{-- flags for use in <dwFlags> in AVIFileHdr ---------------------------------}
-
-const
-    AVIF_HASINDEX               = $00000010;    // Index at end of file?
-    AVIF_MUSTUSEINDEX           = $00000020;
-    AVIF_ISINTERLEAVED          = $00000100;
-    AVIF_TRUSTCKTYPE            = $00000800;    // Use CKType to find key frames?
-    AVIF_WASCAPTUREFILE         = $00010000;
-    AVIF_COPYRIGHTED            = $00020000;
-
-{-- The AVI File Header LIST chunk should be padded to this size -------------}
-
-const
-    AVI_HEADERSIZE              = 2048;         // size of AVI header list
-
-type
-    PMainAVIHeader              = ^TMainAVIHeader;
-    TMainAVIHeader              = packed record
-        dwMicroSecPerFrame      : DWORD;        // frame display rate (or 0L)
-        dwMaxBytesPerSec        : DWORD;        // max. transfer rate
-        dwPaddingGranularity    : DWORD;        // pad to multiples of this
-                                                // size; normally 2K.
-        dwFlags                 : DWORD;        // the ever-present flags
-        dwTotalFrames           : DWORD;        // # frames in file
-        dwInitialFrames         : DWORD;
-        dwStreams               : DWORD;
-        dwSuggestedBufferSize   : DWORD;
-
-        dwWidth                 : DWORD;
-        dwHeight                : DWORD;
-
-        dwReserved              : array[0..3] of DWORD;
-    end;
-
-{-- Stream header ------------------------------------------------------------}
-
-const
-    AVISF_DISABLED              = $00000001;
-
-    AVISF_VIDEO_PALCHANGES      = $00010000;
-
-type
-    PAVIStreamHeader            = ^TAVIStreamHeader;
-    TAVIStreamHeader            = packed record
-        fccType                 : FOURCC;
-        fccHandler              : FOURCC;
-        dwFlags                 : DWORD;        // Contains AVITF_* flags
-        wPriority               : WORD;
-        wLanguage               : WORD;
-        dwInitialFrames         : DWORD;
-        dwScale                 : DWORD;
-        dwRate                  : DWORD;        // dwRate / dwScale == samples/second
-        dwStart                 : DWORD;
-        dwLength                : DWORD;        // In units above...
-        dwSuggestedBufferSize   : DWORD;
-        dwQuality               : DWORD;
-        dwSampleSize            : DWORD;
-        rcFrame                 : TRECT;
-    end;
-
-{-- Flags for index ----------------------------------------------------------}
-
-const
-    AVIIF_NOTIME                = $00000100;    // this frame doesn't take any time
-    AVIIF_COMPUSE               = $0FFF0000;    // these bits are for compressor use
-
-type
-    PAVIINDEXENTRY              = ^TAVIINDEXENTRY;
-    TAVIINDEXENTRY              = packed record
-        ckid                    : DWORD;
-        dwFlags                 : DWORD;
-        dwChunkOffset           : DWORD;        // Position of chunk
-        dwChunkLength           : DWORD;        // Length of chunk
-    end;
-
-{-- Palette change chunk (used in video streams) -----------------------------}
-
-    PAVIPALCHANGE               = ^TAVIPALCHANGE;
-    TAVIPALCHANGE               = packed record
-        bFirstEntry             : BYTE;         // first entry to change
-        bNumEntries             : BYTE;         // # entries to change (0 if 256)
-        wFlags                  : WORD;         // Mostly to preserve alignment...
-        peNew                   : array[0..0] of TPALETTEENTRY; // New color specifications
-    end;
-
-(**********************************
- *
- *  AVIFile - routines for reading/writing standard AVI files
- *
- ********************************)
-
-//
-// Ansi - Unicode thunking.
-//
-// Unicode or Ansi-only apps can call the avifile APIs.
-// any Win32 app who wants to use
-// any of the AVI COM interfaces must be UNICODE - the AVISTREAMINFO and
-// AVIFILEINFO structures used in the Info methods of these interfaces are
-// the unicode variants, and no thunking to or from ansi takes place
-// except in the AVIFILE api entrypoints.
-//
-// For Ansi/Unicode thunking: for each entrypoint or structure that
-// uses chars or strings, two versions are declared in the Win32 version,
-// ApiNameW and ApiNameA. The default name ApiName is #defined to one or
-// other of these depending on whether UNICODE is defined (during
-// compilation of the app that is including this header). The source will
-// contain ApiName and ApiNameA (with ApiName being the Win16 implementation,
-// and also #defined to ApiNameW, and ApiNameA being the thunk entrypoint).
-//
-
-// For GetFrame::SetFormat - use the best format for the display
-
-const
-    AVIGETFRAMEF_BESTDISPLAYFMT = 1;
-
-//
-// Structures used by AVIStreamInfo & AVIFileInfo.
-//
-// These are related to, but not identical to, the header chunks
-// in an AVI file.
-//
-
-{-- AVISTREAMINFO ------------------------------------------------------------}
-
-// for Unicode/Ansi thunking we need to declare three versions of this!
-
-type
-    PAVIStreamInfoW             = ^TAVIStreamInfoW;
-    TAVIStreamInfoW             = packed record
-        fccType                 : DWORD;
-        fccHandler              : DWORD;
-        dwFlags                 : DWORD;        // Contains AVITF_* flags
-        dwCaps                  : DWORD;
-        wPriority               : WORD;
-        wLanguage               : WORD;
-        dwScale                 : DWORD;
-        dwRate                  : DWORD;        // dwRate / dwScale == samples/second
-        dwStart                 : DWORD;
-        dwLength                : DWORD;        // In units above...
-        dwInitialFrames         : DWORD;
-        dwSuggestedBufferSize   : DWORD;
-        dwQuality               : DWORD;
-        dwSampleSize            : DWORD;
-        rcFrame                 : TRECT;
-        dwEditCount             : DWORD;
-        dwFormatChangeCount     : DWORD;
-        szName                  : array[0..63] of WideChar;
-    end;
-
-    PAVIStreamInfoA             = ^TAVIStreamInfoA;
-    TAVIStreamInfoA             = packed record
-        fccType                 : DWORD;
-        fccHandler              : DWORD;
-        dwFlags                 : DWORD;        // Contains AVITF_* flags
-        dwCaps                  : DWORD;
-        wPriority               : WORD;
-        wLanguage               : WORD;
-        dwScale                 : DWORD;
-        dwRate                  : DWORD;        // dwRate / dwScale == samples/second
-        dwStart                 : DWORD;
-        dwLength                : DWORD;        // In units above...
-        dwInitialFrames         : DWORD;
-        dwSuggestedBufferSize   : DWORD;
-        dwQuality               : DWORD;
-        dwSampleSize            : DWORD;
-        rcFrame                 : TRECT;
-        dwEditCount             : DWORD;
-        dwFormatChangeCount     : DWORD;
-        szName                  : array[0..63] of AnsiChar;
-    end;
-
-  PAVIStreamInfo = ^TAVIStreamInfo;
-{$IFDEF UNICODE}
-  TAVIStreamInfo = TAVIStreamInfoW;
-{$ELSE}
-  TAVIStreamInfo = TAVIStreamInfoA;
-{$ENDIF}
-
-const
-    AVISTREAMINFO_DISABLED      = $00000001;
-    AVISTREAMINFO_FORMATCHANGES = $00010000;
-
-{-- AVIFILEINFO --------------------------------------------------------------}
-
-type
-    PAVIFileInfoW               = ^TAVIFileInfoW;
-    TAVIFileInfoW               = packed record
-        dwMaxBytesPerSec        : DWORD;        // max. transfer rate
-        dwFlags                 : DWORD;        // the ever-present flags
-        dwCaps                  : DWORD;
-        dwStreams               : DWORD;
-        dwSuggestedBufferSize   : DWORD;
-
-        dwWidth                 : DWORD;
-        dwHeight                : DWORD;
-
-        dwScale                 : DWORD;
-        dwRate                  : DWORD;        // dwRate / dwScale == samples/second
-        dwLength                : DWORD;
-
-        dwEditCount             : DWORD;
-
-        szFileType              : array[0..63] of WideChar;
-                                                // descriptive string for file type?
-    end;
-
-    PAVIFileInfoA               = ^TAVIFileInfoA;
-    TAVIFileInfoA               = packed record
-        dwMaxBytesPerSec        : DWORD;        // max. transfer rate
-        dwFlags                 : DWORD;        // the ever-present flags
-        dwCaps                  : DWORD;
-        dwStreams               : DWORD;
-        dwSuggestedBufferSize   : DWORD;
-
-        dwWidth                 : DWORD;
-        dwHeight                : DWORD;
-
-        dwScale                 : DWORD;
-        dwRate                  : DWORD;        // dwRate / dwScale == samples/second
-        dwLength                : DWORD;
-
-        dwEditCount             : DWORD;
-
-        szFileType              : array[0..63] of AnsiChar;
-                                                // descriptive string for file type?
-    end;
-
-  PAVIFileInfo = ^TAVIFileInfo;
-{$IFDEF UNICODE}
-  TAVIFileInfo = TAVIFileInfoW;
-{$ELSE}
-  TAVIFileInfo = TAVIFileInfoA;
-{$ENDIF}
-
-{-- Flags for dwFlags --------------------------------------------------------}
-
-const
-    AVIFILEINFO_HASINDEX            = $00000010;
-    AVIFILEINFO_MUSTUSEINDEX        = $00000020;
-    AVIFILEINFO_ISINTERLEAVED       = $00000100;
-    AVIFILEINFO_WASCAPTUREFILE      = $00010000;
-    AVIFILEINFO_COPYRIGHTED         = $00020000;
-
-{-- Flags for dwCaps ---------------------------------------------------------}
-
-    AVIFILECAPS_CANREAD             = $00000001;
-    AVIFILECAPS_CANWRITE            = $00000002;
-    AVIFILECAPS_ALLKEYFRAMES        = $00000010;
-    AVIFILECAPS_NOCOMPRESSION       = $00000020;
-
-type
-    TAVISAVECALLBACK                = function(i: int): BOOL; pascal;
-
-{-- AVICOMPRESSOPTIONS -------------------------------------------------------}
-
-// Make sure it matches the AutoDoc in avisave.c !!!
-
-type
-    PAVICOMPRESSOPTIONS             = ^TAVICOMPRESSOPTIONS;
-    TAVICOMPRESSOPTIONS             = packed record
-        fccType                     : DWORD;    // stream type, for consistency
-        fccHandler                  : DWORD;    // compressor
-        dwKeyFrameEvery             : DWORD;    // keyframe rate
-        dwQuality                   : DWORD;    // compress quality 0-10,000
-        dwBytesPerSecond            : DWORD;    // bytes per second
-        dwFlags                     : DWORD;    // flags... see below
-        lpFormat                    : PVOID;    // save format
-        cbFormat                    : DWORD;
-        lpParms                     : PVOID;    // compressor options
-        cbParms                     : DWORD;
-        dwInterleaveEvery           : DWORD;    // for non-video streams only
-    end;
-
-//
-// Defines for the dwFlags field of the AVICOMPRESSOPTIONS struct
-// Each of these flags determines if the appropriate field in the structure
-// (dwInterleaveEvery, dwBytesPerSecond, and dwKeyFrameEvery) is payed
-// attention to.  See the autodoc in avisave.c for details.
-//
-
-const
-    AVICOMPRESSF_INTERLEAVE         = $00000001;    // interleave
-    AVICOMPRESSF_DATARATE           = $00000002;    // use a data rate
-    AVICOMPRESSF_KEYFRAMES          = $00000004;    // use keyframes
-    AVICOMPRESSF_VALID              = $00000008;    // has valid data?
-
-(*	-	-	-	-	-	-	-	-	*/
-
-
-/****** AVI Stream Interface *******************************************)
-
-type
-    IAVIStream = interface(IUnknown)
-        function Create(lParam1, lParam2: LPARAM): HResult; stdcall;
-        function Info(var psi: TAVIStreamInfoW; lSize: LONG): HResult; stdcall;
-        function FindSample(lPos: LONG; lFlags: LONG): LONG; stdcall;
-        function ReadFormat(lPos: LONG; lpFormat: PVOID; var lpcbFormat: LONG): HResult; stdcall;
-        function SetFormat(lPos: LONG; lpFormat: PVOID; cbFormat: LONG): HResult; stdcall;
-        function Read(lStart: LONG; lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; var plBytes, plSamples: LONG): HResult; stdcall;
-        function Write(lStart: LONG; lSamples: LONG; lpBuffer: PVOID; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten, plBytesWritten: LONG): HResult; stdcall;
-        function Delete(lStart: LONG; lSamples: LONG): HResult; stdcall;
-        function ReadData(fcc: DWORD; lp: PVOID; var lpcb: LONG): HResult; stdcall;
-        function WriteData(fcc: DWORD; lp: PVOID; cb: LONG): HResult; stdcall;
-        function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; stdcall;
-    end;
-
-    IAVIStreaming = interface(IUnknown)
-        function _Begin(lStart, lEnd : LONG; lRate : LONG): HResult; stdcall;
-        function _End: HResult; stdcall;
-    end;
-
-    IAVIEditStream = interface(IUnknown)
-        function Cut(var plStart, plLength: LONG; var ppResult: IAVIStream): HResult; stdcall;
-        function Copy(var plStart, plLength: LONG; var ppResult: IAVIStream): HResult; stdcall;
-        function Paste(var plPos: LONG; var plLength: LONG; pstream: IAVIStream; lStart, lEnd: LONG): HResult; stdcall;
-        function Clone(var ppResult: IAVIStream): HResult; stdcall;
-        function SetInfo(var lpInfo: TAVIStreamInfoW; cbInfo: LONG): HResult; stdcall;
-    end;
-
-{-- AVIFile ------------------------------------------------------------------}
-
-    IAVIFile = interface(IUnknown)
-        function Info(var pfi: TAVIFileInfoW; iSize: LONG): HResult; stdcall;
-        function GetStream(var ppStream: IAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
-        function CreateStream(var ppStream: IAVISTREAM; var psi: TAVIStreamInfoW): HResult; stdcall;
-        function WriteData(ckid: DWORD; lpData: PVOID; cbData: LONG): HResult; stdcall;
-        function ReadData(ckid: DWORD; lpData: PVOID; lpcbData: PLONG): HResult; stdcall;
-        function EndRecord: HResult; stdcall;
-        function DeleteStream(fccType: DWORD; lParam: LONG): HResult; stdcall;
-    end;
-
-{-- GetFrame -----------------------------------------------------------------}
-
-     // The functions 'BeginExtraction' and 'EndExtraction' have actually
-     // the names 'Begin' and 'End', but we cannot use that identifiers for
-     // obvious reasons.
-
-     IGetFrame = interface(IUnknown)
-       function GetFrame(lPos: LONG): PBitmapInfoHeader; stdcall;
-       function BeginExtraction(lStart, lEnd, lRate: LONG): HResult; stdcall;
-       function EndExtraction: HResult; stdcall;
-       function SetFormat(var lpbi: TBitmapInfoHeader; lpBits: Pointer; x, y, dx, dy: Integer): HResult; stdcall;
-     end;
-
-{-- GUIDs --------------------------------------------------------------------}
-
-const
-    IID_IAVIFile      : TGUID = (D1: $00020020; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-    IID_IAVIStream    : TGUID = (D1: $00020021; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-    IID_IAVIStreaming : TGUID = (D1: $00020022; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-    IID_IGetFrame     : TGUID = (D1: $00020023; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-    IID_IAVIEditStream: TGUID = (D1: $00020024; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-
-    CLSID_AVISimpleUnMarshal : TGUID = (D1: $00020009; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-    CLSID_AVIFile            : TGUID = (D1: $00020000; D2: $0; D3: $0; D4:($C0,$0,$0,$0,$0,$0,$0,$46));
-
-    AVIFILEHANDLER_CANREAD          = $0001;
-    AVIFILEHANDLER_CANWRITE         = $0002;
-    AVIFILEHANDLER_CANACCEPTNONRGB  = $0004;
-
-{-- Functions ----------------------------------------------------------------}
-
-procedure   AVIFileInit; stdcall;   // Call this first!
-procedure   AVIFileExit; stdcall;
-
-function    AVIFileAddRef(pfile: IAVIFile): ULONG; stdcall;
-function    AVIFileRelease(pfile: IAVIFile): ULONG; stdcall;
-
-function    AVIFileOpenA(var ppfile: IAVIFile; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
-function    AVIFileOpenW(var ppfile: IAVIFile; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
-
-{$IFDEF UNICODE}
-function    AVIFileOpen(var ppfile: IAVIFile; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
-{$ELSE}
-function    AVIFileOpen(var ppfile: IAVIFile; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;
-{$ENDIF}
-
-function    AVIFileInfoW(pfile: IAVIFile; var pfi: TAVIFILEINFOW; lSize: LONG): HResult; stdcall;
-function    AVIFileInfoA(pfile: IAVIFile; var pfi: TAVIFILEINFOA; lSize: LONG): HResult; stdcall;
-
-function    AVIFileInfo(pfile: IAVIFile; var pfi: TAVIFILEINFO; lSize: LONG): HResult; stdcall;
-
-function    AVIFileGetStream(pfile: IAVIFile; var ppavi: IAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
-
-function    AVIFileCreateStreamW(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOW): HResult; stdcall;
-function    AVIFileCreateStreamA(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOA): HResult; stdcall;
-
-function    AVIFileCreateStream(pfile: IAVIFile; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFO): HResult; stdcall;
-
-function    AVIFileWriteData(pfile: IAVIFile; ckid: DWORD; lpData: PVOID; cbData: LONG): HResult; stdcall;
-function    AVIFileReadData(pfile: IAVIFile; ckid: DWORD; lpData: PVOID; var lpcbData: LONG): HResult; stdcall;
-function    AVIFileEndRecord(pfile: IAVIFile): HResult; stdcall;
-
-function    AVIStreamAddRef(pavi: IAVIStream): ULONG; stdcall;
-function    AVIStreamRelease(pavi: IAVIStream): ULONG; stdcall;
-
-function    AVIStreamInfoW (pavi: IAVIStream; var psi: TAVISTREAMINFOW; lSize: LONG): HResult; stdcall;
-function    AVIStreamInfoA (pavi: IAVIStream; var psi: TAVISTREAMINFOA; lSize: LONG): HResult; stdcall;
-
-function    AVIStreamInfo(pavi: IAVIStream; var psi: TAVISTREAMINFO; lSize: LONG): HResult; stdcall;
-
-function    AVIStreamFindSample(pavi: IAVIStream; lPos: LONG; lFlags: LONG): LONG; stdcall;
-function    AVIStreamReadFormat(pavi: IAVIStream; lPos: LONG; lpFormat: PVOID; lpcbFormat: PLONG): HResult; stdcall;
-function    AVIStreamSetFormat(pavi: IAVIStream; lPos: LONG; lpFormat: PVOID; cbFormat: LONG): HResult; stdcall;
-function    AVIStreamReadData(pavi: IAVIStream; fcc: DWORD; lp: PVOID; lpcb: PLONG): HResult; stdcall;
-function    AVIStreamWriteData(pavi: IAVIStream; fcc: DWORD; lp: PVOID; cb: LONG): HResult; stdcall;
-
-function    AVIStreamRead(
-    pavi            : IAVISTREAM;
-    lStart          : LONG;
-    lSamples        : LONG;
-    lpBuffer        : PVOID;
-    cbBuffer        : LONG;
-    plBytes         : PLONG;
-    plSamples       : PLONG
-    ): HResult; stdcall;
-
-const
-    AVISTREAMREAD_CONVENIENT    = -1;
-
-function    AVIStreamWrite(
-    pavi            : IAVISTREAM;
-    lStart          : LONG;
-    lSamples        : LONG;
-    lpBuffer        : PVOID;
-    cbBuffer        : LONG;
-    dwFlags         : DWORD;
-    plSampWritten   : PLONG;
-    plBytesWritten  : PLONG
-    ): HResult; stdcall;
-
-// Right now, these just use AVIStreamInfo() to get information, then
-// return some of it.  Can they be more efficient?
-
-function    AVIStreamStart(pavi: IAVIStream): LONG; stdcall;
-function    AVIStreamLength(pavi: IAVIStream): LONG; stdcall;
-function    AVIStreamTimeToSample(pavi: IAVIStream; lTime: LONG): LONG; stdcall;
-function    AVIStreamSampleToTime(pavi: IAVIStream; lSample: LONG): LONG; stdcall;
-
-function    AVIStreamBeginStreaming(pavi: IAVIStream; lStart, lEnd: LONG; lRate: LONG): HResult; stdcall;
-function    AVIStreamEndStreaming(pavi: IAVIStream): HResult; stdcall;
-
-{-- Helper functions for using IGetFrame -------------------------------------}
-
-function    AVIStreamGetFrameOpen(pavi: IAVIStream; lpbiWanted: PBitmapInfoHeader): IGetFrame; stdcall;
-function    AVIStreamGetFrame(pg: IGetFrame; lPos: LONG): PBitmapInfoHeader; stdcall;
-function    AVIStreamGetFrameClose(pg: IGetFrame): HResult; stdcall;
-
-// !!! We need some way to place an advise on a stream....
-// STDAPI AVIStreamHasChanged   (PAVISTREAM pavi);
-
-{-- Shortcut function --------------------------------------------------------}
-
-function    AVIStreamOpenFromFileA(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
-                                   lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
-function    AVIStreamOpenFromFileW(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
-                                   lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
-
-{$IFDEF UNICODE}
-   function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
-     lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
-{$ELSE}
-   function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
-     lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall;
-{$ENDIF}
-
-{-- Use to create disembodied streams ----------------------------------------}
-
-function    AVIStreamCreate(var ppavi: IAVISTREAM; lParam1, lParam2: LONG; pclsidHandler: PCLSID): HResult; stdcall;
-
-// PHANDLER    AVIAPI AVIGetHandler         (PAVISTREAM pavi, PAVISTREAMHANDLER psh);
-// PAVISTREAM  AVIAPI AVIGetStream          (PHANDLER p);
-
-{-- Flags for AVIStreamFindSample --------------------------------------------}
-
-const
-    FIND_DIR                        = $0000000F;    // direction
-    FIND_NEXT                       = $00000001;    // go forward
-    FIND_PREV                       = $00000004;    // go backward
-    FIND_FROM_START                 = $00000008;    // start at the logical beginning
-
-    FIND_TYPE                       = $000000F0;    // type mask
-    FIND_KEY                        = $00000010;    // find key frame.
-    FIND_ANY                        = $00000020;    // find any (non-empty) sample
-    FIND_FORMAT                     = $00000040;    // find format change
-
-    FIND_RET                        = $0000F000;    // return mask
-    FIND_POS                        = $00000000;    // return logical position
-    FIND_LENGTH                     = $00001000;    // return logical size
-    FIND_OFFSET                     = $00002000;    // return physical position
-    FIND_SIZE                       = $00003000;    // return physical size
-    FIND_INDEX                      = $00004000;    // return physical index position
-
-{-- Stuff to support backward compat. ----------------------------------------}
-
-function    AVIStreamFindKeyFrame(var pavi: IAVISTREAM; lPos: LONG; lFlags: LONG): DWORD; stdcall; // AVIStreamFindSample
-
-// Non-portable: this is alias for method name
-// FindKeyFrame FindSample
-
-function    AVIStreamClose(pavi: IAVISTREAM): ULONG; stdcall; // AVIStreamRelease
-function    AVIFileClose(pfile: IAVIFILE): ULONG; stdcall; // AVIFileRelease
-procedure   AVIStreamInit; stdcall; // AVIFileInit
-procedure   AVIStreamExit; stdcall; // AVIFileExit
-
-const
-    SEARCH_NEAREST                  = FIND_PREV;
-    SEARCH_BACKWARD                 = FIND_PREV;
-    SEARCH_FORWARD                  = FIND_NEXT;
-    SEARCH_KEY                      = FIND_KEY;
-    SEARCH_ANY                      = FIND_ANY;
-
-{-- Helper macros ------------------------------------------------------------}
-
-function    AVIStreamSampleToSample(pavi1, pavi2: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamNextSample(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamPrevSample(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamNearestSample(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamNextKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamPrevKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamNearestKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-function    AVIStreamIsKeyFrame(pavi: IAVISTREAM; l: LONG): BOOL;
-function    AVIStreamPrevSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamNextSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamNearestSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamNextKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamPrevKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamNearestKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-function    AVIStreamStartTime(pavi: IAVISTREAM): LONG;
-function    AVIStreamLengthTime(pavi: IAVISTREAM): LONG;
-function    AVIStreamEnd(pavi: IAVISTREAM): LONG;
-function    AVIStreamEndTime(pavi: IAVISTREAM): LONG;
-function    AVIStreamSampleSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): LONG;
-function    AVIStreamFormatSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): HResult;
-function    AVIStreamDataSize(pavi: IAVISTREAM; fcc: DWORD; plSize: PLONG): HResult;
-
-{== AVISave routines and structures ==========================================}
-
-const
-    comptypeDIB                     = $20424944; // mmioFOURCC('D', 'I', 'B', ' ')
-
-function    AVIMakeCompressedStream(
-    var ppsCompressed   : IAVISTREAM;
-    ppsSource           : IAVISTREAM;
-    lpOptions           : PAVICOMPRESSOPTIONS;
-    pclsidHandler       : PCLSID
-    ): HResult; stdcall;
-
-// Non-portable: uses variable number of params
-// EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
-//      CLSID FAR *pclsidHandler,
-//      AVISAVECALLBACK     lpfnCallback,
-//      int                 nStreams,
-//      PAVISTREAM      pfile,
-//      LPAVICOMPRESSOPTIONS lpOptions,
-//      ...);
-
-function    AVISaveVA(
-    szFile          : LPCSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall;
-
-// Non-portable: uses variable number of params
-// EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
-//      CLSID FAR *pclsidHandler,
-//      AVISAVECALLBACK     lpfnCallback,
-//      int                 nStreams,
-//      PAVISTREAM      pfile,
-//      LPAVICOMPRESSOPTIONS lpOptions,
-//      ...);
-
-function    AVISaveVW(
-    szFile          : LPCWSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall;
-
-// #define AVISave      AVISaveA
-
-function    AVISaveV(
-    szFile          : LPCSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall; // AVISaveVA
-
-function    AVISaveOptions(
-    hwnd            : HWND;
-    uiFlags         : UINT;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): BOOL; stdcall;
-
-function    AVISaveOptionsFree(nStreams: int; var plpOptions: PAVICOMPRESSOPTIONS): HResult; stdcall;
-
-{-- FLAGS FOR uiFlags --------------------------------------------------------}
-
-// Same as the flags for ICCompressorChoose (see compman.h)
-// These determine what the compression options dialog for video streams
-// will look like.
-
-function    AVIBuildFilterW(lpszFilter: LPWSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall;
-function    AVIBuildFilterA(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall;
-
-function    AVIBuildFilter(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall; // AVIBuildFilterA
-
-function    AVIMakeFileFromStreams(var ppfile: IAVIFILE; nStreams: int; var papStreams: IAVISTREAM): HResult; stdcall;
-
-function    AVIMakeStreamFromClipboard(cfFormat: UINT; hGlobal: THANDLE; var ppstream: IAVISTREAM): HResult; stdcall;
-
-{-- Clipboard routines -------------------------------------------------------}
-
-function    AVIPutFileOnClipboard(pf: IAVIFILE): HResult; stdcall;
-function    AVIGetFromClipboard(var lppf: IAVIFILE): HResult; stdcall;
-function    AVIClearClipboard: HResult; stdcall;
-
-{-- Editing routines ---------------------------------------------------------}
-
-function    CreateEditableStream(var ppsEditable: IAVISTREAM; psSource: IAVISTREAM): HResult; stdcall;
-
-function    EditStreamCut(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall;
-
-function    EditStreamCopy(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall;
-
-function    EditStreamPaste(pavi: IAVISTREAM; var plPos, plLength: LONG; pstream: IAVISTREAM; lStart, lEnd: LONG): HResult; stdcall;
-
-function    EditStreamClone(pavi: IAVISTREAM; var ppResult: IAVISTREAM): HResult; stdcall;
-
-function    EditStreamSetNameA(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall;
-function    EditStreamSetNameW(pavi: IAVISTREAM; lpszName: LPCWSTR): HResult; stdcall;
-function    EditStreamSetInfoW(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOW; cbInfo: LONG): HResult; stdcall;
-function    EditStreamSetInfoA(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall;
-
-function    EditStreamSetInfo(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall; // EditStreamSetInfoA
-function    EditStreamSetName(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall; // EditStreamSetNameA
-
-{-- Error handling -----------------------------------------------------------}
-
-const
-    AVIERR_OK                       = 0;
-
-// !!! Questions to be answered:
-// How can you get a string form of these errors?
-// Which of these errors should be replaced by errors in SCODE.H?
-
-const
-    AVIERR_UNSUPPORTED              = $80044065; // MAKE_AVIERR(101)
-    AVIERR_BADFORMAT                = $80044066; // MAKE_AVIERR(102)
-    AVIERR_MEMORY                   = $80044067; // MAKE_AVIERR(103)
-    AVIERR_INTERNAL                 = $80044068; // MAKE_AVIERR(104)
-    AVIERR_BADFLAGS                 = $80044069; // MAKE_AVIERR(105)
-    AVIERR_BADPARAM                 = $8004406A; // MAKE_AVIERR(106)
-    AVIERR_BADSIZE                  = $8004406B; // MAKE_AVIERR(107)
-    AVIERR_BADHANDLE                = $8004406C; // MAKE_AVIERR(108)
-    AVIERR_FILEREAD                 = $8004406D; // MAKE_AVIERR(109)
-    AVIERR_FILEWRITE                = $8004406E; // MAKE_AVIERR(110)
-    AVIERR_FILEOPEN                 = $8004406F; // MAKE_AVIERR(111)
-    AVIERR_COMPRESSOR               = $80044070; // MAKE_AVIERR(112)
-    AVIERR_NOCOMPRESSOR             = $80044071; // MAKE_AVIERR(113)
-    AVIERR_READONLY                 = $80044072; // MAKE_AVIERR(114)
-    AVIERR_NODATA                   = $80044073; // MAKE_AVIERR(115)
-    AVIERR_BUFFERTOOSMALL           = $80044074; // MAKE_AVIERR(116)
-    AVIERR_CANTCOMPRESS             = $80044075; // MAKE_AVIERR(117)
-    AVIERR_USERABORT                = $800440C6; // MAKE_AVIERR(198)
-    AVIERR_ERROR                    = $800440C7; // MAKE_AVIERR(199)
-
-{== MCIWnd - Window class for MCI objects ====================================}
-
-//
-//  MCIWnd
-//
-//    MCIWnd window class header file.
-//
-//    the MCIWnd window class is a window class for controling MCI devices
-//    MCI devices include, wave files, midi files, AVI Video, cd audio,
-//    vcr, video disc, and others..
-//
-//    to learn more about MCI and mci command sets see the
-//    "Microsoft Multimedia Programmers's guide" in the Win31 SDK
-//
-//    the easiest use of the MCIWnd class is like so:
-//
-//          hwnd = MCIWndCreate(hwndParent, hInstance, 0, "chimes.wav");
-//          ...
-//          MCIWndPlay(hwnd);
-//          MCIWndStop(hwnd);
-//          MCIWndPause(hwnd);
-//          ....
-//          MCIWndDestroy(hwnd);
-//
-//    this will create a window with a play/pause, stop and a playbar
-//    and start the wave file playing.
-//
-//    mciwnd.h defines macros for all the most common MCI commands, but
-//    any string command can be used if needed.
-//
-//    Note: unlike the mciSendString() API, no alias or file name needs
-//    to be specifed, since the device to use is implied by the window handle.
-//
-//          MCIWndSendString(hwnd, "setaudio stream to 2");
-//
-//    (C) Copyright Microsoft Corp. 1991-1995.  All rights reserved.
-//
-// WIN32:
-//
-//    MCIWnd supports both ansi and unicode interfaces. For any message that
-//    takes or returns a text string, two versions of the message are defined,
-//    appended with A or W for Ansi or Wide Char. The message or api itself
-//    is defined to be one or other of these depending on whether you have
-//    UNICODE defined in your application.
-//    Thus for the api MCIWndCreate, there are in fact two apis,
-//    MCIWndCreateA and MCIWndCreateW. If you call MCIWndCreate, this will be
-//    re-routed to MCIWndCreateA unless UNICODE is defined when building your
-//    application. In any one application, you can mix calls to the
-//    Ansi and Unicode entrypoints.
-//
-//    If you use SendMessage instead of the macros below such as MCIWndOpen(),
-//    you will see that the messages have changed for WIN32, to support Ansi
-//    and Unicode entrypoints. In particular, MCI_OPEN has been replaced by
-//    MCWNDM_OPENA, or MCIWNDM_OPENW (MCIWNDM_OPEN is defined to be one or
-//    other of these).
-//
-//    Also, note that the WIN32 implementation of MCIWnd uses UNICODE
-//    so all apis and messages supporting ANSI strings do so by mapping them
-//    UNICODE strings and then calling the corresponding UNICODE entrypoint.
-//
-
-function    MCIWndSM(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): DWORD;
-
-const                               
-    MCIWND_WINDOW_CLASS             = 'MCIWndClass' ;
-
-function    MCIWndCreateA(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl;
-function    MCIWndCreateW(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCWSTR): HWND; cdecl;
-
-function    MCIWndCreate(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl; // MCIWndCreateA
-
-function    MCIWndRegisterClass: BOOL; cdecl;
-
-{-- Flags for the MCIWndOpen command -----------------------------------------}
-
-const
-    MCIWNDOPENF_NEW                 = $0001;    // open a new file
-
-{-- Window styles ------------------------------------------------------------}
-
-    MCIWNDF_NOAUTOSIZEWINDOW        = $0001;    // when movie size changes
-    MCIWNDF_NOPLAYBAR               = $0002;    // no toolbar
-    MCIWNDF_NOAUTOSIZEMOVIE         = $0004;    // when window size changes
-    MCIWNDF_NOMENU                  = $0008;    // no popup menu from RBUTTONDOWN
-    MCIWNDF_SHOWNAME                = $0010;    // show name in caption
-    MCIWNDF_SHOWPOS                 = $0020;    // show position in caption
-    MCIWNDF_SHOWMODE                = $0040;    // show mode in caption
-    MCIWNDF_SHOWALL                 = $0070;    // show all
-
-    MCIWNDF_NOTIFYMODE              = $0100;    // tell parent of mode change
-    MCIWNDF_NOTIFYPOS               = $0200;    // tell parent of pos change
-    MCIWNDF_NOTIFYSIZE              = $0400;    // tell parent of size change
-    MCIWNDF_NOTIFYERROR             = $1000;    // tell parent of an error
-    MCIWNDF_NOTIFYALL               = $1F00;    // tell all
-
-    MCIWNDF_NOTIFYANSI              = $0080;
-
-// The MEDIA notification includes a text string.
-// To receive notifications in ANSI instead of unicode set the
-// MCIWNDF_NOTIFYANSI style bit. The macro below includes this bit
-// by default unless you define UNICODE in your application.
-
-    MCIWNDF_NOTIFYMEDIAA            = $0880;    // tell parent of media change
-    MCIWNDF_NOTIFYMEDIAW            = $0800;    // tell parent of media change
-
-    MCIWNDF_NOTIFYMEDIA             = MCIWNDF_NOTIFYMEDIAA;
-
-    MCIWNDF_RECORD                  = $2000;    // Give a record button
-    MCIWNDF_NOERRORDLG              = $4000;    // Show Error Dlgs for MCI cmds?
-    MCIWNDF_NOOPEN                  = $8000;    // Don't allow user to open things
-
-{-- Can macros ---------------------------------------------------------------}
-
-function    MCIWndCanPlay(hwnd: HWND): BOOL;
-function    MCIWndCanRecord(hwnd: HWND): BOOL;
-function    MCIWndCanSave(hwnd: HWND): BOOL;
-function    MCIWndCanWindow(hwnd: HWND): BOOL;
-function    MCIWndCanEject(hwnd: HWND): BOOL;
-function    MCIWndCanConfig(hwnd: HWND): BOOL;
-function    MCIWndPaletteKick(hwnd: HWND): BOOL;
-
-function    MCIWndSave(hwnd: HWND; szFile: LPCSTR): DWORD;
-function    MCIWndSaveDialog(hwnd: HWND): DWORD;
-
-// If you dont give a device it will use the current device....
-
-function    MCIWndNew(hwnd: HWND; lp: PVOID): DWORD;
-function    MCIWndRecord(hwnd: HWND): DWORD;
-function    MCIWndOpen(hwnd: HWND; sz: LPCSTR; f: BOOL): DWORD;
-function    MCIWndOpenDialog(hwnd: HWND): DWORD;
-function    MCIWndClose(hwnd: HWND): DWORD;
-function    MCIWndPlay(hwnd: HWND): DWORD;
-function    MCIWndStop(hwnd: HWND): DWORD;
-function    MCIWndPause(hwnd: HWND): DWORD;
-function    MCIWndResume(hwnd: HWND): DWORD;
-function    MCIWndSeek(hwnd: HWND; lPos: DWORD): DWORD;
-function    MCIWndEject(hwnd: HWND): DWORD;
-
-function    MCIWndHome(hwnd: HWND): DWORD;
-function    MCIWndEnd(hwnd: HWND): DWORD;
-
-function    MCIWndGetSource(hwnd: HWND; prc: PRECT): DWORD;
-function    MCIWndPutSource(hwnd: HWND; prc: PRECT): DWORD;
-
-function    MCIWndGetDest(hwnd: HWND; prc: PRECT): DWORD;
-function    MCIWndPutDest(hwnd: HWND; prc: PRECT): DWORD;
-
-function    MCIWndPlayReverse(hwnd: HWND): DWORD;
-function    MCIWndPlayFrom(hwnd: HWND; lPos: DWORD): DWORD;
-function    MCIWndPlayTo(hwnd: HWND; lPos: DWORD): DWORD;
-function    MCIWndPlayFromTo(hwnd: HWND; lStart, lEnd: DWORD): DWORD;
-
-function    MCIWndGetDeviceID(hwnd: HWND): UINT;
-function    MCIWndGetAlias(hwnd: HWND): UINT;
-function    MCIWndGetMode(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-function    MCIWndGetPosition(hwnd: HWND): DWORD;
-function    MCIWndGetPositionString(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-function    MCIWndGetStart(hwnd: HWND): DWORD;
-function    MCIWndGetLength(hwnd: HWND): DWORD;
-function    MCIWndGetEnd(hwnd: HWND): DWORD;
-
-function    MCIWndStep(hwnd: HWND; n: DWORD): DWORD;
-
-procedure   MCIWndDestroy(hwnd: HWND);
-procedure   MCIWndSetZoom(hwnd: HWND; iZoom: UINT);
-function    MCIWndGetZoom(hwnd: HWND): UINT;
-function    MCIWndSetVolume(hwnd: HWND; iVol: UINT): DWORD;
-function    MCIWndGetVolume(hwnd: HWND): DWORD;
-function    MCIWndSetSpeed(hwnd: HWND; iSpeed: UINT): DWORD;
-function    MCIWndGetSpeed(hwnd: HWND): DWORD;
-function    MCIWndSetTimeFormat(hwnd: HWND; lp: LPCSTR): DWORD;
-function    MCIWndGetTimeFormat(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-procedure   MCIWndValidateMedia(hwnd: HWND);
-
-procedure   MCIWndSetRepeat(hwnd: HWND; f: BOOL);
-function    MCIWndGetRepeat(hwnd: HWND): BOOL;
-
-function    MCIWndUseFrames(hwnd: HWND): DWORD;
-function    MCIWndUseTime(hwnd: HWND): DWORD;
-
-procedure   MCIWndSetActiveTimer(hwnd: HWND; active: UINT);
-procedure   MCIWndSetInactiveTimer(hwnd: HWND; inactive: UINT);
-procedure   MCIWndSetTimers(hwnd: HWND; active, inactive: UINT);
-function    MCIWndGetActiveTimer(hwnd: HWND): UINT;
-function    MCIWndGetInactiveTimer(hwnd: HWND): UINT;
-
-function    MCIWndRealize(hwnd: HWND; fBkgnd: BOOL): DWORD;
-
-function    MCIWndSendString(hwnd: HWND; sz: LPCSTR): DWORD;
-function    MCIWndReturnString(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-function    MCIWndGetError(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-
-// #define MCIWndActivate(hwnd, f)     (void)MCIWndSM(hwnd, WM_ACTIVATE, (WPARAM)(BOOL)(f), 0)
-
-function    MCIWndGetPalette(hwnd: HWND): HPALETTE;
-function    MCIWndSetPalette(hwnd: HWND; hpal: HPALETTE): DWORD;
-
-function    MCIWndGetFileName(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-function    MCIWndGetDevice(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-
-function    MCIWndGetStyles(hwnd: HWND): UINT;
-function    MCIWndChangeStyles(hwnd: HWND; mask: UINT; value: DWORD): DWORD;
-
-type
-    PUnknown    = ^IUnknown;
-
-function    MCIWndOpenInterface(hwnd: HWND; pUnk: PUnknown): DWORD;
-
-function    MCIWndSetOwner(hwnd: HWND; hwndP: HWND): DWORD;
-
-{-- Messages an app will send to MCIWND --------------------------------------}
-
-// all the text-related messages are defined out of order above (they need
-// to be defined before the MCIWndOpen() macros
-
-const
-    MCIWNDM_GETDEVICEID             = WM_USER + 100;
-    MCIWNDM_GETSTART                = WM_USER + 103;
-    MCIWNDM_GETLENGTH               = WM_USER + 104;
-    MCIWNDM_GETEND                  = WM_USER + 105;
-    MCIWNDM_EJECT                   = WM_USER + 107;
-    MCIWNDM_SETZOOM                 = WM_USER + 108;
-    MCIWNDM_GETZOOM                 = WM_USER + 109;
-    MCIWNDM_SETVOLUME               = WM_USER + 110;
-    MCIWNDM_GETVOLUME               = WM_USER + 111;
-    MCIWNDM_SETSPEED                = WM_USER + 112;
-    MCIWNDM_GETSPEED                = WM_USER + 113;
-    MCIWNDM_SETREPEAT               = WM_USER + 114;
-    MCIWNDM_GETREPEAT               = WM_USER + 115;
-    MCIWNDM_REALIZE                 = WM_USER + 118;
-    MCIWNDM_VALIDATEMEDIA           = WM_USER + 121;
-    MCIWNDM_PLAYFROM                = WM_USER + 122;
-    MCIWNDM_PLAYTO                  = WM_USER + 123;
-    MCIWNDM_GETPALETTE              = WM_USER + 126;
-    MCIWNDM_SETPALETTE              = WM_USER + 127;
-    MCIWNDM_SETTIMERS               = WM_USER + 129;
-    MCIWNDM_SETACTIVETIMER          = WM_USER + 130;
-    MCIWNDM_SETINACTIVETIMER        = WM_USER + 131;
-    MCIWNDM_GETACTIVETIMER          = WM_USER + 132;
-    MCIWNDM_GETINACTIVETIMER        = WM_USER + 133;
-    MCIWNDM_CHANGESTYLES            = WM_USER + 135;
-    MCIWNDM_GETSTYLES               = WM_USER + 136;
-    MCIWNDM_GETALIAS                = WM_USER + 137;
-    MCIWNDM_PLAYREVERSE             = WM_USER + 139;
-    MCIWNDM_GET_SOURCE              = WM_USER + 140;
-    MCIWNDM_PUT_SOURCE              = WM_USER + 141;
-    MCIWNDM_GET_DEST                = WM_USER + 142;
-    MCIWNDM_PUT_DEST                = WM_USER + 143;
-    MCIWNDM_CAN_PLAY                = WM_USER + 144;
-    MCIWNDM_CAN_WINDOW              = WM_USER + 145;
-    MCIWNDM_CAN_RECORD              = WM_USER + 146;
-    MCIWNDM_CAN_SAVE                = WM_USER + 147;
-    MCIWNDM_CAN_EJECT               = WM_USER + 148;
-    MCIWNDM_CAN_CONFIG              = WM_USER + 149;
-    MCIWNDM_PALETTEKICK             = WM_USER + 150;
-    MCIWNDM_OPENINTERFACE           = WM_USER + 151;
-    MCIWNDM_SETOWNER                = WM_USER + 152;
-
-{-- Define both A and W messages ---------------------------------------------}
-
-    MCIWNDM_SENDSTRINGA             = WM_USER + 101;
-    MCIWNDM_GETPOSITIONA            = WM_USER + 102;
-    MCIWNDM_GETMODEA                = WM_USER + 106;
-    MCIWNDM_SETTIMEFORMATA          = WM_USER + 119;
-    MCIWNDM_GETTIMEFORMATA          = WM_USER + 120;
-    MCIWNDM_GETFILENAMEA            = WM_USER + 124;
-    MCIWNDM_GETDEVICEA              = WM_USER + 125;
-    MCIWNDM_GETERRORA               = WM_USER + 128;
-    MCIWNDM_NEWA                    = WM_USER + 134;
-    MCIWNDM_RETURNSTRINGA           = WM_USER + 138;
-    MCIWNDM_OPENA                   = WM_USER + 153;
-
-    MCIWNDM_SENDSTRINGW             = WM_USER + 201;
-    MCIWNDM_GETPOSITIONW            = WM_USER + 202;
-    MCIWNDM_GETMODEW                = WM_USER + 206;
-    MCIWNDM_SETTIMEFORMATW          = WM_USER + 219;
-    MCIWNDM_GETTIMEFORMATW          = WM_USER + 220;
-    MCIWNDM_GETFILENAMEW            = WM_USER + 224;
-    MCIWNDM_GETDEVICEW              = WM_USER + 225;
-    MCIWNDM_GETERRORW               = WM_USER + 228;
-    MCIWNDM_NEWW                    = WM_USER + 234;
-    MCIWNDM_RETURNSTRINGW           = WM_USER + 238;
-    MCIWNDM_OPENW                   = WM_USER + 252;
-
-{-- Map defaults to A --------------------------------------------------------}
-
-    MCIWNDM_SENDSTRING              = MCIWNDM_SENDSTRINGA;
-    MCIWNDM_GETPOSITION             = MCIWNDM_GETPOSITIONA;
-    MCIWNDM_GETMODE                 = MCIWNDM_GETMODEA;
-    MCIWNDM_SETTIMEFORMAT           = MCIWNDM_SETTIMEFORMATA;
-    MCIWNDM_GETTIMEFORMAT           = MCIWNDM_GETTIMEFORMATA;
-    MCIWNDM_GETFILENAME             = MCIWNDM_GETFILENAMEA;
-    MCIWNDM_GETDEVICE               = MCIWNDM_GETDEVICEA;
-    MCIWNDM_GETERROR                = MCIWNDM_GETERRORA;
-    MCIWNDM_NEW                     = MCIWNDM_NEWA;
-    MCIWNDM_RETURNSTRING            = MCIWNDM_RETURNSTRINGA;
-    MCIWNDM_OPEN                    = MCIWNDM_OPENA;
-
-// note that the source text for MCIWND will thus contain
-// support for eg MCIWNDM_SENDSTRING (both the 16-bit entrypoint and
-// in win32 mapped to MCIWNDM_SENDSTRINGW), and MCIWNDM_SENDSTRINGA (the
-// win32 ansi thunk).
-
-{-- Messages MCIWND will send to an app --------------------------------------}
-
-const
-    MCIWNDM_NOTIFYMODE              = WM_USER + 200;    // wp = hwnd, lp = mode
-    MCIWNDM_NOTIFYPOS               = WM_USER + 201;    // wp = hwnd, lp = pos
-    MCIWNDM_NOTIFYSIZE              = WM_USER + 202;    // wp = hwnd
-    MCIWNDM_NOTIFYMEDIA             = WM_USER + 203;    // wp = hwnd, lp = fn
-    MCIWNDM_NOTIFYERROR             = WM_USER + 205;    // wp = hwnd, lp = error
-
-{-- Special seek values for START and END ------------------------------------}
-
-    MCIWND_START                    = dword(-1) ;
-    MCIWND_END                      = dword(-2) ;
-
-{== VIDEO - Video capture driver interface ===================================}
-
-type
-    HVIDEO                          = THandle;
-    PHVIDEO                         = ^HVIDEO;
-
-{-- Error return values ------------------------------------------------------}
-
-const
-    DV_ERR_OK                       = 0;                    // No error
-    DV_ERR_BASE                     = 1;                    // Error Base 
-    DV_ERR_NONSPECIFIC              = DV_ERR_BASE;
-    DV_ERR_BADFORMAT                = DV_ERR_BASE + 1;      // unsupported video format 
-    DV_ERR_STILLPLAYING             = DV_ERR_BASE + 2;      // still something playing 
-    DV_ERR_UNPREPARED               = DV_ERR_BASE + 3;      // header not prepared 
-    DV_ERR_SYNC                     = DV_ERR_BASE + 4;      // device is synchronous 
-    DV_ERR_TOOMANYCHANNELS          = DV_ERR_BASE + 5;      // number of channels exceeded 
-    DV_ERR_NOTDETECTED              = DV_ERR_BASE + 6;      // HW not detected 
-    DV_ERR_BADINSTALL               = DV_ERR_BASE + 7;      // Can not get Profile 
-    DV_ERR_CREATEPALETTE            = DV_ERR_BASE + 8;
-    DV_ERR_SIZEFIELD                = DV_ERR_BASE + 9;
-    DV_ERR_PARAM1                   = DV_ERR_BASE + 10;
-    DV_ERR_PARAM2                   = DV_ERR_BASE + 11;
-    DV_ERR_CONFIG1                  = DV_ERR_BASE + 12;
-    DV_ERR_CONFIG2                  = DV_ERR_BASE + 13;
-    DV_ERR_FLAGS                    = DV_ERR_BASE + 14;
-    DV_ERR_13                       = DV_ERR_BASE + 15;
-
-    DV_ERR_NOTSUPPORTED             = DV_ERR_BASE + 16;     // function not suported 
-    DV_ERR_NOMEM                    = DV_ERR_BASE + 17;     // out of memory 
-    DV_ERR_ALLOCATED                = DV_ERR_BASE + 18;     // device is allocated 
-    DV_ERR_BADDEVICEID              = DV_ERR_BASE + 19;
-    DV_ERR_INVALHANDLE              = DV_ERR_BASE + 20;
-    DV_ERR_BADERRNUM                = DV_ERR_BASE + 21;
-    DV_ERR_NO_BUFFERS               = DV_ERR_BASE + 22;     // out of buffers 
-
-    DV_ERR_MEM_CONFLICT             = DV_ERR_BASE + 23;     // Mem conflict detected 
-    DV_ERR_IO_CONFLICT              = DV_ERR_BASE + 24;     // I/O conflict detected 
-    DV_ERR_DMA_CONFLICT             = DV_ERR_BASE + 25;     // DMA conflict detected
-    DV_ERR_INT_CONFLICT             = DV_ERR_BASE + 26;     // Interrupt conflict detected
-    DV_ERR_PROTECT_ONLY             = DV_ERR_BASE + 27;     // Can not run in standard mode
-    DV_ERR_LASTERROR                = DV_ERR_BASE + 27;
-
-    DV_ERR_USER_MSG                 = DV_ERR_BASE + 1000;   // Hardware specific errors
-
-{-- Callback messages --------------------------------------------------------}
-
-// Note that the values for all installable driver callback messages are
-// identical, (ie. MM_DRVM_DATA has the same value for capture drivers,
-// installable video codecs, and the audio compression manager).
-
-const
-    DV_VM_OPEN                      = MM_DRVM_OPEN;     // Obsolete messages
-    DV_VM_CLOSE                     = MM_DRVM_CLOSE;
-    DV_VM_DATA                      = MM_DRVM_DATA;
-    DV_VM_ERROR                     = MM_DRVM_ERROR;
-
-{== Structures ===============================================================}
-
-{-- Video data block header --------------------------------------------------}
-
-type
-    PVIDEOHDR               = ^TVIDEOHDR;
-    TVIDEOHDR               = record
-        lpData              : PBYTE;                // pointer to locked data buffer
-        dwBufferLength      : DWORD;                // Length of data buffer
-        dwBytesUsed         : DWORD;                // Bytes actually used
-        dwTimeCaptured      : DWORD;                // Milliseconds from start of stream
-        dwUser              : DWORD;                // for client's use
-        dwFlags             : DWORD;                // assorted flags (see defines)
-        dwReserved          : array[0..3] of DWORD; // reserved for driver
-    end;
-
-{-- dwFlags field of VIDEOHDR ------------------------------------------------}
-
-const
-    VHDR_DONE                       = $00000001;    // Done bit
-    VHDR_PREPARED                   = $00000002;    // Set if this header has been prepared
-    VHDR_INQUEUE                    = $00000004;    // Reserved for driver
-    VHDR_KEYFRAME                   = $00000008;    // Key Frame
-
-{-- Channel capabilities structure -------------------------------------------}
-
-type
-    PCHANNEL_CAPS           = ^TCHANNEL_CAPS;
-    TCHANNEL_CAPS           = record
-        dwFlags             : DWORD;    // Capability flags
-        dwSrcRectXMod       : DWORD;    // Granularity of src rect in x
-        dwSrcRectYMod       : DWORD;    // Granularity of src rect in y
-        dwSrcRectWidthMod   : DWORD;    // Granularity of src rect width
-        dwSrcRectHeightMod  : DWORD;    // Granularity of src rect height
-        dwDstRectXMod       : DWORD;    // Granularity of dst rect in x
-        dwDstRectYMod       : DWORD;    // Granularity of dst rect in y
-        dwDstRectWidthMod   : DWORD;    // Granularity of dst rect width
-        dwDstRectHeightMod  : DWORD;    // Granularity of dst rect height
-    end;
-
-{-- dwFlags of CHANNEL_CAPS --------------------------------------------------}
-
-const
-    VCAPS_OVERLAY                   = $00000001;    // overlay channel 
-    VCAPS_SRC_CAN_CLIP              = $00000002;    // src rect can clip
-    VCAPS_DST_CAN_CLIP              = $00000004;    // dst rect can clip
-    VCAPS_CAN_SCALE                 = $00000008;    // allows src != dst
-
-{== API flags ================================================================}
-
-{-- Types of channels to open with the videoOpen function --------------------}
-
-const
-    VIDEO_EXTERNALIN                = $0001;
-    VIDEO_EXTERNALOUT               = $0002;
-    VIDEO_IN                        = $0004;
-    VIDEO_OUT                       = $0008;
-
-{-- Is a driver dialog available for this channel ----------------------------}
-
-    VIDEO_DLG_QUERY                 = $0010;
-
-{-- videoConfigure (both GET and SET) ----------------------------------------}
-
-    VIDEO_CONFIGURE_QUERY           = $8000;
-
-{-- videoConfigure (SET only) ------------------------------------------------}
-
-    VIDEO_CONFIGURE_SET             = $1000;
-
-{-- videoConfigure (GET only) ------------------------------------------------}
-
-    VIDEO_CONFIGURE_GET             = $2000;
-    VIDEO_CONFIGURE_QUERYSIZE       = $0001;
-
-    VIDEO_CONFIGURE_CURRENT         = $0010;
-    VIDEO_CONFIGURE_NOMINAL         = $0020;
-    VIDEO_CONFIGURE_MIN             = $0040;
-    VIDEO_CONFIGURE_MAX             = $0080;
-
-{== Configure messages =======================================================}
-
-    DVM_USER                        = $4000;
-
-    DVM_CONFIGURE_START             = $1000;
-    DVM_CONFIGURE_END               = $1FFF;
-
-    DVM_PALETTE                     = DVM_CONFIGURE_START + 1;
-    DVM_FORMAT                      = DVM_CONFIGURE_START + 2;
-    DVM_PALETTERGB555               = DVM_CONFIGURE_START + 3;
-    DVM_SRC_RECT                    = DVM_CONFIGURE_START + 4;
-    DVM_DST_RECT                    = DVM_CONFIGURE_START + 5;
-
-{== AVICAP - Window class for AVI capture ====================================}
-
-function    AVICapSM(hwnd: HWND; m: UINT; w: WPARAM; l: LPARAM): DWORD;
-
-{-- Window messages WM_CAP... which can be sent to an AVICAP window ----------}
-
-// UNICODE
-//
-// The Win32 version of AVICAP on NT supports UNICODE applications:
-// for each API or message that takes a char or string parameter, there are
-// two versions, ApiNameA and ApiNameW. The default name ApiName is #defined
-// to one or other depending on whether UNICODE is defined. Apps can call
-// the A and W apis directly, and mix them.
-//
-// The 32-bit AVICAP on NT uses unicode exclusively internally.
-// ApiNameA() will be implemented as a call to ApiNameW() together with
-// translation of strings.
-
-// Defines start of the message range
-const
-    WM_CAP_START                    = WM_USER;
-    WM_CAP_UNICODE_START            = WM_USER + 100;
-
-    WM_CAP_GET_CAPSTREAMPTR         = WM_CAP_START + 1;
-
-    WM_CAP_SET_CALLBACK_ERRORW      = WM_CAP_UNICODE_START + 2;
-    WM_CAP_SET_CALLBACK_STATUSW     = WM_CAP_UNICODE_START + 3;
-    WM_CAP_SET_CALLBACK_ERRORA      = WM_CAP_START + 2;
-    WM_CAP_SET_CALLBACK_STATUSA     = WM_CAP_START + 3;
-    WM_CAP_SET_CALLBACK_ERROR       = WM_CAP_SET_CALLBACK_ERRORA;
-    WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_SET_CALLBACK_STATUSA;
-
-    WM_CAP_SET_CALLBACK_YIELD       = WM_CAP_START + 4;
-    WM_CAP_SET_CALLBACK_FRAME       = WM_CAP_START + 5;
-    WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
-    WM_CAP_SET_CALLBACK_WAVESTREAM  = WM_CAP_START + 7;
-    WM_CAP_GET_USER_DATA            = WM_CAP_START + 8;
-    WM_CAP_SET_USER_DATA            = WM_CAP_START + 9;
-
-    WM_CAP_DRIVER_CONNECT           = WM_CAP_START + 10;
-    WM_CAP_DRIVER_DISCONNECT        = WM_CAP_START + 11;
-
-    WM_CAP_DRIVER_GET_NAMEA         = WM_CAP_START + 12;
-    WM_CAP_DRIVER_GET_VERSIONA      = WM_CAP_START + 13;
-    WM_CAP_DRIVER_GET_NAMEW         = WM_CAP_UNICODE_START + 12;
-    WM_CAP_DRIVER_GET_VERSIONW      = WM_CAP_UNICODE_START + 13;
-    WM_CAP_DRIVER_GET_NAME          = WM_CAP_DRIVER_GET_NAMEA;
-    WM_CAP_DRIVER_GET_VERSION       = WM_CAP_DRIVER_GET_VERSIONA;
-
-    WM_CAP_DRIVER_GET_CAPS          = WM_CAP_START + 14;
-
-    WM_CAP_FILE_SET_CAPTURE_FILEA   = WM_CAP_START + 20;
-    WM_CAP_FILE_GET_CAPTURE_FILEA   = WM_CAP_START + 21;
-    WM_CAP_FILE_SAVEASA             = WM_CAP_START + 23;
-    WM_CAP_FILE_SAVEDIBA            = WM_CAP_START + 25;
-    WM_CAP_FILE_SET_CAPTURE_FILEW   = WM_CAP_UNICODE_START + 20;
-    WM_CAP_FILE_GET_CAPTURE_FILEW   = WM_CAP_UNICODE_START + 21;
-    WM_CAP_FILE_SAVEASW             = WM_CAP_UNICODE_START + 23;
-    WM_CAP_FILE_SAVEDIBW            = WM_CAP_UNICODE_START + 25;
-    WM_CAP_FILE_SET_CAPTURE_FILE    = WM_CAP_FILE_SET_CAPTURE_FILEA;
-    WM_CAP_FILE_GET_CAPTURE_FILE    = WM_CAP_FILE_GET_CAPTURE_FILEA;
-    WM_CAP_FILE_SAVEAS              = WM_CAP_FILE_SAVEASA;
-    WM_CAP_FILE_SAVEDIB             = WM_CAP_FILE_SAVEDIBA;
-
-    // out of order to save on ifdefs
-
-    WM_CAP_FILE_ALLOCATE            = WM_CAP_START + 22;
-    WM_CAP_FILE_SET_INFOCHUNK       = WM_CAP_START + 24;
-
-    WM_CAP_EDIT_COPY                = WM_CAP_START + 30;
-
-    WM_CAP_SET_AUDIOFORMAT          = WM_CAP_START + 35;
-    WM_CAP_GET_AUDIOFORMAT          = WM_CAP_START + 36;
-
-    WM_CAP_DLG_VIDEOFORMAT          = WM_CAP_START + 41;
-    WM_CAP_DLG_VIDEOSOURCE          = WM_CAP_START + 42;
-    WM_CAP_DLG_VIDEODISPLAY         = WM_CAP_START + 43;
-    WM_CAP_GET_VIDEOFORMAT          = WM_CAP_START + 44;
-    WM_CAP_SET_VIDEOFORMAT          = WM_CAP_START + 45;
-    WM_CAP_DLG_VIDEOCOMPRESSION     = WM_CAP_START + 46;
-
-    WM_CAP_SET_PREVIEW              = WM_CAP_START + 50;
-    WM_CAP_SET_OVERLAY              = WM_CAP_START + 51;
-    WM_CAP_SET_PREVIEWRATE          = WM_CAP_START + 52;
-    WM_CAP_SET_SCALE                = WM_CAP_START + 53;
-    WM_CAP_GET_STATUS               = WM_CAP_START + 54;
-    WM_CAP_SET_SCROLL               = WM_CAP_START + 55;
-
-    WM_CAP_GRAB_FRAME               = WM_CAP_START + 60;
-    WM_CAP_GRAB_FRAME_NOSTOP        = WM_CAP_START + 61;
-
-    WM_CAP_SEQUENCE                 = WM_CAP_START + 62;
-    WM_CAP_SEQUENCE_NOFILE          = WM_CAP_START + 63;
-    WM_CAP_SET_SEQUENCE_SETUP       = WM_CAP_START + 64;
-    WM_CAP_GET_SEQUENCE_SETUP       = WM_CAP_START + 65;
-
-    WM_CAP_SET_MCI_DEVICEA          = WM_CAP_START + 66;
-    WM_CAP_GET_MCI_DEVICEA          = WM_CAP_START + 67;
-    WM_CAP_SET_MCI_DEVICEW          = WM_CAP_UNICODE_START + 66;
-    WM_CAP_GET_MCI_DEVICEW          = WM_CAP_UNICODE_START + 67;
-    WM_CAP_SET_MCI_DEVICE           = WM_CAP_SET_MCI_DEVICEA;
-    WM_CAP_GET_MCI_DEVICE           = WM_CAP_GET_MCI_DEVICEA;
-
-    WM_CAP_STOP                     = WM_CAP_START + 68;
-    WM_CAP_ABORT                    = WM_CAP_START + 69;
-
-    WM_CAP_SINGLE_FRAME_OPEN        = WM_CAP_START + 70;
-    WM_CAP_SINGLE_FRAME_CLOSE       = WM_CAP_START + 71;
-    WM_CAP_SINGLE_FRAME             = WM_CAP_START + 72;
-
-    WM_CAP_PAL_OPENA                = WM_CAP_START + 80;
-    WM_CAP_PAL_SAVEA                = WM_CAP_START + 81;
-    WM_CAP_PAL_OPENW                = WM_CAP_UNICODE_START + 80;
-    WM_CAP_PAL_SAVEW                = WM_CAP_UNICODE_START + 81;
-    WM_CAP_PAL_OPEN                 = WM_CAP_PAL_OPENA;
-    WM_CAP_PAL_SAVE                 = WM_CAP_PAL_SAVEA;
-
-    WM_CAP_PAL_PASTE                = WM_CAP_START + 82;
-    WM_CAP_PAL_AUTOCREATE           = WM_CAP_START + 83;
-    WM_CAP_PAL_MANUALCREATE         = WM_CAP_START + 84;
-
-    // Following added post VFW 1.1
-
-    WM_CAP_SET_CALLBACK_CAPCONTROL  = WM_CAP_START + 85;
-
-    // Defines end of the message range
-
-    WM_CAP_UNICODE_END              = WM_CAP_PAL_SAVEW;
-    WM_CAP_END                      = WM_CAP_UNICODE_END;
-
-{-- Callback definitions -----------------------------------------------------}
-
-type
-    TCAPYIELDCALLBACK               = function(hWnd: HWND): DWORD; stdcall;
-
-    TCAPSTATUSCALLBACKW             = function(hWnd: HWND; nID: int; lpsz: LPCWSTR): DWORD; stdcall;
-    TCAPERRORCALLBACKW              = function(hWnd: HWND; nID: int; lpsz: LPCWSTR): DWORD; stdcall;
-    TCAPSTATUSCALLBACKA             = function(hWnd: HWND; nID: int; lpsz: LPCSTR): DWORD; stdcall;
-    TCAPERRORCALLBACKA              = function(hWnd: HWND; nID: int; lpsz: LPCSTR): DWORD; stdcall;
-
-    TCAPSTATUSCALLBACK              = TCAPSTATUSCALLBACKA;
-    TCAPERRORCALLBACK               = TCAPERRORCALLBACKA;
-
-    TCAPVIDEOCALLBACK               = function(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
-    TCAPWAVECALLBACK                = function(hWnd: HWND; lpWHdr: PWAVEHDR): DWORD; stdcall;
-    TCAPCONTROLCALLBACK             = function(hWnd: HWND; nState: int): DWORD; stdcall;
-
-{-- Structures ---------------------------------------------------------------}
-
-type
-    PCAPDRIVERCAPS                  = ^TCAPDRIVERCAPS;
-    TCAPDRIVERCAPS                  = record
-        wDeviceIndex                : UINT;     // Driver index in system.ini
-        fHasOverlay                 : BOOL;     // Can device overlay?
-        fHasDlgVideoSource          : BOOL;     // Has Video source dlg?
-        fHasDlgVideoFormat          : BOOL;     // Has Format dlg?
-        fHasDlgVideoDisplay         : BOOL;     // Has External out dlg?
-        fCaptureInitialized         : BOOL;     // Driver ready to capture?
-        fDriverSuppliesPalettes     : BOOL;     // Can driver make palettes?
-
-        // following always NULL on Win32.
-        hVideoIn                    : THANDLE;   // Driver In channel
-        hVideoOut                   : THANDLE;   // Driver Out channel
-        hVideoExtIn                 : THANDLE;   // Driver Ext In channel
-        hVideoExtOut                : THANDLE;   // Driver Ext Out channel
-    end;
-
-    PCAPSTATUS                      = ^TCAPSTATUS;
-    TCAPSTATUS                      = record
-        uiImageWidth                : UINT    ; // Width of the image
-        uiImageHeight               : UINT    ; // Height of the image
-        fLiveWindow                 : BOOL    ; // Now Previewing video?
-        fOverlayWindow              : BOOL    ; // Now Overlaying video?
-        fScale                      : BOOL    ; // Scale image to client?
-        ptScroll                    : TPOINT  ; // Scroll position
-        fUsingDefaultPalette        : BOOL    ; // Using default driver palette?
-        fAudioHardware              : BOOL    ; // Audio hardware present?
-        fCapFileExists              : BOOL    ; // Does capture file exist?
-        dwCurrentVideoFrame         : DWORD   ; // # of video frames cap'td
-        dwCurrentVideoFramesDropped : DWORD   ; // # of video frames dropped
-        dwCurrentWaveSamples        : DWORD   ; // # of wave samples cap'td
-        dwCurrentTimeElapsedMS      : DWORD   ; // Elapsed capture duration
-        hPalCurrent                 : HPALETTE; // Current palette in use
-        fCapturingNow               : BOOL    ; // Capture in progress?
-        dwReturn                    : DWORD   ; // Error value after any operation
-        wNumVideoAllocated          : UINT    ; // Actual number of video buffers
-        wNumAudioAllocated          : UINT    ; // Actual number of audio buffers
-    end;
-
-    // Default values in parenthesis
-
-    PCAPTUREPARMS                   = ^TCAPTUREPARMS;
-    TCAPTUREPARMS                   = record
-        dwRequestMicroSecPerFrame   : DWORD ;   // Requested capture rate
-        fMakeUserHitOKToCapture     : BOOL  ;   // Show "Hit OK to cap" dlg?
-        wPercentDropForError        : UINT  ;   // Give error msg if > (10%)
-        fYield                      : BOOL  ;   // Capture via background task?
-        dwIndexSize                 : DWORD ;   // Max index size in frames (32K)
-        wChunkGranularity           : UINT  ;   // Junk chunk granularity (2K)
-        fUsingDOSMemory             : BOOL  ;   // Use DOS buffers?
-        wNumVideoRequested          : UINT  ;   // # video buffers, If 0, autocalc
-        fCaptureAudio               : BOOL  ;   // Capture audio?
-        wNumAudioRequested          : UINT  ;   // # audio buffers, If 0, autocalc
-        vKeyAbort                   : UINT  ;   // Virtual key causing abort
-        fAbortLeftMouse             : BOOL  ;   // Abort on left mouse?
-        fAbortRightMouse            : BOOL  ;   // Abort on right mouse?
-        fLimitEnabled               : BOOL  ;   // Use wTimeLimit?
-        wTimeLimit                  : UINT  ;   // Seconds to capture
-        fMCIControl                 : BOOL  ;   // Use MCI video source?
-        fStepMCIDevice              : BOOL  ;   // Step MCI device?
-        dwMCIStartTime              : DWORD ;   // Time to start in MS
-        dwMCIStopTime               : DWORD ;   // Time to stop in MS
-        fStepCaptureAt2x            : BOOL  ;   // Perform spatial averaging 2x
-        wStepCaptureAverageFrames   : UINT  ;   // Temporal average n Frames
-        dwAudioBufferSize           : DWORD ;   // Size of audio bufs (0 = default)
-        fDisableWriteCache          : BOOL  ;   // Attempt to disable write cache
-        AVStreamMaster              : UINT  ;   // Which stream controls length?
-    end;
-
-{-- AVStreamMaster -----------------------------------------------------------}
-
-//  Since Audio and Video streams generally use non-synchronized capture
-//  clocks, this flag determines whether the audio stream is to be considered
-//  the master or controlling clock when writing the AVI file:
-//
-//  AVSTREAMMASTER_AUDIO  - Audio is master, video frame duration is forced
-//                          to match audio duration (VFW 1.0, 1.1 default)
-//  AVSTREAMMASTER_NONE   - No master, audio and video streams may be of
-//                          different lengths
-
-const
-    AVSTREAMMASTER_AUDIO            = 0;        // Audio master (VFW 1.0, 1.1)
-    AVSTREAMMASTER_NONE             = 1;        // No master
-
-type
-    PCAPINFOCHUNK                   = ^TCAPINFOCHUNK;
-    TCAPINFOCHUNK                   = record
-        fccInfoID                   : FOURCC;   // Chunk ID, "ICOP" for copyright
-        lpData                      : PVOID;    // pointer to data
-        cbData                      : DWORD;     // size of lpData
-    end;
-
-{-- CapControlCallback states ------------------------------------------------}
-
-const
-    CONTROLCALLBACK_PREROLL         = 1;        // Waiting to start capture 
-    CONTROLCALLBACK_CAPTURING       = 2;        // Now capturing
-
-{-- Message crackers for above -----------------------------------------------}
-
-// message wrapper macros are defined for the default messages only. Apps
-// that wish to mix Ansi and UNICODE message sending will have to
-// reference the _A and _W messages directly
-
-function    capSetCallbackOnError(hwnd: HWND; fpProc: TCAPERRORCALLBACK): BOOL;
-function    capSetCallbackOnStatus(hwnd: HWND; fpProc: TCAPSTATUSCALLBACK): BOOL;
-function    capSetCallbackOnYield(hwnd: HWND; fpProc: TCAPYIELDCALLBACK): BOOL;
-function    capSetCallbackOnFrame(hwnd: HWND; fpProc: TCAPVIDEOCALLBACK): BOOL;
-function    capSetCallbackOnVideoStream(hwnd: HWND; fpProc: TCAPVIDEOCALLBACK): BOOL;
-function    capSetCallbackOnWaveStream(hwnd: HWND; fpProc: TCAPWAVECALLBACK): BOOL;
-function    capSetCallbackOnCapControl(hwnd: HWND; fpProc: TCAPCONTROLCALLBACK): BOOL;
-
-function    capSetUserData(hwnd: HWND; lUser: DWORD): BOOL;
-function    capGetUserData(hwnd: HWND): DWORD;
-
-function    capDriverConnect(hwnd: HWND; i: INT): BOOL;
-function    capDriverDisconnect(hwnd: HWND): BOOL;
-function    capDriverGetName(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-function    capDriverGetVersion(hwnd: HWND; szVer: LPSTR; wSize: WORD): BOOL;
-function    capDriverGetCaps(hwnd: HWND; s: PCAPDRIVERCAPS; wSize: WORD): BOOL;
-
-function    capFileSetCaptureFile(hwnd: HWND; szName: LPCSTR): BOOL;
-function    capFileGetCaptureFile(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-function    capFileAlloc(hwnd: HWND; dwSize: DWORD): BOOL;
-function    capFileSaveAs(hwnd: HWND; szName: LPCSTR): BOOL;
-function    capFileSetInfoChunk(hwnd: HWND; lpInfoChunk: PCAPINFOCHUNK): BOOL;
-function    capFileSaveDIB(hwnd: HWND; szName: LPCSTR): BOOL;
-
-function    capEditCopy(hwnd: HWND): BOOL;
-
-function    capSetAudioFormat(hwnd: HWND; s: PWAVEFORMATEX; wSize: WORD): BOOL;
-function    capGetAudioFormat(hwnd: HWND; s: PWAVEFORMATEX; wSize: WORD): DWORD;
-function    capGetAudioFormatSize(hwnd: HWND): DWORD;
-
-function    capDlgVideoFormat(hwnd: HWND): BOOL;
-function    capDlgVideoSource(hwnd: HWND): BOOL;
-function    capDlgVideoDisplay(hwnd: HWND): BOOL;
-function    capDlgVideoCompression(hwnd: HWND): BOOL;
-
-function    capGetVideoFormat(hwnd: HWND; s: PVOID; wSize: WORD): DWORD;
-function    capGetVideoFormatSize(hwnd: HWND): DWORD;
-function    capSetVideoFormat(hwnd: HWND; s: PVOID; wSize: WORD): BOOL;
-
-function    capPreview(hwnd: HWND; f: BOOL): BOOL;
-function    capPreviewRate(hwnd: HWND; wMS: WORD): BOOL;
-function    capOverlay(hwnd: HWND; f: BOOL): BOOL;
-function    capPreviewScale(hwnd: HWND; f: BOOL): BOOL;
-function    capGetStatus(hwnd: HWND; s: PCAPSTATUS; wSize: WORD): BOOL;
-function    capSetScrollPos(hwnd: HWND; lpP: PPOINT): BOOL;
-
-function    capGrabFrame(hwnd: HWND): BOOL;
-function    capGrabFrameNoStop(hwnd: HWND): BOOL;
-
-function    capCaptureSequence(hwnd: HWND): BOOL;
-function    capCaptureSequenceNoFile(hwnd: HWND): BOOL;
-function    capCaptureStop(hwnd: HWND): BOOL;
-function    capCaptureAbort(hwnd: HWND): BOOL;
-
-function    capCaptureSingleFrameOpen(hwnd: HWND): BOOL;
-function    capCaptureSingleFrameClose(hwnd: HWND): BOOL;
-function    capCaptureSingleFrame(hwnd: HWND): BOOL;
-
-function    capCaptureGetSetup(hwnd: HWND; s: PCAPTUREPARMS; wSize: WORD): BOOL;
-function    capCaptureSetSetup(hwnd: HWND; s: PCAPTUREPARMS; wSize: WORD): BOOL;
-
-function    capSetMCIDeviceName(hwnd: HWND; szName: LPCSTR): BOOL;
-function    capGetMCIDeviceName(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-
-function    capPaletteOpen(hwnd: HWND; szName: LPCSTR): BOOL;
-function    capPaletteSave(hwnd: HWND; szName: LPCSTR): BOOL;
-function    capPalettePaste(hwnd: HWND): BOOL;
-function    capPaletteAuto(hwnd: HWND; iFrames, iColors: INT): BOOL;
-function    capPaletteManual(hwnd: HWND; fGrab: BOOL; iColors: INT): BOOL;
-
-{-- The only exported functions from AVICAP.DLL ------------------------------}
-
-function    capCreateCaptureWindowA(
-    lpszWindowName      : LPCSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall;
-
-function    capGetDriverDescriptionA(
-    wDriverIndex        : UINT;
-    lpszName            : LPSTR;
-    cbName              : int;
-    lpszVer             : LPSTR;
-    cbVer               : int
-    ): BOOL; stdcall;
-
-function    capCreateCaptureWindowW(
-    lpszWindowName      : LPCWSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall;
-
-function    capGetDriverDescriptionW(
-    wDriverIndex        : UINT;
-    lpszName            : LPWSTR;
-    cbName              : int;
-    lpszVer             : LPWSTR;
-    cbVer               : int
-    ): BOOL; stdcall;
-
-function    capCreateCaptureWindow(
-    lpszWindowName      : LPCSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall; // capCreateCaptureWindowA
-
-function    capGetDriverDescription(
-    wDriverIndex        : UINT;
-    lpszName            : LPSTR;
-    cbName              : int;
-    lpszVer             : LPSTR;
-    cbVer               : int
-    ): BOOL; stdcall; // capGetDriverDescriptionA
-
-{-- New information chunk IDs ------------------------------------------------}
-
-const
-    infotypeDIGITIZATION_TIME       = $54494449; // mmioFOURCC ('I','D','I','T')
-    infotypeSMPTE_TIME              = $504D5349; // mmioFOURCC ('I','S','M','P')
-
-{-- String IDs from status and error callbacks -------------------------------}
-
-    IDS_CAP_BEGIN                   = 300;  // "Capture Start" 
-    IDS_CAP_END                     = 301;  // "Capture End" 
-
-    IDS_CAP_INFO                    = 401;  // "%s" 
-    IDS_CAP_OUTOFMEM                = 402;  // "Out of memory" 
-    IDS_CAP_FILEEXISTS              = 403;  // "File '%s' exists -- overwrite it?" 
-    IDS_CAP_ERRORPALOPEN            = 404;  // "Error opening palette '%s'" 
-    IDS_CAP_ERRORPALSAVE            = 405;  // "Error saving palette '%s'" 
-    IDS_CAP_ERRORDIBSAVE            = 406;  // "Error saving frame '%s'" 
-    IDS_CAP_DEFAVIEXT               = 407;  // "avi" 
-    IDS_CAP_DEFPALEXT               = 408;  // "pal" 
-    IDS_CAP_CANTOPEN                = 409;  // "Cannot open '%s'"
-    IDS_CAP_SEQ_MSGSTART            = 410;  // "Select OK to start capture\nof video sequence\nto %s."
-    IDS_CAP_SEQ_MSGSTOP             = 411;  // "Hit ESCAPE or click to end capture" 
-
-    IDS_CAP_VIDEDITERR              = 412;  // "An error occurred while trying to run VidEdit." 
-    IDS_CAP_READONLYFILE            = 413;  // "The file '%s' is a read-only file." 
-    IDS_CAP_WRITEERROR              = 414;  // "Unable to write to file '%s'.\nDisk may be full." 
-    IDS_CAP_NODISKSPACE             = 415;  // "There is no space to create a capture file on the specified device." 
-    IDS_CAP_SETFILESIZE             = 416;  // "Set File Size" 
-    IDS_CAP_SAVEASPERCENT           = 417;  // "SaveAs: %2ld%%  Hit Escape to abort." 
-
-    IDS_CAP_DRIVER_ERROR            = 418;  // Driver specific error message 
-
-    IDS_CAP_WAVE_OPEN_ERROR         = 419;  // "Error: Cannot open the wave input device.\nCheck sample size, frequency, and channels." 
-    IDS_CAP_WAVE_ALLOC_ERROR        = 420;  // "Error: Out of memory for wave buffers." 
-    IDS_CAP_WAVE_PREPARE_ERROR      = 421;  // "Error: Cannot prepare wave buffers." 
-    IDS_CAP_WAVE_ADD_ERROR          = 422;  // "Error: Cannot add wave buffers." 
-    IDS_CAP_WAVE_SIZE_ERROR         = 423;  // "Error: Bad wave size." 
-
-    IDS_CAP_VIDEO_OPEN_ERROR        = 424;  // "Error: Cannot open the video input device." 
-    IDS_CAP_VIDEO_ALLOC_ERROR       = 425;  // "Error: Out of memory for video buffers."
-    IDS_CAP_VIDEO_PREPARE_ERROR     = 426;  // "Error: Cannot prepare video buffers." 
-    IDS_CAP_VIDEO_ADD_ERROR         = 427;  // "Error: Cannot add video buffers." 
-    IDS_CAP_VIDEO_SIZE_ERROR        = 428;  // "Error: Bad video size." 
-
-    IDS_CAP_FILE_OPEN_ERROR         = 429;  // "Error: Cannot open capture file." 
-    IDS_CAP_FILE_WRITE_ERROR        = 430;  // "Error: Cannot write to capture file.  Disk may be full." 
-    IDS_CAP_RECORDING_ERROR         = 431;  // "Error: Cannot write to capture file.  Data rate too high or disk full." 
-    IDS_CAP_RECORDING_ERROR2        = 432;  // "Error while recording" 
-    IDS_CAP_AVI_INIT_ERROR          = 433;  // "Error: Unable to initialize for capture."
-    IDS_CAP_NO_FRAME_CAP_ERROR      = 434;  // "Warning: No frames captured.\nConfirm that vertical sync interrupts\nare configured and enabled." 
-    IDS_CAP_NO_PALETTE_WARN         = 435;  // "Warning: Using default palette." 
-    IDS_CAP_MCI_CONTROL_ERROR       = 436;  // "Error: Unable to access MCI device." 
-    IDS_CAP_MCI_CANT_STEP_ERROR     = 437;  // "Error: Unable to step MCI device." 
-    IDS_CAP_NO_AUDIO_CAP_ERROR      = 438;  // "Error: No audio data captured.\nCheck audio card settings." 
-    IDS_CAP_AVI_DRAWDIB_ERROR       = 439;  // "Error: Unable to draw this data format."
-    IDS_CAP_COMPRESSOR_ERROR        = 440;  // "Error: Unable to initialize compressor."
-    IDS_CAP_AUDIO_DROP_ERROR        = 441;  // "Error: Audio data was lost during capture, reduce capture rate."
-
-{-- Status string IDs --------------------------------------------------------}
-
-    IDS_CAP_STAT_LIVE_MODE          = 500;  // "Live window" 
-    IDS_CAP_STAT_OVERLAY_MODE       = 501;  // "Overlay window" 
-    IDS_CAP_STAT_CAP_INIT           = 502;  // "Setting up for capture - Please wait" 
-    IDS_CAP_STAT_CAP_FINI           = 503;  // "Finished capture, now writing frame %ld" 
-    IDS_CAP_STAT_PALETTE_BUILD      = 504;  // "Building palette map" 
-    IDS_CAP_STAT_OPTPAL_BUILD       = 505;  // "Computing optimal palette" 
-    IDS_CAP_STAT_I_FRAMES           = 506;  // "%d frames" 
-    IDS_CAP_STAT_L_FRAMES           = 507;  // "%ld frames" 
-    IDS_CAP_STAT_CAP_L_FRAMES       = 508;  // "Captured %ld frames" 
-    IDS_CAP_STAT_CAP_AUDIO          = 509;  // "Capturing audio" 
-    IDS_CAP_STAT_VIDEOCURRENT       = 510;  // "Captured %ld frames (%ld dropped) %d.%03d sec." 
-    IDS_CAP_STAT_VIDEOAUDIO         = 511;  // "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps).  %ld audio bytes (%d,%03d sps)" 
-    IDS_CAP_STAT_VIDEOONLY          = 512;  // "Captured %d.%03d sec.  %ld frames (%ld dropped) (%d.%03d fps)" 
-    IDS_CAP_STAT_FRAMESDROPPED      = 513;  // "Dropped %ld of %ld frames (%d.%02d%%) during capture."
-
-{== FilePreview dialog =======================================================}
-
-function    GetOpenFileNamePreviewA(lpofn: POPENFILENAMEA): BOOL; stdcall;
-function    GetSaveFileNamePreviewA(lpofn: POPENFILENAMEA): BOOL; stdcall;
-
-function    GetOpenFileNamePreviewW(lpofn: POPENFILENAMEW): BOOL; stdcall;
-function    GetSaveFileNamePreviewW(lpofn: POPENFILENAMEW): BOOL; stdcall;
-
-function    GetOpenFileNamePreview(lpofn: POPENFILENAMEA): BOOL; stdcall; // GetOpenFileNamePreviewA
-function    GetSaveFileNamePreview(lpofn: POPENFILENAMEA): BOOL; stdcall; // GetSaveFileNamePreviewA
-
-implementation
-
-function MKFOURCC( ch0, ch1, ch2, ch3: AnsiChar ): FOURCC;
-begin
-  Result := (DWord(Ord(ch0))) or
-            (DWord(Ord(ch1)) shl 8) or
-            (DWord(Ord(ch2)) shl 16) or
-            (DWord(Ord(ch3)) shl 24);
-end;
-
-function mmioFOURCC( ch0, ch1, ch2, ch3: AnsiChar ): FOURCC;
-begin
-  Result := MKFOURCC(ch0,ch1,ch2,ch3);
-end;
-
-function aviTWOCC(ch0, ch1: AnsiChar): TWOCC;
-begin
-  Result := (Word(Ord(ch0))) or (Word(Ord(ch1)) shl 8);
-end;
-
-{-- Query macros -------------------------------------------------------------}
-
-function ICQueryAbout(hic: HIC): BOOL;
-begin
-  Result := ICSendMessage(hic, ICM_ABOUT, dword(-1), ICMF_ABOUT_QUERY) = ICERR_OK;
-end;
-
-function ICAbout(hic: HIC; hwnd: HWND): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_ABOUT, hwnd, 0);
-end;
-
-function ICQueryConfigure(hic: HIC): BOOL;
-begin
-  Result := ICSendMessage(hic, ICM_CONFIGURE, dword(-1), ICMF_CONFIGURE_QUERY) = ICERR_OK;
-end;
-
-function ICConfigure(hic: HIC; hwnd: HWND): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_CONFIGURE, hwnd, 0);
-end;
-
-{-- Get/Set state macros -----------------------------------------------------}
-
-function ICGetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_GETSTATE, DWORD(pv), cb);
-end;
-
-function ICSetState(hic: HIC; pv: PVOID; cb: DWORD): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_SETSTATE, DWORD(pv), cb);
-end;
-
-function ICGetStateSize(hic: HIC): DWORD;
-begin
-  Result := ICGetState(hic, nil, 0);
-end;
-
-{-- Get value macros ---------------------------------------------------------}
-
-function ICGetDefaultQuality(hic: HIC): DWORD;
-begin
-  ICSendMessage(hic, ICM_GETDEFAULTQUALITY, DWORD(@Result), sizeof(Result));
-end;
-
-function ICGetDefaultKeyFrameRate(hic: HIC): DWORD;
-begin
-  ICSendMessage(hic, ICM_GETDEFAULTKEYFRAMERATE, DWORD(@Result), sizeof(Result));
-end;
-
-{-- Draw window macro --------------------------------------------------------}
-
-function ICDrawWindow(hic: HIC; prc: PRECT): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_DRAW_WINDOW, DWORD(prc), sizeof(prc^));
-end;
-
-{-- ICCompressBegin() - start compression from a source fmt to a dest fmt ----}
-
-function ICCompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_COMPRESS_BEGIN, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-{-- ICCompressQuery() - determines if compression from src to dst is supp ----}
-
-function ICCompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_COMPRESS_QUERY, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-{-- ICCompressGetFormat() - get the output format (fmt of compressed) --------}
-
-// if lpbiOutput is nil return the size in bytes needed for format.
-
-function ICCompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-  Result := ICSendMessage(hic, ICM_COMPRESS_GET_FORMAT, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-function ICCompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
-begin
-  Result := ICCompressGetFormat(hic, lpbi, nil);
-end;
-
-{-- ICCompressSize() - return the maximal size of a compressed frame ---------}
-
-function    ICCompressGetSize(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_COMPRESS_GET_SIZE, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-function    ICCompressEnd(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_COMPRESS_END, 0, 0);
-end;
-
-{-- ICDecompressBegin() - start compression from src fmt to a dest fmt -------}
-
-function    ICDecompressBegin(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_BEGIN, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-{-- ICDecompressQuery() - determines if compression is supported -------------}
-
-function    ICDecompressQuery(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_QUERY, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-{-- ICDecompressGetFormat - get the output fmt (fmt of uncompressed data) ----}
-
-// if lpbiOutput is NULL return the size in bytes needed for format.
-
-function    ICDecompressGetFormat(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_GET_FORMAT, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-function    ICDecompressGetFormatSize(hic: HIC; lpbi: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICDecompressGetFormat(hic, lpbi, nil);
-end;
-
-{-- ICDecompressGetPalette() - get the output palette ------------------------}
-
-function    ICDecompressGetPalette(hic: HIC; lpbiInput, lpbiOutput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_GET_PALETTE, DWORD(lpbiInput), DWORD(lpbiOutput));
-end;
-
-function    ICDecompressSetPalette(hic: HIC; lpbiPalette: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_SET_PALETTE, DWORD(lpbiPalette), 0);
-end;
-
-function    ICDecompressEnd(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESS_END, 0, 0);
-end;
-
-{-- ICDecompressEx() - decompress a single frame -----------------------------}
-
-function    ICDecompressEx(
-    hic     : HIC;
-    dwFlags : DWORD;
-    lpbiSrc : PBITMAPINFOHEADER;
-    lpSrc   : PVOID;
-    xSrc    : int;
-    ySrc    : int;
-    dxSrc   : int;
-    dySrc   : int;
-    lpbiDst : PBITMAPINFOHEADER;
-    lpDst   : PVOID;
-    xDst    : int;
-    yDst    : int;
-    dxDst   : int;
-    dyDst   : int
-    ): DWORD; stdcall;
-var
-    ic : TICDECOMPRESSEX;
-begin
-    ic.dwFlags  := dwFlags;
-    ic.lpbiSrc  := lpbiSrc;
-    ic.lpSrc    := lpSrc;
-    ic.xSrc     := xSrc;
-    ic.ySrc     := ySrc;
-    ic.dxSrc    := dxSrc;
-    ic.dySrc    := dySrc;
-    ic.lpbiDst  := lpbiDst;
-    ic.lpDst    := lpDst;
-    ic.xDst     := xDst;
-    ic.yDst     := yDst;
-    ic.dxDst    := dxDst;
-    ic.dyDst    := dyDst;
-
-    // note that ICM swaps round the length and pointer
-    // length in lparam2, pointer in lparam1
-    Result := ICSendMessage(hic, ICM_DECOMPRESSEX, DWORD(@ic), sizeof(ic));
-end;
-
-{-- ICDecompressExBegin() - start compression from a src fmt to a dest fmt ---}
-
-function    ICDecompressExBegin(
-    hic     : HIC;
-    dwFlags : DWORD;
-    lpbiSrc : PBITMAPINFOHEADER;
-    lpSrc   : PVOID;
-    xSrc    : int;
-    ySrc    : int;
-    dxSrc   : int;
-    dySrc   : int;
-    lpbiDst : PBITMAPINFOHEADER;
-    lpDst   : PVOID;
-    xDst    : int;
-    yDst    : int;
-    dxDst   : int;
-    dyDst   : int
-    ): DWORD; stdcall;
-var
-    ic : TICDECOMPRESSEX ;
-begin
-    ic.dwFlags  := dwFlags;
-    ic.lpbiSrc  := lpbiSrc;
-    ic.lpSrc    := lpSrc;
-    ic.xSrc     := xSrc;
-    ic.ySrc     := ySrc;
-    ic.dxSrc    := dxSrc;
-    ic.dySrc    := dySrc;
-    ic.lpbiDst  := lpbiDst;
-    ic.lpDst    := lpDst;
-    ic.xDst     := xDst;
-    ic.yDst     := yDst;
-    ic.dxDst    := dxDst;
-    ic.dyDst    := dyDst;
-
-    // note that ICM swaps round the length and pointer
-    // length in lparam2, pointer in lparam1
-    Result      := ICSendMessage(hic, ICM_DECOMPRESSEX_BEGIN, DWORD(@ic), sizeof(ic));
-end;
-
-{-- ICDecompressExQuery() ----------------------------------------------------}
-
-function    ICDecompressExQuery(
-    hic     : HIC;
-    dwFlags : DWORD;
-    lpbiSrc : PBITMAPINFOHEADER;
-    lpSrc   : PVOID;
-    xSrc    : int;
-    ySrc    : int;
-    dxSrc   : int;
-    dySrc   : int;
-    lpbiDst : PBITMAPINFOHEADER;
-    lpDst   : PVOID;
-    xDst    : int;
-    yDst    : int;
-    dxDst   : int;
-    dyDst   : int
-    ): DWORD; stdcall;
-var
-    ic : TICDECOMPRESSEX;
-begin
-    ic.dwFlags  := dwFlags;
-    ic.lpbiSrc  := lpbiSrc;
-    ic.lpSrc    := lpSrc;
-    ic.xSrc     := xSrc;
-    ic.ySrc     := ySrc;
-    ic.dxSrc    := dxSrc;
-    ic.dySrc    := dySrc;
-    ic.lpbiDst  := lpbiDst;
-    ic.lpDst    := lpDst;
-    ic.xDst     := xDst;
-    ic.yDst     := yDst;
-    ic.dxDst    := dxDst;
-    ic.dyDst    := dyDst;
-
-    // note that ICM swaps round the length and pointer
-    // length in lparam2, pointer in lparam1
-    Result      := ICSendMessage(hic, ICM_DECOMPRESSEX_QUERY, DWORD(@ic), sizeof(ic));
-end;
-
-function    ICDecompressExEnd(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DECOMPRESSEX_END, 0, 0)
-end;
-
-function    ICDrawSuggestFormat(
-    hic         : HIC;
-    lpbiIn      : PBITMAPINFOHEADER;
-    lpbiOut     : PBITMAPINFOHEADER;
-    dxSrc       : int;
-    dySrc       : int;
-    dxDst       : int;
-    dyDst       : int;
-    hicDecomp   : HIC
-    ): DWORD; stdcall;
-var
-    ic : TICDRAWSUGGEST;
-begin
-    ic.lpbiIn           := lpbiIn;
-    ic.lpbiSuggest      := lpbiOut;
-    ic.dxSrc            := dxSrc;
-    ic.dySrc            := dySrc;
-    ic.dxDst            := dxDst;
-    ic.dyDst            := dyDst;
-    ic.hicDecompressor  := hicDecomp;
-
-    // note that ICM swaps round the length and pointer
-    // length in lparam2, pointer in lparam1
-    Result := ICSendMessage(hic, ICM_DRAW_SUGGESTFORMAT, DWORD(@ic), sizeof(ic));
-end;
-
-{-- ICDrawQuery() - determines if the compressor is willing to render fmt ----}
-
-function    ICDrawQuery(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_QUERY, DWORD(lpbiInput), 0);
-end;
-
-function    ICDrawChangePalette(hic: HIC; lpbiInput: PBITMAPINFOHEADER): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_CHANGEPALETTE, DWORD(lpbiInput), 0);
-end;
-
-function    ICGetBuffersWanted(hic: HIC; lpdwBuffers: PDWORD): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_GETBUFFERSWANTED, DWORD(lpdwBuffers), 0);
-end;
-
-function    ICDrawEnd(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_END, 0, 0);
-end;
-
-function    ICDrawStart(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_START, 0, 0);
-end;
-
-function    ICDrawStartPlay(hic: HIC; lFrom, lTo: DWORD): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_START_PLAY, lFrom, lTo);
-end;
-
-function    ICDrawStop(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_STOP, 0, 0);
-end;
-
-function    ICDrawStopPlay(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_STOP_PLAY, 0, 0);
-end;
-
-function    ICDrawGetTime(hic: HIC; lplTime: PDWORD): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_GETTIME, DWORD(lplTime), 0);
-end;
-
-function    ICDrawSetTime(hic: HIC; lTime: DWORD): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_SETTIME, lTime, 0);
-end;
-
-function    ICDrawRealize(hic: HIC; hdc: HDC; fBackground: BOOL): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_REALIZE, DWORD(hdc), DWORD(fBackground));
-end;
-
-function    ICDrawFlush(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_FLUSH, 0, 0);
-end;
-
-function    ICDrawRenderBuffer(hic: HIC): DWORD;
-begin
-    Result := ICSendMessage(hic, ICM_DRAW_RENDERBUFFER, 0, 0);
-end;
-
-{-- ICSetStatusProc() - Set the status callback function ---------------------}
-
-// ICMessage is not supported on NT
-
-function    ICSetStatusProc(
-    hic         : HIC;
-    dwFlags     : DWORD;
-    lParam      : DWORD;
-    fpfnStatus  : TICStatusProc
-    ): DWORD; stdcall;
-var
-    ic : TICSETSTATUSPROC;
-begin
-    ic.dwFlags  := dwFlags;
-    ic.lParam   := lParam;
-    ic.Status   := fpfnStatus;
-
-    // note that ICM swaps round the length and pointer
-    // length in lparam2, pointer in lparam1
-    Result      := ICSendMessage(hic, ICM_SET_STATUS_PROC, DWORD(@ic), sizeof(ic));
-end;
-
-{== Helper routines for DrawDib and MCIAVI... ================================}
-
-function    ICDecompressOpen(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER): HIC;
-begin
-    Result := ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, ICMODE_DECOMPRESS);
-end;
-
-function    ICDrawOpen(fccType, fccHandler: DWORD; lpbiIn: PBITMAPINFOHEADER): HIC;
-begin
-    Result := ICLocate(fccType, fccHandler, lpbiIn, nil, ICMODE_DRAW);
-end;
-
-{-- DrawDibUpdate() - redraw last image (may only be valid with DDF_BUFFER) --}
-
-function    DrawDibUpdate(hdd: HDRAWDIB; hdc: HDC; x, y: int): BOOL;
-begin
-    Result  := DrawDibDraw(hdd, hdc, x, y, 0, 0, nil, nil, 0, 0, 0, 0, DDF_UPDATE);
-end;
-
-{== Useful macros ============================================================}
-
-{-- Macro to get stream number out of a FOURCC ckid --------------------------}
-
-function    FromHex(n: BYTE): BYTE;
-begin
-    if n >= Ord('A') then
-        Result := Ord(n) + 10 - Ord('A')
-    else
-        Result := Ord(n) - Ord('0');
-end;
-
-function    StreamFromFOURCC(fcc: DWORD): BYTE;
-begin
-    Result :=  (FromHex(Lo(LoWord(fcc))) shl 4) + FromHex(Hi(LoWord(fcc)));
-end;
-
-{-- Macro to get TWOCC chunk type out of a FOURCC ckid -----------------------}
-
-function    TWOCCFromFOURCC(fcc: DWORD): WORD;
-begin
-    Result := HiWord(fcc);
-end;
-
-{-- Macro to make a ckid for a chunk out of a TWOCC and a stream num (0-255) -}
-
-function    ToHex(n: BYTE): BYTE;
-begin
-    if n > 9 then
-        Result := n - 10 + Ord('A')
-    else
-        Result := n + Ord('0');
-end;
-
-function    MAKEAVICKID(tcc: WORD; stream: BYTE): DWORD;
-begin
-    Result := MakeLONG((ToHex(stream and $0F) shl 8) or ToHex((stream and $F0) shr 4),tcc);
-end;
-
-{-- Helper macros ------------------------------------------------------------}
-
-function    AVIStreamSampleToSample(pavi1, pavi2: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamTimeToSample(pavi1,AVIStreamSampleToTime(pavi2, l));
-end;
-
-function    AVIStreamNextSample(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l+1,FIND_NEXT or FIND_ANY);
-end;
-
-function    AVIStreamPrevSample(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l-1,FIND_PREV or FIND_ANY);
-end;
-
-function    AVIStreamNearestSample(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l,FIND_PREV or FIND_ANY);
-end;
-
-function    AVIStreamNextKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l+1,FIND_NEXT or FIND_KEY);
-end;
-
-function    AVIStreamPrevKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l-1,FIND_PREV or FIND_KEY);
-end;
-
-function    AVIStreamNearestKeyFrame(pavi: IAVISTREAM; l: LONG): LONG;
-begin
-    Result  := AVIStreamFindSample(pavi,l,FIND_PREV or FIND_KEY)
-end;
-
-function    AVIStreamIsKeyFrame(pavi: IAVISTREAM; l: LONG): BOOL;
-begin
-    Result  := AVIStreamNearestKeyFrame(pavi,l) = l;
-end;
-
-function    AVIStreamPrevSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamPrevSample(pavi,AVIStreamTimeToSample(pavi,t)));
-end;
-
-function    AVIStreamNextSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamNextSample(pavi,AVIStreamTimeToSample(pavi,t)));
-end;
-
-function    AVIStreamNearestSampleTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamNearestSample(pavi,AVIStreamTimeToSample(pavi,t)));
-end;
-
-function    AVIStreamNextKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamNextKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)));
-end;
-
-function    AVIStreamPrevKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamPrevKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)));
-end;
-
-function    AVIStreamNearestKeyFrameTime(pavi: IAVISTREAM; t: LONG): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamNearestKeyFrame(pavi,AVIStreamTimeToSample(pavi, t)));
-end;
-
-function    AVIStreamStartTime(pavi: IAVISTREAM): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamStart(pavi));
-end;
-
-function    AVIStreamLengthTime(pavi: IAVISTREAM): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamLength(pavi));
-end;
-
-function    AVIStreamEnd(pavi: IAVISTREAM): LONG;
-begin
-    Result  := AVIStreamStart(pavi) + AVIStreamLength(pavi);
-end;
-
-function    AVIStreamEndTime(pavi: IAVISTREAM): LONG;
-begin
-    Result  := AVIStreamSampleToTime(pavi, AVIStreamEnd(pavi));
-end;
-
-function    AVIStreamSampleSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): LONG;
-begin
-    Result  := AVIStreamRead(pavi,lPos,1,nil,0,plSize,nil);
-end;
-
-function    AVIStreamFormatSize(pavi: IAVISTREAM; lPos: LONG; plSize: PLONG): HResult;
-begin
-    Result  := AVIStreamReadFormat(pavi,lPos,nil,plSize);
-end;
-
-function    AVIStreamDataSize(pavi: IAVISTREAM; fcc: DWORD; plSize: PLONG): HResult;
-begin
-    Result  := AVIStreamReadData(pavi,fcc,nil,plSize)
-end;
-
-{== MCIWnd ===================================================================}
-
-function    MCIWndSM(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): DWORD;
-begin
-    Result := SendMessage(hWnd, Msg, wParam, lParam);
-end;
-
-{-- Can macros ---------------------------------------------------------------}
-
-function    MCIWndCanPlay(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_PLAY,0,0) <> 0;
-end;
-
-function    MCIWndCanRecord(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_RECORD,0,0) <> 0;
-end;
-
-function    MCIWndCanSave(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_SAVE,0,0) <> 0;
-end;
-
-function    MCIWndCanWindow(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_WINDOW,0,0) <> 0;
-end;
-
-function    MCIWndCanEject(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_EJECT,0,0) <> 0;
-end;
-
-function    MCIWndCanConfig(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_CAN_CONFIG,0,0) <> 0;
-end;
-
-function    MCIWndPaletteKick(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd,MCIWNDM_PALETTEKICK,0,0) <> 0;
-end;
-
-function    MCIWndSave(hwnd: HWND; szFile: LPCSTR): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_SAVE, 0, LPARAM(szFile));
-end;
-
-function    MCIWndSaveDialog(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSave(hwnd, LPCSTR(-1));
-end;
-
-// If you dont give a device it will use the current device....
-
-function    MCIWndNew(hwnd: HWND; lp: PVOID): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_NEW, 0, LPARAM(lp));
-end;
-
-function    MCIWndRecord(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_RECORD, 0, 0);
-end;
-
-function    MCIWndOpen(hwnd: HWND; sz: LPCSTR; f: BOOL): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_OPEN, WPARAM(f), LPARAM(sz));
-end;
-
-function    MCIWndOpenDialog(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndOpen(hwnd, LPCSTR(-1), False);
-end;
-
-function    MCIWndClose(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_CLOSE, 0, 0);
-end;
-
-function    MCIWndPlay(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_PLAY, 0, 0);
-end;
-
-function    MCIWndStop(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_STOP, 0, 0);
-end;
-
-function    MCIWndPause(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_PAUSE, 0, 0);
-end;
-
-function    MCIWndResume(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_RESUME, 0, 0);
-end;
-
-function    MCIWndSeek(hwnd: HWND; lPos: DWORD): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_SEEK, 0, lPos);
-end;
-
-function    MCIWndEject(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_EJECT, 0, 0);
-end;
-
-function    MCIWndHome(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSeek(hwnd, MCIWND_START);
-end;
-
-function    MCIWndEnd(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSeek(hwnd, MCIWND_END);
-end;
-
-function    MCIWndGetSource(hwnd: HWND; prc: PRECT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GET_SOURCE, 0, LPARAM(prc));
-end;
-
-function    MCIWndPutSource(hwnd: HWND; prc: PRECT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_PUT_SOURCE, 0, LPARAM(prc));
-end;
-
-function    MCIWndGetDest(hwnd: HWND; prc: PRECT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GET_DEST, 0, LPARAM(prc));
-end;
-
-function    MCIWndPutDest(hwnd: HWND; prc: PRECT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_PUT_DEST, 0, LPARAM(prc));
-end;
-
-function    MCIWndPlayReverse(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_PLAYREVERSE, 0, 0);
-end;
-
-function    MCIWndPlayFrom(hwnd: HWND; lPos: DWORD): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_PLAYFROM, 0, lPos);
-end;
-
-function    MCIWndPlayTo(hwnd: HWND; lPos: DWORD): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_PLAYTO, 0, lPos);
-end;
-
-function    MCIWndPlayFromTo(hwnd: HWND; lStart, lEnd: DWORD): DWORD;
-begin
-    MCIWndSeek(hwnd, lStart);
-    Result  := MCIWndPlayTo(hwnd, lEnd);
-end;
-
-function    MCIWndGetDeviceID(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETDEVICEID, 0, 0);
-end;
-
-function    MCIWndGetAlias(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETALIAS, 0, 0);
-end;
-
-function    MCIWndGetMode(hwnd: HWND; lp: LPCSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETMODE, len, LPARAM(lp));
-end;
-
-function    MCIWndGetPosition(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETPOSITION, 0, 0);
-end;
-
-function    MCIWndGetPositionString(hwnd: HWND; lp: LPCSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETPOSITION, len, LPARAM(lp));
-end;
-
-function    MCIWndGetStart(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETSTART, 0, 0);
-end;
-
-function    MCIWndGetLength(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETLENGTH, 0, 0);
-end;
-
-function    MCIWndGetEnd(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETEND, 0, 0);
-end;
-
-function    MCIWndStep(hwnd: HWND; n: DWORD): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCI_STEP, 0, n);
-end;
-
-procedure   MCIWndDestroy(hwnd: HWND);
-begin
-    MCIWndSM(hwnd, WM_CLOSE, 0, 0);
-end;
-
-procedure   MCIWndSetZoom(hwnd: HWND; iZoom: UINT);
-begin
-    MCIWndSM(hwnd, MCIWNDM_SETZOOM, 0, iZoom);
-end;
-
-function    MCIWndGetZoom(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETZOOM, 0, 0);
-end;
-
-function    MCIWndSetVolume(hwnd: HWND; iVol: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SETVOLUME, 0, iVol);
-end;
-
-function    MCIWndGetVolume(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETVOLUME, 0, 0);
-end;
-
-function    MCIWndSetSpeed(hwnd: HWND; iSpeed: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SETSPEED, 0, iSpeed);
-end;
-
-function    MCIWndGetSpeed(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETSPEED, 0, 0);
-end;
-
-function    MCIWndSetTimeFormat(hwnd: HWND; lp: LPCSTR): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SETTIMEFORMAT, 0, LPARAM(lp));
-end;
-
-function    MCIWndGetTimeFormat(hwnd: HWND; lp: LPCSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETTIMEFORMAT, len, LPARAM(lp));
-end;
-
-procedure   MCIWndValidateMedia(hwnd: HWND);
-begin
-    MCIWndSM(hwnd, MCIWNDM_VALIDATEMEDIA, 0, 0);
-end;
-
-procedure   MCIWndSetRepeat(hwnd: HWND; f: BOOL);
-begin
-    MCIWndSM(hwnd, MCIWNDM_SETREPEAT, 0, LPARAM(f));
-end;
-
-function    MCIWndGetRepeat(hwnd: HWND): BOOL;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETREPEAT, 0, 0) <> 0;
-end;
-
-function    MCIWndUseFrames(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSetTimeFormat(hwnd, 'frames');
-end;
-
-function    MCIWndUseTime(hwnd: HWND): DWORD;
-begin
-    Result  := MCIWndSetTimeFormat(hwnd, 'ms');
-end;
-
-procedure   MCIWndSetActiveTimer(hwnd: HWND; active: UINT);
-begin
-    MCIWndSM(hwnd, MCIWNDM_SETACTIVETIMER, active, 0);
-end;
-
-procedure   MCIWndSetInactiveTimer(hwnd: HWND; inactive: UINT);
-begin
-    MCIWndSM(hwnd, MCIWNDM_SETINACTIVETIMER, inactive, 0);
-end;
-
-procedure   MCIWndSetTimers(hwnd: HWND; active, inactive: UINT);
-begin
-    MCIWndSM(hwnd, MCIWNDM_SETTIMERS, active, inactive);
-end;
-
-function    MCIWndGetActiveTimer(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETACTIVETIMER, 0, 0);
-end;
-
-function    MCIWndGetInactiveTimer(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETINACTIVETIMER, 0, 0);
-end;
-
-function    MCIWndRealize(hwnd: HWND; fBkgnd: BOOL): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_REALIZE, WPARAM(fBkgnd), 0);
-end;
-
-function    MCIWndSendString(hwnd: HWND; sz: LPCSTR): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SENDSTRING, 0, LPARAM(sz));
-end;
-
-function    MCIWndReturnString(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_RETURNSTRING, len, LPARAM(lp));
-end;
-
-function    MCIWndGetError(hwnd: HWND; lp: LPSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETERROR, len, LPARAM(lp));
-end;
-
-function    MCIWndGetPalette(hwnd: HWND): HPALETTE;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETPALETTE, 0, 0);
-end;
-
-function    MCIWndSetPalette(hwnd: HWND; hpal: HPALETTE): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SETPALETTE, hpal, 0);
-end;
-
-function    MCIWndGetFileName(hwnd: HWND; lp: LPCSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETFILENAME, len, LPARAM(lp));
-end;
-
-function    MCIWndGetDevice(hwnd: HWND; lp: LPCSTR; len: UINT): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETDEVICE, len, LPARAM(lp));
-end;
-
-function    MCIWndGetStyles(hwnd: HWND): UINT;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_GETSTYLES, 0, 0);
-end;
-
-function    MCIWndChangeStyles(hwnd: HWND; mask: UINT; value: DWORD): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_CHANGESTYLES, mask, value);
-end;
-
-function    MCIWndOpenInterface(hwnd: HWND; pUnk: PUNKNOWN): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_OPENINTERFACE, 0, LPARAM(pUnk));
-end;
-
-function    MCIWndSetOwner(hwnd: HWND; hwndP: HWND): DWORD;
-begin
-    Result  := MCIWndSM(hwnd, MCIWNDM_SETOWNER, hwndP, 0);
-end;
-
-{== AVICAP - Window class for AVI capture ====================================}
-
-function    AVICapSM(hwnd: HWND; m: UINT; w: WPARAM; l: LPARAM): DWORD;
-begin
-    if IsWindow(hwnd) then
-        Result := SendMessage(hwnd,m,w,l)
-    else
-        Result := 0;
-end;
-
-{-- Message crackers for above -----------------------------------------------}
-
-function    capSetCallbackOnError(hwnd: HWND; fpProc: TCAPERRORCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_ERROR, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnStatus(hwnd: HWND; fpProc: TCAPSTATUSCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_STATUS, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnYield(hwnd: HWND; fpProc: TCAPYIELDCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_YIELD, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnFrame(hwnd: HWND; fpProc: TCAPVIDEOCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_FRAME, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnVideoStream(hwnd: HWND; fpProc: TCAPVIDEOCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnWaveStream(hwnd: HWND; fpProc: TCAPWAVECALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_WAVESTREAM, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetCallbackOnCapControl(hwnd: HWND; fpProc: TCAPCONTROLCALLBACK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, LPARAM(@fpProc)) <> 0;
-end;
-
-function    capSetUserData(hwnd: HWND; lUser: DWORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_USER_DATA, 0, lUser) <> 0;
-end;
-
-function    capGetUserData(hwnd: HWND): DWORD;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_USER_DATA, 0, 0);
-end;
-
-function    capDriverConnect(hwnd: HWND; i: INT): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DRIVER_CONNECT, i, 0) <> 0;
-end;
-
-function    capDriverDisconnect(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0) <> 0;
-end;
-
-function    capDriverGetName(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DRIVER_GET_NAME, wSize, LPARAM(szName)) <> 0;
-end;
-
-function    capDriverGetVersion(hwnd: HWND; szVer: LPSTR; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DRIVER_GET_VERSION, wSize, LPARAM(szVer)) <> 0;
-end;
-
-function    capDriverGetCaps(hwnd: HWND; s: PCAPDRIVERCAPS; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DRIVER_GET_CAPS, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capFileSetCaptureFile(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_SET_CAPTURE_FILE, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capFileGetCaptureFile(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_GET_CAPTURE_FILE, wSize, LPARAM(szName)) <> 0;
-end;
-
-function    capFileAlloc(hwnd: HWND; dwSize: DWORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_ALLOCATE, 0, dwSize) <> 0;
-end;
-
-function    capFileSaveAs(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_SAVEAS, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capFileSetInfoChunk(hwnd: HWND; lpInfoChunk: PCAPINFOCHUNK): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_SET_INFOCHUNK, 0, LPARAM(lpInfoChunk)) <> 0;
-end;
-
-function    capFileSaveDIB(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_FILE_SAVEDIB, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capEditCopy(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_EDIT_COPY, 0, 0) <> 0;
-end;
-
-function    capSetAudioFormat(hwnd: HWND; s: PWAVEFORMATEX; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_AUDIOFORMAT, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capGetAudioFormat(hwnd: HWND; s: PWAVEFORMATEX; wSize: WORD): DWORD;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, wSize, LPARAM(s));
-end;
-
-function    capGetAudioFormatSize(hwnd: HWND): DWORD;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_AUDIOFORMAT, 0, 0);
-end;
-
-function    capDlgVideoFormat(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0) <> 0;
-end;
-
-function    capDlgVideoSource(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DLG_VIDEOSOURCE, 0, 0) <> 0;
-end;
-
-function    capDlgVideoDisplay(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DLG_VIDEODISPLAY, 0, 0) <> 0;
-end;
-
-function    capDlgVideoCompression(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_DLG_VIDEOCOMPRESSION, 0, 0) <> 0;
-end;
-
-function    capGetVideoFormat(hwnd: HWND; s: PVOID; wSize: WORD): DWORD;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, wSize, LPARAM(s));
-end;
-
-function    capGetVideoFormatSize(hwnd: HWND): DWORD;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_VIDEOFORMAT, 0, 0);
-end;
-
-function    capSetVideoFormat(hwnd: HWND; s: PVOID; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_VIDEOFORMAT, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capPreview(hwnd: HWND; f: BOOL): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_PREVIEW, WPARAM(f), 0) <> 0;
-end;
-
-function    capPreviewRate(hwnd: HWND; wMS: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_PREVIEWRATE, wMS, 0) <> 0;
-end;
-
-function    capOverlay(hwnd: HWND; f: BOOL): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_OVERLAY, WPARAM(f), 0) <> 0;
-end;
-
-function    capPreviewScale(hwnd: HWND; f: BOOL): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_SCALE, WPARAM(f), 0) <> 0;
-end;
-
-function    capGetStatus(hwnd: HWND; s: PCAPSTATUS; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_STATUS, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capSetScrollPos(hwnd: HWND; lpP: PPOINT): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_SCROLL, 0, LPARAM(lpP)) <> 0;
-end;
-
-function    capGrabFrame(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GRAB_FRAME, 0, 0) <> 0;
-end;
-
-function    capGrabFrameNoStop(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GRAB_FRAME_NOSTOP, 0, 0) <> 0;
-end;
-
-function    capCaptureSequence(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SEQUENCE, 0, 0) <> 0;
-end;
-
-function    capCaptureSequenceNoFile(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SEQUENCE_NOFILE, 0, 0) <> 0;
-end;
-
-function    capCaptureStop(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_STOP, 0, 0) <> 0;
-end;
-
-function    capCaptureAbort(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_ABORT, 0, 0) <> 0;
-end;
-
-function    capCaptureSingleFrameOpen(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_OPEN, 0, 0) <> 0;
-end;
-
-function    capCaptureSingleFrameClose(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SINGLE_FRAME_CLOSE, 0, 0) <> 0;
-end;
-
-function    capCaptureSingleFrame(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SINGLE_FRAME, 0, 0) <> 0;
-end;
-
-function    capCaptureGetSetup(hwnd: HWND; s: PCAPTUREPARMS; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_SEQUENCE_SETUP, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capCaptureSetSetup(hwnd: HWND; s: PCAPTUREPARMS; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_SEQUENCE_SETUP, wSize, LPARAM(s)) <> 0;
-end;
-
-function    capSetMCIDeviceName(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_SET_MCI_DEVICE, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capGetMCIDeviceName(hwnd: HWND; szName: LPSTR; wSize: WORD): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_GET_MCI_DEVICE, wSize, LPARAM(szName)) <> 0;
-end;
-
-function    capPaletteOpen(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_PAL_OPEN, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capPaletteSave(hwnd: HWND; szName: LPCSTR): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_PAL_SAVE, 0, LPARAM(szName)) <> 0;
-end;
-
-function    capPalettePaste(hwnd: HWND): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_PAL_PASTE, 0, 0) <> 0;
-end;
-
-function    capPaletteAuto(hwnd: HWND; iFrames, iColors: INT): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_PAL_AUTOCREATE, iFrames, iColors) <> 0;
-end;
-
-function    capPaletteManual(hwnd: HWND; fGrab: BOOL; iColors: INT): BOOL;
-begin
-    Result  := AVICapSM(hwnd, WM_CAP_PAL_MANUALCREATE, WPARAM(fGrab), iColors) <> 0;
-end;
-
-{== Externals ================================================================}
-
-const
-    VFWDLL      = 'MSVFW32.DLL';
-    AVIFILDLL   = 'AVIFIL32.DLL';
-    AVICAPDLL   = 'AVICAP32.DLL';
-
-{-- Returns version of VFW ---------------------------------------------------}
-
-function    VideoForWindowsVersion: DWord; pascal; external VFWDLL;
-
-{-- Call these to start stop using VfW from your app -------------------------}
-
-{ TODO: Where are these functions? }
-                            {
- function    InitVFW: LONG; stdcall;
- function    TermVFW: LONG; stdcall; }
-
-{-- ICM function declarations ------------------------------------------------}
-
-function    ICInfo(fccType, fccHandler: DWORD; lpicinfo: PICINFO) : BOOL ; stdcall ; external VFWDLL;
-function    ICInstall(fccType, fccHandler: DWORD; lParam: LPARAM; szDesc: LPSTR; wFlags: UINT) : BOOL ; stdcall ; external VFWDLL;
-function    ICRemove(fccType, fccHandler: DWORD; wFlags: UINT) : BOOL ; stdcall ; external VFWDLL;
-function    ICGetInfo(hic: HIC; picinfo: PICINFO; cb: DWORD) : DWORD ; stdcall ; external VFWDLL;
-
-function    ICOpen(fccType, fccHandler: DWORD; wMode: UINT) : HIC ; stdcall ; external VFWDLL;
-function    ICOpenFunction(fccType, fccHandler: DWORD; wMode: UINT; lpfnHandler: TFarProc) : HIC ; stdcall ; external VFWDLL;
-function    ICClose(hic: HIC) : DWORD ; stdcall ; external VFWDLL;
-
-function    ICSendMessage(hic: HIC; msg: UINT; dw1, dw2: DWORD) : DWORD ; stdcall ; external VFWDLL;
-
-{== Compression functions ====================================================}
-
-{-- ICCompress() - compress a single frame -----------------------------------}
-
-function    ICCompress(
-    hic             : HIC;
-    dwFlags         : DWORD;                // flags
-    lpbiOutput      : PBITMAPINFOHEADER;    // output format
-    lpData          : PVOID;                // output data
-    lpbiInput       : PBITMAPINFOHEADER;    // format of frame to compress
-    lpBits          : PVOID;                // frame data to compress
-    lpckid          : PDWORD;               // ckid for data in AVI file
-    lpdwFlags       : PDWORD;               // flags in the AVI index.
-    lFrameNum       : DWORD;                 // frame number of seq.
-    dwFrameSize     : DWORD;                // reqested size in bytes. (if non zero)
-    dwQuality       : DWORD;                // quality within one frame
-    lpbiPrev        : PBITMAPINFOHEADER;    // format of previous frame
-    lpPrev          : PVOID                 // previous frame
-    ) : DWORD; cdecl; external VFWDLL;
-
-{== Decompression functions ==================================================}
-
-{-- ICDecompress() - decompress a single frame -------------------------------}
-
-function    ICDecompress(
-    hic             : HIC;
-    dwFlags         : DWORD;                // flags (from AVI index...)
-    lpbiFormat      : PBITMAPINFOHEADER;    // BITMAPINFO of compressed data
-                                            // biSizeImage has the chunk size
-    lpData          : PVOID;                // data
-    lpbi            : PBITMAPINFOHEADER;    // DIB to decompress to
-    lpBits          : PVOID
-    ): DWORD; cdecl; external VFWDLL;
-
-{== Drawing functions ========================================================}
-
-{-- ICDrawBegin() - start decompressing data with fmt directly to screen -----}
-
-// return zero if the decompressor supports drawing.
-
-function    ICDrawBegin(
-    hic         : HIC;
-    dwFlags     : DWORD;                // flags
-    hpal        : HPALETTE;             // palette to draw with
-    hwnd        : HWND;                 // window to draw to
-    hdc         : HDC;                  // HDC to draw to
-    xDst        : int;                  // destination rectangle
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;    // format of frame to draw
-    xSrc        : int;                  // source rectangle
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    dwRate      : DWORD;                // frames/second = (dwRate/dwScale)
-    dwScale     : DWORD
-    ): DWORD; cdecl; external VFWDLL;
-
-{-- ICDraw() - decompress data directly to the screen ------------------------}
-
-function    ICDraw(
-    hic         : HIC;
-    dwFlags     : DWORD;                // flags
-    lpFormat    : PVOID;                // format of frame to decompress
-    lpData      : PVOID;                // frame data to decompress
-    cbData      : DWORD;                // size of data
-    lTime       : DWORD                  // time to draw this frame
-    ): DWORD; cdecl; external VFWDLL;
-
-{== Helper routines for DrawDib and MCIAVI... ================================}
-
-function    ICLocate(fccType, fccHandler: DWORD; lpbiIn, lpbiOut: PBITMAPINFOHEADER; wFlags: WORD): HIC; stdcall; external VFWDLL;
-function    ICGetDisplayFormat(hic: HIC; lpbiIn, lpbiOut: PBITMAPINFOHEADER; BitDepth: int; dx, dy: int): HIC; stdcall; external VFWDLL;
-
-{== Higher level functions ===================================================}
-
-function    ICImageCompress(
-    hic         : HIC;                  // compressor to use
-    uiFlags     : UINT;                 // flags (none yet)
-    lpbiIn      : PBITMAPINFO;          // format to compress from
-    lpBits      : PVOID;                // data to compress
-    lpbiOut     : PBITMAPINFO;          // compress to this (NULL ==> default)
-    lQuality    : LONG;                 // quality to use
-    plSize      : PDWORD                 // compress to this size (0=whatever)
-    ): THANDLE; stdcall; external VFWDLL;
-
-function    ICImageDecompress(
-    hic         : HIC;                  // compressor to use
-    uiFlags     : UINT;                 // flags (none yet)
-    lpbiIn      : PBITMAPINFO;          // format to decompress from
-    lpBits      : PVOID;                // data to decompress
-    lpbiOut     : PBITMAPINFO           // decompress to this (NULL ==> default)
-    ): THANDLE; stdcall; external VFWDLL;
-
-{-- ICCompressorChoose() - allows user to choose compressor, quality etc... --}
-
-function    ICCompressorChoose(
-    hwnd        : HWND;                     // parent window for dialog
-    uiFlags     : UINT;                     // flags
-    pvIn        : PVOID;                    // input format (optional)
-    lpData      : PVOID;                    // input data (optional)
-    pc          : PCOMPVARS;                // data about the compressor/dlg
-    lpszTitle   : LPSTR                     // dialog title (optional)
-    ): BOOL; stdcall; external VFWDLL;
-
-function    ICSeqCompressFrameStart(pc: PCOMPVARS; lpbiIn: PBITMAPINFO): BOOL; stdcall; external VFWDLL;
-procedure   ICSeqCompressFrameEnd(pc: PCOMPVARS); stdcall; external VFWDLL;
-
-function    ICSeqCompressFrame(
-    pc          : PCOMPVARS;                // set by ICCompressorChoose
-    uiFlags     : UINT;                     // flags
-    lpBits      : PVOID;                    // input DIB bits
-    pfKey       : PBOOL;                    // did it end up being a key frame?
-    plSize      : PDWORD                     // size to compress to/of returned image
-    ): PVOID; stdcall; external VFWDLL;
-
-procedure   ICCompressorFree(pc: PCOMPVARS); stdcall; external VFWDLL;
-
-{== DrawDib functions ========================================================}
-
-{-- DrawDibOpen() ------------------------------------------------------------}
-
-function    DrawDibOpen: HDRAWDIB; stdcall; external VFWDLL;
-
-{-- DrawDibClose() -----------------------------------------------------------}
-
-function    DrawDibClose(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibGetBuffer() -------------------------------------------------------}
-
-function    DrawDibGetBuffer(hdd: HDRAWDIB; lpbi: PBITMAPINFOHEADER; dwSize: DWORD; dwFlags: DWORD): PVOID; stdcall; external VFWDLL;
-
-{-- DrawDibGetPalette() - get the palette used for drawing DIBs --------------}
-
-function    DrawDibGetPalette(hdd: HDRAWDIB): HPALETTE; stdcall; external VFWDLL;
-
-{-- DrawDibSetPalette() - set the palette used for drawing DIBs --------------}
-
-function    DrawDibSetPalette(hdd: HDRAWDIB; hpal: HPALETTE): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibChangePalette() ---------------------------------------------------}
-
-function    DrawDibChangePalette(hdd: HDRAWDIB; iStart, iLen: int; lppe: PPALETTEENTRY): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibRealize() - realize the palette in a HDD --------------------------}
-
-function    DrawDibRealize(hdd: HDRAWDIB; hdc: HDC; fBackground: BOOL): UINT; stdcall; external VFWDLL;
-
-{-- DrawDibStart() - start of streaming playback -----------------------------}
-
-function    DrawDibStart(hdd: HDRAWDIB; rate: DWORD): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibStop() - start of streaming playback ------------------------------}
-
-function    DrawDibStop(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibBegin() - prepare to draw -----------------------------------------}
-
-function    DrawDibBegin(
-    hdd         : HDRAWDIB;
-    hdc         : HDC;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;
-    dxSrc       : int;
-    dySrc       : int;
-    wFlags      : UINT
-    ): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibDraw() - actually draw a DIB to the screen ------------------------}
-
-function    DrawDibDraw(
-    hdd         : HDRAWDIB;
-    hdc         : HDC;
-    xDst        : int;
-    yDst        : int;
-    dxDst       : int;
-    dyDst       : int;
-    lpbi        : PBITMAPINFOHEADER;
-    lpBits      : PVOID;
-    xSrc        : int;
-    ySrc        : int;
-    dxSrc       : int;
-    dySrc       : int;
-    wFlags      : UINT
-    ): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibEnd() -------------------------------------------------------------}
-
-function    DrawDibEnd(hdd: HDRAWDIB): BOOL; stdcall; external VFWDLL;
-
-{-- DrawDibTime() - for debugging purposes only ------------------------------}
-
-function    DrawDibTime(hdd: HDRAWDIB; lpddtime: PDRAWDIBTIME): BOOL; stdcall; external VFWDLL;
-
-{-- Display profiling --------------------------------------------------------}
-
-function    DrawDibProfileDisplay(lpbi: PBITMAPINFOHEADER): DWORD; stdcall; external VFWDLL;
-
-{-- Functions ----------------------------------------------------------------}
-
-procedure   AVIFileInit; stdcall; external AVIFILDLL; // Call this first!
-procedure   AVIFileExit; stdcall; external AVIFILDLL;
-
-function    AVIFileAddRef(pfile: IAVIFILE): ULONG; stdcall; external AVIFILDLL;
-function    AVIFileRelease(pfile: IAVIFILE): ULONG; stdcall; external AVIFILDLL;
-
-function    AVIFileOpenA(var ppfile: IAVIFILE; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall; external AVIFILDLL;
-function    AVIFileOpenW(var ppfile: IAVIFILE; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall; external AVIFILDLL;
-
-{$IFDEF UNICODE}
-function    AVIFileOpen(var ppfile: IAVIFILE; szFile: LPCWSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;  external AVIFILDLL name 'AVIFileOpenW';
-{$ELSE}
-function    AVIFileOpen(var ppfile: IAVIFILE; szFile: LPCSTR; uMode: UINT; lpHandler: PCLSID): HResult; stdcall;  external AVIFILDLL name 'AVIFileOpenA';
-{$ENDIF}
-
-function    AVIFileInfoW(pfile: IAVIFILE; var pfi: TAVIFILEINFOW; lSize: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIFileInfoA(pfile: IAVIFILE; var pfi: TAVIFILEINFOA; lSize: LONG): HResult; stdcall; external AVIFILDLL;
-
-{$IFDEF UNICODE}
-function    AVIFileInfo(pfile: IAVIFILE; var pfi: TAVIFILEINFO; lSize: LONG): HResult; stdcall;  external AVIFILDLL name 'AVIFileInfoW';
-{$ELSE}
-function    AVIFileInfo(pfile: IAVIFILE; var pfi: TAVIFILEINFO; lSize: LONG): HResult; stdcall;  external AVIFILDLL name 'AVIFileInfoA';
-{$ENDIF}
-
-function    AVIFileGetStream(pfile: IAVIFILE; var ppavi: IAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall; external AVIFILDLL;
-
-function    AVIFileCreateStreamW(pfile: IAVIFILE; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOW): HResult; stdcall; external AVIFILDLL;
-function    AVIFileCreateStreamA(pfile: IAVIFILE; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFOA): HResult; stdcall; external AVIFILDLL;
-
-{$IFDEF UNICODE}
-function    AVIFileCreateStream(pfile: IAVIFILE; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFO): HResult; stdcall; external AVIFILDLL name 'AVIFileCreateStreamW';
-{$ELSE}
-function    AVIFileCreateStream(pfile: IAVIFILE; var ppavi: IAVISTREAM; var psi: TAVISTREAMINFO): HResult; stdcall; external AVIFILDLL name 'AVIFileCreateStreamA';
-{$ENDIF}
-
-function    AVIFileWriteData(pfile: IAVIFILE; ckid: DWORD; lpData: PVOID; cbData: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIFileReadData(pfile: IAVIFILE; ckid: DWORD; lpData: PVOID; var lpcbData: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIFileEndRecord(pfile: IAVIFILE): HResult; stdcall; external AVIFILDLL;
-
-function    AVIStreamAddRef(pavi: IAVISTREAM): ULONG; stdcall; external AVIFILDLL;
-function    AVIStreamRelease(pavi: IAVISTREAM): ULONG; stdcall; external AVIFILDLL;
-
-function    AVIStreamInfoW (pavi: IAVISTREAM; var psi: TAVISTREAMINFOW; lSize: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamInfoA (pavi: IAVISTREAM; var psi: TAVISTREAMINFOA; lSize: LONG): HResult; stdcall; external AVIFILDLL;
-
-{$IFDEF UNICODE}
-function    AVIStreamInfo(pavi: IAVISTREAM; var psi: TAVISTREAMINFO; lSize: LONG): HResult; stdcall; external AVIFILDLL name 'AVIStreamInfoW';
-{$ELSE}
-function    AVIStreamInfo(pavi: IAVISTREAM; var psi: TAVISTREAMINFO; lSize: LONG): HResult; stdcall; external AVIFILDLL name 'AVIStreamInfoA';
-{$ENDIF}
-
-
-function    AVIStreamFindSample(pavi: IAVISTREAM; lPos: LONG; lFlags: LONG): LONG; stdcall; external AVIFILDLL;
-function    AVIStreamReadFormat(pavi: IAVISTREAM; lPos: LONG; lpFormat: PVOID; lpcbFormat: PLONG): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamSetFormat(pavi: IAVISTREAM; lPos: LONG; lpFormat: PVOID; cbFormat: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamReadData(pavi: IAVISTREAM; fcc: DWORD; lp: PVOID; lpcb: PLONG): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamWriteData(pavi: IAVISTREAM; fcc: DWORD; lp: PVOID; cb: LONG): HResult; stdcall; external AVIFILDLL;
-
-function    AVIStreamRead(
-    pavi            : IAVISTREAM;
-    lStart          : LONG;
-    lSamples        : LONG;
-    lpBuffer        : PVOID;
-    cbBuffer        : LONG;
-    plBytes         : PLONG;
-    plSamples       : PLONG
-    ): HResult; stdcall; external AVIFILDLL;
-
-function    AVIStreamWrite(
-    pavi            : IAVISTREAM;
-    lStart          : LONG;
-    lSamples        : LONG;
-    lpBuffer        : PVOID;
-    cbBuffer        : LONG;
-    dwFlags         : DWORD;
-    plSampWritten   : PLONG;
-    plBytesWritten  : PLONG
-    ): HResult; stdcall; external AVIFILDLL;
-
-// Right now, these just use AVIStreamInfo() to get information, then
-// return some of it.  Can they be more efficient?
-
-function    AVIStreamStart(pavi: IAVISTREAM): LONG; stdcall; external AVIFILDLL;
-function    AVIStreamLength(pavi: IAVISTREAM): LONG; stdcall; external AVIFILDLL;
-function    AVIStreamTimeToSample(pavi: IAVISTREAM; lTime: LONG): LONG; stdcall; external AVIFILDLL;
-function    AVIStreamSampleToTime(pavi: IAVISTREAM; lSample: LONG): LONG; stdcall; external AVIFILDLL;
-
-function    AVIStreamBeginStreaming(pavi: IAVISTREAM; lStart, lEnd: LONG; lRate: LONG): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamEndStreaming(pavi: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-
-{-- Helper functions for using IGetFrame -------------------------------------}
-
-function    AVIStreamGetFrameOpen_(pavi: IAVISTREAM; lpbiWanted: PBitmapInfoHeader): pointer; stdcall; external AVIFILDLL name 'AVIStreamGetFrameOpen';
-function    AVIStreamGetFrame(pg: IGETFRAME; lPos: LONG): PBitmapInfoHeader; stdcall; external AVIFILDLL;
-function    AVIStreamGetFrameClose(pg: IGETFRAME): HResult; stdcall; external AVIFILDLL;
-
-function    AVIStreamGetFrameOpen(pavi: IAVIStream; lpbiWanted: PBitmapInfoHeader): IGetFrame; stdcall;
-begin
-  pointer(Result) := AVIStreamGetFrameOpen_(pavi, lpbiWanted);
-end;
-
-// !!! We need some way to place an advise on a stream....
-// STDAPI AVIStreamHasChanged   (PAVISTREAM pavi);
-
-{-- Shortcut function --------------------------------------------------------}
-
-function    AVIStreamOpenFromFileA(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
-                                   lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall; external AVIFILDLL;
-function    AVIStreamOpenFromFileW(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
-                                   lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall; external AVIFILDLL;
-
-{$IFDEF UNICODE}
-function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCWSTR; fccType: DWORD;
-  lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall; external AVIFILDLL name 'AVIStreamOpenFromFileW';
-{$ELSE}
-function AVIStreamOpenFromFile(var ppavi: IAVISTREAM; szFile: LPCSTR; fccType: DWORD;
-  lParam: LONG; mode: UINT; pclsidHandler: PCLSID): HResult; stdcall; external AVIFILDLL name 'AVIStreamOpenFromFileA';
-{$ENDIF}
-
-{-- Use to create disembodied streams ----------------------------------------}
-
-function    AVIStreamCreate(var ppavi: IAVISTREAM; lParam1, lParam2: LONG;
-                            pclsidHandler: PCLSID): HResult; stdcall; external AVIFILDLL;
-
-// PHANDLER    AVIAPI AVIGetHandler         (PAVISTREAM pavi, PAVISTREAMHANDLER psh);
-// PAVISTREAM  AVIAPI AVIGetStream          (PHANDLER p);
-
-{-- Stuff to support backward compat. ----------------------------------------}
-
-function    AVIStreamFindKeyFrame(var pavi: IAVISTREAM; lPos: LONG; lFlags: LONG): DWORD; stdcall; external AVIFILDLL name 'AVIStreamFindSample';
-
-// Non-portable: this is alias for method name
-// FindKeyFrame FindSample
-
-function    AVIStreamClose(pavi: IAVISTREAM): ULONG; stdcall; external AVIFILDLL name 'AVIStreamRelease';
-function    AVIFileClose(pfile: IAVIFILE): ULONG; stdcall; external AVIFILDLL name 'AVIFileRelease';
-procedure   AVIStreamInit; stdcall; external AVIFILDLL name 'AVIFileInit';
-procedure   AVIStreamExit; stdcall; external AVIFILDLL name 'AVIFileExit';
-
-{== AVISave routines and structures ==========================================}
-
-function    AVIMakeCompressedStream(
-    var ppsCompressed   : IAVISTREAM;
-    ppsSource           : IAVISTREAM;
-    lpOptions           : PAVICOMPRESSOPTIONS;
-    pclsidHandler       : PCLSID
-    ): HResult; stdcall; external AVIFILDLL;
-
-// Non-portable: uses variable number of params
-// EXTERN_C HRESULT CDECL AVISaveA (LPCSTR               szFile,
-//      CLSID FAR *pclsidHandler,
-//      AVISAVECALLBACK     lpfnCallback,
-//      int                 nStreams,
-//      PAVISTREAM      pfile,
-//      LPAVICOMPRESSOPTIONS lpOptions,
-//      ...);
-
-function    AVISaveVA(
-    szFile          : LPCSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall; external AVIFILDLL;
-
-// Non-portable: uses variable number of params
-// EXTERN_C HRESULT CDECL AVISaveW (LPCWSTR               szFile,
-//      CLSID FAR *pclsidHandler,
-//      AVISAVECALLBACK     lpfnCallback,
-//      int                 nStreams,
-//      PAVISTREAM      pfile,
-//      LPAVICOMPRESSOPTIONS lpOptions,
-//      ...);
-
-function    AVISaveVW(
-    szFile          : LPCWSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall; external AVIFILDLL;
-
-// #define AVISave      AVISaveA
-
-function    AVISaveV(
-    szFile          : LPCSTR;
-    pclsidHandler   : PCLSID;
-    lpfnCallback    : TAVISAVECALLBACK;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): HResult; stdcall; external AVIFILDLL name 'AVISaveVA';
-
-function    AVISaveOptions(
-    hwnd            : HWND;
-    uiFlags         : UINT;
-    nStreams        : int;
-    var ppavi       : IAVISTREAM;
-    var plpOptions  : PAVICOMPRESSOPTIONS
-    ): BOOL; stdcall; external AVIFILDLL;
-
-function    AVISaveOptionsFree(nStreams: int; var plpOptions: PAVICOMPRESSOPTIONS): HResult; stdcall; external AVIFILDLL;
-
-{-----------------------------------------------------------------------------}
-
-function    AVIBuildFilterW(lpszFilter: LPWSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall; external AVIFILDLL;
-function    AVIBuildFilterA(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall; external AVIFILDLL;
-
-function    AVIBuildFilter(lpszFilter: LPSTR; cbFilter: LONG; fSaving: BOOL): HResult; stdcall; external AVIFILDLL name 'AVIBuildFilterA';
-
-function    AVIMakeFileFromStreams(var ppfile: IAVIFILE; nStreams: int; var papStreams: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-
-function    AVIMakeStreamFromClipboard(cfFormat: UINT; hGlobal: THANDLE; var ppstream: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-
-{-- Clipboard routines -------------------------------------------------------}
-
-function    AVIPutFileOnClipboard(pf: IAVIFILE): HResult; stdcall; external AVIFILDLL;
-function    AVIGetFromClipboard(var lppf: IAVIFILE): HResult; stdcall; external AVIFILDLL;
-function    AVIClearClipboard: HResult; stdcall; external AVIFILDLL;
-
-{-- Editing routines ---------------------------------------------------------}
-
-function    CreateEditableStream(var ppsEditable: IAVISTREAM; psSource: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-
-function    EditStreamCut(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-function    EditStreamCopy(pavi: IAVISTREAM; var plStart, plLength: LONG; var ppResult: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-function    EditStreamPaste(pavi: IAVISTREAM; var plPos, plLength: LONG; pstream: IAVISTREAM; lStart, lEnd: LONG): HResult; stdcall; external AVIFILDLL;
-function    EditStreamClone(pavi: IAVISTREAM; var ppResult: IAVISTREAM): HResult; stdcall; external AVIFILDLL;
-
-function    EditStreamSetNameA(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall; external AVIFILDLL;
-function    EditStreamSetNameW(pavi: IAVISTREAM; lpszName: LPCWSTR): HResult; stdcall; external AVIFILDLL;
-function    EditStreamSetInfoW(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOW; cbInfo: LONG): HResult; stdcall; external AVIFILDLL;
-function    EditStreamSetInfoA(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall; external AVIFILDLL;
-
-function    EditStreamSetInfo(pavi: IAVISTREAM; lpInfo: PAVISTREAMINFOA; cbInfo: LONG): HResult; stdcall; external AVIFILDLL name 'EditStreamSetInfoA';
-function    EditStreamSetName(pavi: IAVISTREAM; lpszName: LPCSTR): HResult; stdcall; external AVIFILDLL name 'EditStreamSetNameA';
-
-{-- MCIWnd -------------------------------------------------------------------}
-
-function    MCIWndCreateA(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl; external VFWDLL;
-function    MCIWndCreateW(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCWSTR): HWND; cdecl; external VFWDLL;
-
-function    MCIWndCreate(hwndParent: HWND; hInstance: HINST; dwStyle: DWORd; szFile: LPCSTR): HWND; cdecl;  external VFWDLL name 'MCIWndCreateA';
-
-function    MCIWndRegisterClass: BOOL; cdecl; external VFWDLL;
-
-{== AVICAP - Window class for AVI capture ====================================}
-
-{-- The only exported functions from AVICAP.DLL ------------------------------}
-
-function    capCreateCaptureWindowA(
-    lpszWindowName      : LPCSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall; external AVICAPDLL;
-
-function    capGetDriverDescriptionA(
-    wDriverIndex        : UINT;
-    lpszName            : LPSTR;
-    cbName              : int;
-    lpszVer             : LPSTR;
-    cbVer               : int
-    ): BOOL; stdcall; external AVICAPDLL;
-
-function    capCreateCaptureWindowW(
-    lpszWindowName      : LPCWSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall; external AVICAPDLL;
-
-function    capGetDriverDescriptionW(
-    wDriverIndex        : UINT;
-    lpszName            : LPWSTR;
-    cbName              : int;
-    lpszVer             : LPWSTR;
-    cbVer               : int
-    ): BOOL; stdcall; external AVICAPDLL;
-
-function    capCreateCaptureWindow(
-    lpszWindowName      : LPCSTR;
-    dwStyle             : DWORD;
-    x, y                : int;
-    nWidth, nHeight     : int;
-    hwndParent          : HWND;
-    nID                 : int
-    ): HWND; stdcall; external AVICAPDLL name 'capCreateCaptureWindowA';
-
-function    capGetDriverDescription(
-    wDriverIndex        : UINT;
-    lpszName            : LPSTR;
-    cbName              : int;
-    lpszVer             : LPSTR;
-    cbVer               : int
-    ): BOOL; stdcall; external AVICAPDLL name 'capGetDriverDescriptionA';
-
-{== FilePreview dialog =======================================================}
-
-function GetOpenFileNamePreviewA(lpofn: POPENFILENAMEA): BOOL; stdcall; external VFWDLL;
-function GetSaveFileNamePreviewA(lpofn: POPENFILENAMEA): BOOL; stdcall; external VFWDLL;
-
-function GetOpenFileNamePreviewW(lpofn: POPENFILENAMEW): BOOL; stdcall; external VFWDLL;
-function GetSaveFileNamePreviewW(lpofn: POPENFILENAMEW): BOOL; stdcall; external VFWDLL;
-
-function GetOpenFileNamePreview(lpofn: POPENFILENAMEA): BOOL; stdcall; external VFWDLL name 'GetOpenFileNamePreviewA';
-function GetSaveFileNamePreview(lpofn: POPENFILENAMEA): BOOL; stdcall; external VFWDLL name 'GetSaveFileNamePreviewA';
-
-end.

+ 1 - 1
Source/FMX/GLSLx.ProjectedTextures.pas

@@ -34,7 +34,7 @@ uses
   GLX.Color,
   GLX.RenderContextInfo,
   Scena.TextureFormat,
-  GLX.PipelineTransformation,
+  Scena.PipelineTransformation,
   Scena.VectorTypes;
 
 type

+ 1 - 1
Source/FMX/GLX.AVIRecorder.pas

@@ -25,7 +25,7 @@ uses
   GLX.Scene,
   GLX.SceneViewer,
 
-  Formatx.VFW;
+  Formats.VFW;
 
 type
   TAVICompressor = (acDefault, acShowDialog, acDivX);

+ 5 - 6
Source/FMX/GLX.Context.pas

@@ -28,12 +28,11 @@ uses
   FMX.Dialogs,
 
  // GXL.OpenGLx,
-  GLX.Generics,
+  Scena.VectorTypes,
   Scena.VectorGeometry,
   Scena.Strings,
-  Scena.VectorTypes,
   GLX.State,
-  GLX.PipelineTransformation,
+  Scena.PipelineTransformation,
   Scena.TextureFormat;
 
 // Buffer ID's for Multiple-Render-Targets (using GL_ATI_draw_buffers)
@@ -116,7 +115,7 @@ type
   protected
     FGLX: TgxAbstractMultitextureCoordinator;
     FgxStates: TgxStateCache;
-    FTransformation: TgxTransformation;
+    FTransformation: TGLTransformation;
     FAcceleration: TgxContextAcceleration;
     FLayer: TgxContextLayer;
 {$IFDEF USE_MULTITHREAD}
@@ -142,7 +141,7 @@ type
     destructor Destroy; override;
     // An application-side cache of global per-context OpenGL states and parameters
     property GXStates: TgxStateCache read FgxStates;
-    property PipelineTransformation: TgxTransformation read FTransformation;
+    property PipelineTransformation: TGLTransformation read FTransformation;
     // Context manager reference
     property Manager: TgxContextManager read FManager;
     // Color bits for the rendering context
@@ -1035,7 +1034,7 @@ begin
   FSharedContexts.Add(Self);
   FAcceleration := chaUnknown;
   FgxStates := TgxStateCache.Create;
-  FTransformation := TgxTransformation.Create;
+  FTransformation := TGLTransformation.Create;
   FTransformation.LoadMatricesEnabled := True;
   GXContextManager.RegisterContext(Self);
   FIsPraparationNeed := True;

+ 1 - 1
Source/FMX/GLX.FBORenderer.pas

@@ -27,7 +27,7 @@ uses
   GLX.Material,
   GLX.RenderContextInfo,
   GLX.State,
-  GLX.PipelineTransformation,
+  Scena.PipelineTransformation,
   Scena.TextureFormat,
   Scena.VectorTypes,
   GLX.MultisampleImage;

+ 1 - 1
Source/FMX/GLX.Feedback.pas

@@ -38,7 +38,7 @@ uses
   GLX.RenderContextInfo,
   GLX.Context,
   GLX.State,
-  GLX.PipelineTransformation,
+  Scena.PipelineTransformation,
   GLX.MeshUtils;
 
 type

+ 1 - 1
Source/FMX/GLX.FileLWO.pas

@@ -19,7 +19,7 @@ uses
   GLX.Material,
   GLX.VectorFileObjects,
 
-  Formatx.LWObjects;
+  Formats.LWO;
 
 type
   TgxLWOVectorFile = class(TgxVectorFile)

+ 1 - 1
Source/FMX/GLX.FileQ3BSP.pas

@@ -31,7 +31,7 @@ uses
   GLX.Material,
   Scena.TextureFormat,
 
-  Formatx.Q3BSP;
+  Formats.Q3BSP;
 
 type
 

+ 1 - 1
Source/FMX/GLX.FireFX.pas

@@ -27,7 +27,7 @@ uses
   GLX.Coordinates,
   GLX.RenderContextInfo,
   GLX.State,
-  GLX.PipelineTransformation,
+  Scena.PipelineTransformation,
   Scena.TextureFormat;
 
 type

+ 0 - 428
Source/FMX/GLX.Generics.pas

@@ -1,428 +0,0 @@
-//
-// The graphics platform GLXcene https://github.com/glscene
-//
-unit GLX.Generics;
-
-(* Cross IDE generic classes collection *)
-
-
-interface
-
-{$I Scena.inc}
-
-{.$DEFINE GENERIC_PREFIX}
-
-uses
-  System.SysUtils,
-  System.Classes,
-  System.SyncObjs;
-
-const
-  MaxListSize = Maxint div 16;
-
-type
-
-
-{$IFDEF GENERIC_PREFIX}
-  generic
-{$ENDIF}
-  GList<T> = class(TObject)
-  public
-    type
-    TListChangeEvent = procedure(Sender: TObject; const Item: T;
-      Action: TListNotification) of object;
-//    var
-  private
-    FItems: array of T;
-    FCount: Integer;
-    FCapacity: Integer;
-//    FOnChange: TListChangeEvent;
-    FOnChange: TNotifyEvent;
-
-  protected
-    procedure SetCapacity(Value: Integer);
-    procedure SetCount(Value: Integer);
-    function GetItem(Index: Integer): T;
-    procedure SetItem(Index: Integer; const Value: T);
-    function GetItemAddress(Index: Integer): Pointer;
-    procedure Grow;
-  protected
-    procedure Notify(const Item: T; Action: TListNotification); virtual;
-  public
-    destructor Destroy; override;
-    procedure Clear;
-    function Add(AItem: T): Integer;
-    procedure Delete(Index: Integer);
-    procedure Extract(AItem: T);
-    function Remove(AItem: T): Integer;
-    function IndexOf(AItem: T): Integer;
-    procedure Insert(Index: Integer; AItem: T);
-    procedure Exchange(Index1, Index2: Integer);
-    function First: T;
-    function Last: T;
-    property Items[Index: Integer]: T read GetItem write SetItem; default;
-    property ItemAddress[Index: Integer]: Pointer read GetItemAddress;
-    property Capacity: Integer read FCapacity write SetCapacity;
-    property Count: Integer read FCount write SetCount;
-//    property OnChange: TListChangeEvent read FOnChange write FOnChange;
-    property OnChange: TNotifyEvent read FOnChange write FOnChange;
-  end;
-
-{$IFDEF GENERIC_PREFIX}
-  generic
-{$ENDIF}
-  GThreadList<T> = class
-  public
-    type
-      TLockableList = {$IFDEF GENERIC_PREFIX} specialize {$ENDIF} GList<T>;
-    var
-  private
-    FList: TLockableList;
-    FLock: TCriticalSection;
-  public
-    constructor Create;
-    destructor Destroy; override;
-    procedure Add(AItem: T);
-    procedure Clear;
-    function  LockList: TLockableList;
-    procedure Remove(AItem: T);
-    procedure UnlockList;
-  end;
-
-{$IFDEF GENERIC_PREFIX}
-  generic
-{$ENDIF}
-  GOrderedList<T> = class(TObject)
-  private
-    type
-      TOrderedList = {$IFDEF GENERIC_PREFIX} specialize {$ENDIF} GList<T>;
-    var
-      FList: TOrderedList;
-  protected
-    procedure PushItem(AItem: T); virtual; abstract;
-    function PopItem: T; virtual;
-    function PeekItem: T; virtual;
-    property List: TOrderedList read FList;
-  public
-    constructor Create; virtual;
-    destructor Destroy; override;
-
-    function Count: Integer;
-    function AtLeast(ACount: Integer): Boolean;
-    function Push(const AItem: T): T;
-    function Pop: T;
-    function Peek: T;
-  end;
-
-{$IFDEF GENERIC_PREFIX}
-  generic
-{$ENDIF}
-  GStack<T> = class({$IFDEF GENERIC_PREFIX} specialize {$ENDIF} GOrderedList<T>)
-  protected
-    procedure PushItem(AItem: T); override;
-  end;
-
-{$IFDEF GENERIC_PREFIX}
-  generic
-{$ENDIF}
-  GQueue<T> = class(GOrderedList<T>)
-  protected
-    procedure PushItem(AItem: T); override;
-  end;
-
-//=======================================================  
-implementation
-//=======================================================  
-
-
-destructor GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Destroy;
-begin
-  Clear;
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Clear;
-begin
-  SetCount(0);
-  SetCapacity(0);
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.SetCapacity(Value: Integer);
-begin
-{$IFOPT R+}
-  Assert(not (Value < FCount) or (Value > MaxListSize));
-{$ENDIF}
-  if Value <> FCapacity then
-  begin
-    SetLength(FItems, Value);
-    FCapacity := Value;
-  end;
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.SetCount(Value: Integer);
-var
-  I: Integer;
-begin
-{$IFOPT R+}
-  Assert(not (Value < 0) or (Value > MaxListSize));
-{$ENDIF}
-  if Value > FCapacity then
-    SetCapacity(Value);
-  if Value <= FCount then
-    for I := FCount - 1 downto Value do
-      Delete(I);
-  FCount := Value;
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Add(AItem: T): Integer;
-begin
-  Result := FCount;
-  if Result = FCapacity then
-    Grow;
-  FItems[Result] := AItem;
-  Inc(FCount);
-  Notify(AItem, lnAdded);
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Delete(Index: Integer);
-var
-  Temp: T;
-begin
-{$IFOPT R+}
-  Assert(Index < FCount);
-{$ENDIF}
-  Temp := FItems[Index];
-  Dec(FCount);
-  if Index < FCount then
-    Move(FItems[Index + 1], FItems[Index],
-      (FCount - Index) * SizeOf(T));
-  Notify(Temp, lnDeleted);
-end;
-
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Extract(AItem: T);
-var
-  I: Integer;
-begin
-  I := IndexOf(AItem);
-  if I >= 0 then
-  begin
-    Delete(I);
-    Notify(AItem, lnExtracted);
-  end;
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.First: T;
-begin
-  Result := GetItem(0);
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.GetItem(Index: Integer): T;
-begin
-{$IFOPT R+}
-  Assert(Index < FCount);
-{$ENDIF}
-  Result := FItems[Index];
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.GetItemAddress(Index: Integer): Pointer;
-begin
-{$IFOPT R+}
-  Assert(Index < FCount);
-{$ENDIF}
-  Result := @FItems[Index];
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.IndexOf(AItem: T): Integer;
-begin
-  for Result := 0 to FCount - 1 do
-    if CompareMem(@FItems[Result], @AItem, SizeOf(T)) then
-      exit;
-  Result := -1;
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Insert(Index: Integer; AItem: T);
-begin
-{$IFOPT R+}
-  Assert(Index < FCount);
-{$ENDIF}
-  if FCount = FCapacity then
-    Grow;
-  if Index < FCount then
-    Move(FItems[Index], FItems[Index + 1],
-      (FCount - Index) * SizeOf(T));
-  FItems[Index] := AItem;
-  Inc(FCount);
-  Notify(AItem, lnAdded);
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Exchange(Index1, Index2: Integer);
-var
-  Item: T;
-begin
-{$IFOPT R+}
-  Assert(Index1 < FCount);
-  Assert(Index2 < FCount);
-{$ENDIF}
-  Item := FItems[Index1];
-  FItems[Index1] := FItems[Index2];
-  FItems[Index2] := Item;
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Last: T;
-begin
-  if FCount > 0 then
-    Result := FItems[FCount-1];
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Notify(const Item: T; Action: TListNotification);
-begin
-//  if Assigned(FOnChange) then FOnChange(Self, Item, Action);
-  if Assigned(FOnChange) then FOnChange(Self);
-end;
-
-function GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Remove(AItem: T): Integer;
-begin
-  Result := IndexOf(AItem);
-  if Result >= 0 then
-    Delete(Result);
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.SetItem(Index: Integer; const Value: T);
-begin
-  FItems[Index] := Value;
-end;
-
-procedure GList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Grow;
-var
-  Delta: Integer;
-begin
-  if FCapacity > 64 then
-    Delta := FCapacity div 4
-  else
-    if FCapacity > 8 then
-      Delta := 16
-    else
-      Delta := 4;
-  SetCapacity(FCapacity + Delta);
-end;
-
-constructor GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Create;
-begin
-  inherited Create;
-  FLock := TCriticalSection.Create;
-  FList := TLockableList.Create;
-end;
-
-destructor GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Destroy;
-begin
-  LockList;
-  try
-    FList.Free;
-    inherited Destroy;
-  finally
-    UnlockList;
-    FLock.Free;
-  end;
-end;
-
-procedure GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Add(AItem: T);
-begin
-  LockList;
-  try
-    FList.Add(AItem)
-  finally
-    UnlockList;
-  end;
-end;
-
-procedure GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Clear;
-begin
-  LockList;
-  try
-    FList.Clear;
-  finally
-    UnlockList;
-  end;
-end;
-
-function GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.LockList: TLockableList;
-begin
-  FLock.Enter;
-  Result := FList;
-end;
-
-procedure GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Remove(AItem: T);
-begin
-  LockList;
-  try
-    FList.Remove(AItem);
-  finally
-    UnlockList;
-  end;
-end;
-
-procedure GThreadList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.UnlockList;
-begin
-  FLock.Leave;
-end;
-
-
-constructor GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Create;
-begin
-  FList := TOrderedList.Create;
-end;
-
-destructor GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Destroy;
-begin
-  FList.Free;
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.AtLeast(ACount: Integer): Boolean;
-begin
-  Result := List.Count >= ACount;
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.PeekItem: T;
-begin
-  Result := List[List.Count-1];
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.PopItem: T;
-begin
-  Result := PeekItem;
-  List.Delete(List.Count-1);
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Peek: T;
-begin
-  Result := PeekItem;
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Pop: T;
-begin
-  Result := PopItem;
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Push(const AItem: T): T;
-begin
-  PushItem(AItem);
-  Result := AItem;
-end;
-
-function GOrderedList{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.Count: Integer;
-begin
-  Result := List.Count;
-end;
-
-
-procedure GStack{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.PushItem(AItem: T);
-begin
-  List.Add(AItem);
-end;
-
-procedure GQueue{$IFNDEF GENERIC_PREFIX}<T>{$ENDIF}.PushItem(AItem: T);
-begin
-  List.Insert(0, AItem);
-end;
-
-end.

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно