(*==========================================================================;
 *
 *  Copyright (C) 1999 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       dxfile.h
 *  Content:    Interfaces to access Rendermorthics eXtensible file format
 *
 *  Direct3DX 8.0 Delphi adaptation by Alexey Barkovoy
 *  E-Mail: clootie@reactor.ru
 *
 *  completely revised by Tim Baumgarten
 *
 *  Modified: 05-Nov-2001
 *
 *  Partly based upon :
 *    DirectX 7.0 Delphi adaptation by
 *      Erik Unger, e-Mail: DelphiDirectX@next-reality.com
 *
 *  Lastest version can be downloaded from:
 *     http://www.delphi-jedi.org/DelphiGraphics/
 *
 ***************************************************************************)

(*==========================================================================;
 * History :
 *
 * 05-Nov-2001 (Tim Baumgarten) : Added
 *                                 DirectX File Template GUIDs (TID_DXFILEXXX)
                                   and Descriptions (DXFILE_XTEMPLATES).
 * 05-Nov-2001 (Tim Baumgarten) : Added DXFileErrorString.
 *
 ***************************************************************************)

{$MINENUMSIZE 4}
{$ALIGN ON}

unit DXFile;

{$IFDEF VER150}
  {$WARN UNSAFE_CODE OFF}
  {$WARN UNSAFE_TYPE OFF}
  {$WARN UNSAFE_CAST OFF}
{$ENDIF}

interface

uses Windows;

(***************************************************************************
 *
 *  Copyright (C) 1998-1999 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       dxfile.h
 *
 *  Content:    DirectX File public header file
 *
 ***************************************************************************)

function DXFileErrorString(DXErrorCode : HResult) : String;

type
  TDXFileFormat = Cardinal;

const
  DXFILEFORMAT_BINARY     = 0;
  DXFILEFORMAT_TEXT       = 1;
  DXFILEFORMAT_COMPRESSED = 2;

type
  TDXFileLoadOptions = Cardinal;

const
  DXFILELOAD_FROMFILE           = {viewgit}{/viewgit};
  DXFILELOAD_FROMRESOURCE       = ;
  DXFILELOAD_FROMMEMORY         = ;
  DXFILELOAD_FROMSTREAM         = ;
  DXFILELOAD_FROMURL            = ;

type
  PDXFileLoadResource = ^TDXFileLoadResource;
  TDXFileLoadResource = packed record
    hModule : HModule;
    lpName  : PChar;
    lpType  : PChar;
  end;

  PDXFileLoadMemory = ^TDXFileLoadMemory;
  TDXFileLoadMemory = packed record
    lpMemory : Pointer;
    dSize    : Cardinal;
  end;

(*
 * DirectX File object types.
 *)

type
  IDirectXFile = interface;
  IDirectXFileEnumObject = interface;
  IDirectXFileSaveObject = interface;
  IDirectXFileObject = interface;
  IDirectXFileData = interface;
  IDirectXFileDataReference = interface;
  IDirectXFileBinary = interface;

(*
 * DirectX File interfaces.
 *)

  IDirectXFile = interface(IUnknown)
    ['{3D82AB40-62DA-11CF-AB39-0020AF71E433}']
    function CreateEnumObject(const pvSource : Pointer; const dwLoadOptions : TDXFileLoadOptions; out ppEnumObj : IDirectXFileEnumObject) : HResult; stdcall;
    function CreateSaveObject(const szFileName : PChar; const dwFileFormat : TDXFileFormat; out ppSaveObj : IDirectXFileSaveObject) : HResult; stdcall;
    function RegisterTemplates(const pvData : Pointer; const cbSize : Cardinal) : HResult; stdcall;
  end;

  IDirectXFileEnumObject = interface (IUnknown)
    ['{3D82AB41-62DA-11CF-AB39-0020AF71E433}']
    function GetNextDataObject(out ppDataObj : IDirectXFileData) : HResult; stdcall;
    function GetDataObjectById(const rguid : TGUID; out ppDataObj : IDirectXFileData) : HResult; stdcall;
    function GetDataObjectByName(const szName : PChar; out ppDataObj : IDirectXFileData) : HResult; stdcall;
  end;

  IDirectXFileSaveObject = interface (IUnknown)
    ['{3D82AB42-62DA-11CF-AB39-0020AF71E433}']
    function SaveTemplates(const cTemplates : Cardinal; var ppguidTemplates : PGUID) : HResult; stdcall;
    function CreateDataObject(const rguidTemplate : TGUID; const szName : PChar; const pguid : PGUID; const cbSize : Cardinal; pvData: Pointer; out ppDataObj : IDirectXFileData) : HResult; stdcall;
    function SaveData(pDataObj : IDirectXFileData) : HResult; stdcall;
  end;

  IDirectXFileObject = interface (IUnknown)
    ['{3D82AB43-62DA-11CF-AB39-0020AF71E433}']
    function GetName(const pstrNameBuf : PChar; dwBufLen : PLongWord) : HResult; stdcall;
    function GetId (out pGuidBuf : TGUID) : HResult; stdcall;
  end;

  IDirectXFileData = interface (IDirectXFileObject)
    ['{3D82AB44-62DA-11CF-AB39-0020AF71E433}']
    function GetData(const szMember: PChar; var pcbSize : LongWord; out ppvData : Pointer) : HResult; stdcall;
    function GetType(out ppguid : PGUID) : HResult; stdcall;
    function GetNextObject(out ppChildObj : IDirectXFileObject) : HResult; stdcall;
    function AddDataObject(const pDataObj : IDirectXFileData) : HResult; stdcall;
    function AddDataReference(const szRef : PChar; const pguidRef : PGUID) : HResult; stdcall;
    function AddBinaryObject(const szName : PChar; const pguid : PGUID; const szMimeType : PChar; const pvData : Pointer; const cbSize : LongWord) : HResult; stdcall;
  end;

  IDirectXFileDataReference = interface (IDirectXFileObject)
    ['{3D82AB45-62DA-11CF-AB39-0020AF71E433}']
    function Resolve(out ppDataObj : IDirectXFileData) : HResult; stdcall;
  end;

  IDirectXFileBinary = interface (IDirectXFileObject)
    ['{3D82AB46-62DA-11CF-AB39-0020AF71E433}']
    function GetSize(out pcbSize : LongWord) : HResult; stdcall;
    function GetMimeType(out pszMimeType : PChar) : HResult; stdcall;
    function Read(pvData : Pointer; const cbSize : LongWord; out pcbRead : LongWord) : HResult; stdcall;
  end;


(*
 * DirectXFile Object Class Id (for CoCreateInstance())
 *)

const
  CLSID_CDirectXFile: TGUID = '{4516EC43-8F20-11D0-9B6D-0000C0781BC3}';
//  (D1:16ec43;D2:f20;D3:d0;D4:(b,d,{viewgit}{/viewgit},{viewgit}{/viewgit},$c0,,b,$c3));

(*
 * DirectX File Interface GUIDs.
 *)

type
  IID_IDirectXFile               = IDirectXFile;
  IID_IDirectXFileEnumObject     = IDirectXFileEnumObject;
  IID_IDirectXFileSaveObject     = IDirectXFileSaveObject;
  IID_IDirectXFileObject         = IDirectXFileObject;
  IID_IDirectXFileData           = IDirectXFileData;
  IID_IDirectXFileDataReference  = IDirectXFileDataReference;
  IID_IDirectXFileBinary         = IDirectXFileBinary;

(*
 * DirectX File Header template's GUID.
 *)
const

  TID_DXFILEHEADER                   : TGUID = '{3D82AB43-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEMESH                     : TGUID = '{3D82AB44-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEMVECTOR                  : TGUID = '{3D82AB5E-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEMESHFACE                 : TGUID = '{3D82AB5F-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEMATERIAL                 : TGUID = '{3D82AB4D-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEFRAME                    : TGUID = '{3D82AB46-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEFRAMETRANSFORMMATRIX     : TGUID = '{F6F23F41-7686-11CF-8F52-0040333594A3}';
  TID_DXFILEMESHMATERIALLIST         : TGUID = '{F6F23F42-7686-11CF-8F52-0040333594A3}';
  TID_DXFILEMESHTEXTURECOORDS        : TGUID = '{F6F23F40-7686-11CF-8F52-0040333594A3}';
  TID_DXFILEMESHNORMALS              : TGUID = '{F6F23F43-7686-11CF-8F52-0040333594A3}';
  TID_DXFILECOORDS2D                 : TGUID = '{F6F23F44-7686-11CF-8F52-0040333594A3}';
  TID_DXFILEMATRIX4X4                : TGUID = '{F6F23F45-7686-11CF-8F52-0040333594A3}';
  TID_DXFILEANIMATION                : TGUID = '{3D82AB4F-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEANIMATIONSET             : TGUID = '{3D82AB50-62DA-11CF-AB39-0020AF71E433}';
  TID_DXFILEANIMATIONKEY             : TGUID = '{10DD46A8-775B-11CF-8F52-0040333594A3}';
  TID_DXFILEFLOATKEYS                : TGUID = '{10DD46A9-775B-11CF-8F52-0040333594A3}';
  TID_DXFILECOLORRGBA                : TGUID = '{35FF44E0-6C7C-11CF-8F52-0040333594A3}';
  TID_DXFILECOLORRGB                 : TGUID = '{D3E16E81-7835-11CF-8F52-0040333594A3}';
  TID_DXFILETEXTUREFILENAME          : TGUID = '{A42790E1-7810-11CF-8F52-0040333594A3}';
  TID_DXFILEINDEXEDCOLOR             : TGUID = '{1630B820-7842-11CF-8F52-0040333594A3}';
  TID_DXFILEBOOLEAN                  : TGUID = '{4885AE61-78E8-11CF-8F52-0040333594A3}';
  TID_DXFILEBOOLEAN2D                : TGUID = '{4885AE63-78E8-11CF-8F52-0040333594A3}';
  TID_DXFILEMESHVERTEXCOLORS         : TGUID = '{1630B821-7842-11CF-8F52-0040333594A3}';
  TID_DXFILEMESHFACEWRAPS            : TGUID = '{ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B}';
  TID_DXFILETIMEDFLOATKEYS           : TGUID = '{F406B180-7B3B-11CF-8F52-0040333594A3}';
  TID_DXFILEANIMATIONOPTIONS         : TGUID = '{E2BF56C0-840F-11CF-8F52-0040333594A3}';
  TID_DXFILEQUATERNION               : TGUID = '{10DD46A3-775B-11cf-8F52-0040333594A3}';
  TID_DXFILEPATCH                    : TGUID = '{A3EB5D44-FC22-429D-9AFB-3221CB9719A6}';
  TID_DXFILEPATCHMESH                : TGUID = '{D02C95CC-EDBA-4305-9B5D-1820D7704BBF}';
  TID_DXFILEVERTEXDUPLICATIONINDICES : TGUID = '{B8D65549-D7C9-4995-89CF-53A9A8B031E3}';
  TID_DXFILEXSKINMESHHEADER          : TGUID = '{3CF169CE-FF7C-44ab-93C0-F78F62D172E2}';
  TID_DXFILESKINWEIGHTS              : TGUID = '{6F0D123B-BAD2-4167-A0D0-80224F25FABB}';

  DXFILE_XTEMPLATE_BYTES  = 3278;

  DXFILE_XTEMPLATES : array [0..DXFILE_XTEMPLATE_BYTES-1] of Byte = (
        , f, , , , , , , , , e, , , , , , f, 0, ,
        0, , 0, 0, 0, , , , , , , $a, 0, , 0, , $ab, , d, $da,
        , $cf, , $ab, , 0, , $af, , $e4, , , 0, , 0, , 0, 0, 0, d,
        , a, f, , , 0, , 0, , 0, , 0, 0, 0, d, , e, f, , ,
        0, , 0, , 0, , 0, 0, 0, , c, , , , , 0, $b, 0, f, 0,
        , 0, , 0, 0, 0, , , , , f, , $a, 0, , 0, e, $ab, , d,
        $da, , $cf, , $ab, , 0, , $af, , $e4, , a, 0, , 0, , 0, 0, 0,
        , , 0, a, 0, , 0, , 0, 0, 0, , , 0, a, 0, , 0, , 0,
        0, 0, a, , 0, $b, 0, f, 0, , 0, , 0, 0, 0, , f, f, , ,
        , , , $a, 0, , 0, , f, $f2, $f6, , , $cf, , f, , 0, , ,
        , , $a3, a, 0, , 0, , 0, 0, 0, , , 0, a, 0, , 0, , 0,
        0, 0, , , 0, $b, 0, f, 0, , 0, , 0, 0, 0, d, , , , ,
        , , , , $a, 0, , 0, , f, $f2, $f6, , , $cf, , f, , 0, ,
        , , , $a3, , 0, a, 0, , 0, , 0, 0, 0, d, , , , , ,
        $e, 0, , 0, , 0, 0, 0, $f, 0, , 0, $b, 0, f, 0, , 0, , 0,
        0, 0, , f, c, f, , , , , , $a, 0, , 0, $e0, , $ff, , c,
        c, $cf, , f, , 0, , , , , $a3, a, 0, , 0, , 0, 0, 0, ,
        , , , 0, a, 0, , 0, , 0, 0, 0, , , , , e, , 0, a,
        0, , 0, , 0, 0, 0, , c, , , , 0, a, 0, , 0, , 0, 0,
        0, , c, , , , , 0, $b, 0, f, 0, , 0, , 0, 0, 0, , f,
        c, f, , , , , $a, 0, , 0, , e, $e1, $d3, , , $cf, , f, ,
        0, , , , , $a3, a, 0, , 0, , 0, 0, 0, , , , , 0, a,
        0, , 0, , 0, 0, 0, , , , , e, , 0, a, 0, , 0, , 0,
        0, 0, , c, , , , 0, $b, 0, f, 0, , 0, $c, 0, 0, 0, , e,
        , , , , , , f, c, f, , $a, 0, , 0, , $b8, , , , ,
        $cf, , f, , 0, , , , , $a3, , 0, , 0, , 0, 0, 0, , e,
        , , , , 0, , 0, , 0, 0, 0, , f, c, f, , , , , ,
        , 0, $a, 0, 0, 0, , e, , , , , f, c, f, , , 0, $b, 0,
        f, 0, , 0, , 0, 0, 0, , f, f, c, , , e, $a, 0, , 0, $a0,
        $a6, d, , , $ca, $d0, , , c, 0, , $c8, $c, $fa, b, , 0, , 0, ,
        0, 0, 0, , , , , , , c, , , , 0, $b, 0, f, 0, , 0,
        , 0, 0, 0, , f, f, c, , , e, , , $a, 0, , 0, , $ae, ,
        , $e8, , $cf, , f, , 0, , , , , $a3, , 0, , 0, 0, 0, ,
        f, f, c, , , e, , 0, , 0, 0, 0, , , 0, , 0, , 0, 0,
        0, , f, f, c, , , e, , 0, , 0, 0, 0, , , 0, $b, 0, f,
        0, , 0, $c, 0, 0, 0, d, , , , , , , c, , , , , $a,
        0, , 0, , $ae, , , $e8, , $cf, , f, , 0, , , , , $a3, ,
        0, , 0, 0, 0, , f, f, c, , , e, , 0, , 0, 0, 0, , ,
        0, , 0, , 0, 0, 0, , f, f, c, , , e, , 0, , 0, 0, 0,
        , , 0, $b, 0, f, 0, , 0, $f, 0, 0, 0, , , , , , , ,
        , , c, , e, , d, , $a, 0, , 0, $e1, , , $a4, , , $cf, ,
        f, , 0, , , , , $a3, , 0, , 0, , 0, 0, 0, , , c, ,
        e, , d, , , 0, $b, 0, f, 0, , 0, , 0, 0, 0, d, , , ,
        , , , c, $a, 0, , 0, d, $ab, , d, $da, , $cf, , $ab, , 0, ,
        $af, , $e4, , , 0, , 0, 0, 0, , f, c, f, , , , , , ,
        0, , 0, 0, 0, , , , , , f, c, f, , , 0, a, 0, , 0,
        , 0, 0, 0, , f, , , , , 0, , 0, , 0, 0, 0, , f, c,
        f, , , , , , 0, $d, 0, 0, 0, , , , , , c, , , ,
        f, c, f, , , 0, , 0, , 0, 0, 0, , f, c, f, , , , ,
        , 0, $d, 0, 0, 0, , d, , , , , , , , f, c, f, , ,
        0, $e, 0, , 0, , 0, , 0, $f, 0, $b, 0, f, 0, , 0, , 0, 0,
        0, d, , , , , , , , $a, 0, , 0, f, $ab, , d, $da, , $cf,
        , $ab, , 0, , $af, , $e4, , , 0, , 0, , 0, 0, 0, e, , ,
        , , , , , , , , , e, , , , , , , 0, , 0, ,
        0, , 0, , 0, 0, 0, , , , , , , , , , , , e, ,
        , , , , $e, 0, , 0, , 0, 0, 0, e, , , , , , , ,
        , , , , e, , , , , , $f, 0, , 0, $b, 0, f, 0, , 0,
        $d, 0, 0, 0, d, , , , , , , , , , , , , $a, 0, ,
        0, $c0, $c5, e, $ed, $a8, $c0, $d0, , , c, 0, , $c8, $c, $fa, b, , 0, ,
        0, $f, 0, 0, 0, e, , , , , , , , , , , c, , , ,
        , 0, , 0, , 0, , 0, 0, 0, , f, f, c, , , e, , , ,
        0, $e, 0, 0, 0, , , , , , , , , , , c, , , , $e,
        0, , 0, $f, 0, 0, 0, e, , , , , , , , , , , c, ,
        , , $f, 0, , 0, $b, 0, f, 0, , 0, , 0, 0, 0, d, , , ,
        , , , , , , , , f, f, , , , $a, 0, , 0, , f, $f2,
        $f6, , , $cf, , f, , 0, , , , , $a3, , 0, , 0, $e, 0, 0,
        0, e, , , , , , , , , f, f, , , , , 0, , 0, ,
        0, , 0, 0, 0, , f, f, , , , , , , 0, $d, 0, 0, 0, ,
        , , , , , , , f, f, , , , $e, 0, , 0, $e, 0, 0, 0,
        e, , , , , , , , , f, f, , , , $f, 0, , 0, $b, 0,
        f, 0, , 0, , 0, 0, 0, d, , , , d, , , , , , , c,
        c, , , , $a, 0, , 0, , f, $f2, $f6, , , $cf, , f, , 0, ,
        , , , $a3, , 0, , 0, $a, 0, 0, 0, e, d, , , , , , ,
        c, , , 0, , 0, , 0, $c, 0, 0, 0, e, , , , , , e, ,
        , , , , , 0, , 0, , 0, , 0, $b, 0, 0, 0, , , , ,
        , e, , , , , , $e, 0, , 0, $c, 0, 0, 0, e, , , , ,
        , e, , , , , , $f, 0, , 0, $e, 0, , 0, , 0, 0, 0, d,
        , , , , , , c, $f, 0, $b, 0, f, 0, , 0, $b, 0, 0, 0, d,
        , , , e, f, , d, , c, , $a, 0, , 0, , f, $f2, $f6, , ,
        $cf, , f, , 0, , , , , $a3, , 0, , 0, , 0, 0, 0, e, e,
        f, , d, , c, , , 0, , 0, , 0, , 0, 0, 0, , , , ,
        f, , , 0, , 0, 0, 0, e, f, , d, , c, , $e, 0, , 0, ,
        0, 0, 0, e, e, f, , d, , c, , $f, 0, , 0, , 0, , 0, $c,
        0, 0, 0, e, , , , , e, f, , d, , c, , , 0, , 0, ,
        0, , 0, 0, 0, d, , , , , , , , , 0, $b, 0, 0, 0, ,
        , , , e, f, , d, , c, , $e, 0, , 0, $c, 0, 0, 0, e, ,
        , , , e, f, , d, , c, , $f, 0, , 0, $b, 0, f, 0, , 0,
        , 0, 0, 0, d, , , , , , , , , , , f, c, f, , ,
        $a, 0, , 0, , $b8, , , , , $cf, , f, , 0, , , , , $a3,
        , 0, , 0, $d, 0, 0, 0, e, , , , , , , , f, c, f, ,
        , , 0, , 0, , 0, $c, 0, 0, 0, , e, , , , , , , f,
        c, f, , , 0, $c, 0, 0, 0, , , , , , , , f, c, f, ,
        , $e, 0, , 0, $d, 0, 0, 0, e, , , , , , , , f, c, f,
        , , $f, 0, , 0, $b, 0, f, 0, , 0, , 0, 0, 0, d, , , ,
        $a, 0, , 0, , $ab, , d, $da, , $cf, , $ab, , 0, , $af, , $e4, ,
        , 0, , 0, , 0, 0, 0, e, , , , , , , , , , 0, ,
        0, , 0, , 0, 0, 0, , , , , f, , , 0, , 0, 0, 0, ,
        , , , , , , , $e, 0, , 0, , 0, 0, 0, e, , , , ,
        , , , , $f, 0, , 0, , 0, , 0, , 0, 0, 0, e, , , ,
        , , , 0, , 0, , 0, , 0, 0, 0, d, , , , , , , ,
        , 0, , 0, 0, 0, , , , , , $e, 0, , 0, , 0, 0, 0, e,
        , , , , , $f, 0, , 0, $e, 0, , 0, , 0, , 0, $f, 0, $b,
        0, f, 0, , 0, , 0, 0, 0, , , , d, , , , , e, , ,
        f, , d, d, , , , , , $a, 0, , 0, , f, $f2, $f6, , , $cf,
        , f, , 0, , , , , $a3, , 0, , 0, 0, 0, d, , , , ,
        , , , , , 0, $b, 0, 0, 0, , , , d, , d, , , , ,
        , , 0, $b, 0, f, 0, , 0, , 0, 0, 0, , , , d, , $a, 0,
        , 0, , $ab, , d, $da, , $cf, , $ab, , 0, , $af, , $e4, , $e, 0,
        , 0, , 0, , 0, $f, 0, $b, 0, f, 0, , 0, , 0, 0, 0, , c,
        f, , , b, , , , $a, 0, , 0, $a9, , $dd, , b, , $cf, , f,
        , 0, , , , , $a3, , 0, , 0, , 0, 0, 0, e, , , c, ,
        , , , 0, , 0, a, 0, , 0, , 0, 0, 0, , , c, , , ,
        $e, 0, , 0, , 0, 0, 0, e, , , c, , , , $f, 0, , 0, $b,
        0, f, 0, , 0, $e, 0, 0, 0, , , d, , , , c, f, , , b,
        , , , $a, 0, , 0, , $b1, , $f4, b, b, $cf, , f, , 0, , ,
        , , $a3, , 0, , 0, , 0, 0, 0, , , d, , , 0, , 0, ,
        0, 0, 0, , c, f, , , b, , , , , 0, , 0, 0, 0, , ,
        b, , , , , 0, $b, 0, f, 0, , 0, $c, 0, 0, 0, , e, , d,
        , , , f, e, b, , , $a, 0, , 0, $a8, , $dd, , b, , $cf, ,
        f, , 0, , , , , $a3, , 0, , 0, , 0, 0, 0, b, , , ,
        , , , , 0, , 0, , 0, , 0, 0, 0, e, b, , , , , 0,
        , 0, , 0, $e, 0, 0, 0, , , d, , , , c, f, , , b, ,
        , , , 0, , 0, 0, 0, b, , , , $e, 0, , 0, , 0, 0, 0,
        e, b, , , , $f, 0, , 0, $b, 0, f, 0, , 0, , 0, 0, 0, ,
        e, , d, , , , f, e, f, , , , f, e, , $a, 0, , 0, $c0,
        , $bf, $e2, $f, , $cf, , f, , 0, , , , , $a3, , 0, , 0, $a,
        0, 0, 0, f, , , e, , c, f, , , , , 0, , 0, , 0, $f,
        0, 0, 0, , f, , , , , f, e, , , , c, , , , , 0,
        $b, 0, f, 0, , 0, , 0, 0, 0, , e, , d, , , , f, e, $a,
        0, , 0, f, $ab, , d, $da, , $cf, , $ab, , 0, , $af, , $e4, , $e,
        0, , 0, , 0, , 0, $f, 0, $b, 0, f, 0, , 0, $c, 0, 0, 0, ,
        e, , d, , , , f, e, , , , $a, 0, , 0, , $ab, , d, $da,
        , $cf, , $ab, , 0, , $af, , $e4, , $e, 0, , 0, , 0, 0, 0, ,
        e, , d, , , , f, e, $f, 0, $b, 0, f, 0, , 0, $a, 0, 0, 0,
        , e, c, , e, , , , , , $a, 0, , 0, $a0, $ee, , a, $b1, ,
        $d0, , $ab, , 0, , $af, , $e4, , $e, 0, , 0, , 0, 0, 0, , ,
        e, , , , $f, 0, $b, 0, f, 0, , 0, , 0, 0, 0, , , c, $a,
        0, , 0, $a1, $ee, , a, $b1, , $d0, , $ab, , 0, , $af, , $e4, , ,
        0, , 0, , 0, 0, 0, e, , , c, , , 0, , 0, , 0, , 0,
        , 0, 0, 0, , , c, , $e, 0, , 0, , 0, 0, 0, e, , , c,
        , $f, 0, , 0, $b, 0, f, 0, , 0, $f, 0, 0, 0, , , f, , ,
        , , , , , , d, , , , $a, 0, , 0, , $c3, , a, d, ,
        $d0, , , c, 0, , $c8, $c, $fa, b, $e, 0, , 0, , 0, 0, 0, , ,
        c, , 0, , 0, $a, 0, 0, 0, , e, c, , e, , , , , , $f,
        0, $b, 0, f, 0, , 0, , 0, 0, 0, , , , , $a, 0, , 0, $e0,
        , , $a4, , , $cf, , f, , 0, , , , , $a3, , 0, , 0, ,
        0, 0, 0, , , , , , , 0, , 0, , 0, , 0, 0, 0, , ,
        , , , , 0, , 0, , 0, , 0, 0, 0, , , , , , , 0,
        , 0, d, 0, , 0, , 0, 0, 0, , , , , , $e, 0, , 0, ,
        0, 0, 0, $f, 0, , 0, $b, 0, f, 0, , 0, $e, 0, 0, 0, , , ,
        , e, , , , f, , , , , , $a, 0, , 0, $e0, , $f, f, $e1,
        $bf, $d1, , , $c0, 0, $a0, $c9, , , , , 0, , 0, , 0, 0, 0, b,
        , , , 0, , 0, , 0, , 0, 0, 0, , , c, , , , 0, $b,
        0, f, 0, , 0, $b, 0, 0, 0, , , f, , , , , , , , ,
        $a, 0, , 0, $e1, , $f, f, $e1, $bf, $d1, , , $c0, 0, $a0, $c9, , , ,
        $e, 0, , 0, $e, 0, 0, 0, , , , , e, , , , f, , , ,
        , , $f, 0, $b, 0, f, 0, , 0, $e, 0, 0, 0, , , , , , e,
        , c, , , , , , c, $a, 0, , 0, $a0, a, , , $ba, $bd, $d1, ,
        , $c0, 0, $a0, $c9, , , , , 0, , 0, 0, 0, , , , , , 0,
        , 0, 0, 0, , , , , , , , , , e, , c, , , , ,
        , c, , 0, $e, 0, , 0, , 0, , 0, $f, 0, $b, 0, f, 0, , 0,
        $b, 0, 0, 0, , , , , , , , e, , , , $a, 0, , 0, $a0,
        e, d, f, a, $d5, $d1, , , $c0, 0, $a0, $c9, , , , , 0, , 0, $c,
        0, 0, 0, , , , , , , , , e, , , , , 0, $b, 0);

(*
 * DirectX File errors.
 *)

const
  _FACD3D = 6;

//#define MAKE_DDHRESULT( code )  MAKE_HRESULT( 1, _FACD3D, code )
function MAKE_DDHRESULT(Code: DWord): DWord;

const
  MAKE_DDHRESULT_D     = (1 shl 31) or (_FACD3D shl 16);

  DXFILE_OK                           = 0;

  DXFILEERR_BADOBJECT                 = HResult(MAKE_DDHRESULT_D or 850);
  DXFILEERR_BADVALUE                  = HResult(MAKE_DDHRESULT_D or 851);
  DXFILEERR_BADTYPE                   = HResult(MAKE_DDHRESULT_D or 852);
  DXFILEERR_BADSTREAMHANDLE           = HResult(MAKE_DDHRESULT_D or 853);
  DXFILEERR_BADALLOC                  = HResult(MAKE_DDHRESULT_D or 854);
  DXFILEERR_NOTFOUND                  = HResult(MAKE_DDHRESULT_D or 855);
  DXFILEERR_NOTDONEYET                = HResult(MAKE_DDHRESULT_D or 856);
  DXFILEERR_FILENOTFOUND              = HResult(MAKE_DDHRESULT_D or 857);
  DXFILEERR_RESOURCENOTFOUND          = HResult(MAKE_DDHRESULT_D or 858);
  DXFILEERR_URLNOTFOUND               = HResult(MAKE_DDHRESULT_D or 859);
  DXFILEERR_BADRESOURCE               = HResult(MAKE_DDHRESULT_D or 860);
  DXFILEERR_BADFILETYPE               = HResult(MAKE_DDHRESULT_D or 861);
  DXFILEERR_BADFILEVERSION            = HResult(MAKE_DDHRESULT_D or 862);
  DXFILEERR_BADFILEFLOATSIZE          = HResult(MAKE_DDHRESULT_D or 863);
  DXFILEERR_BADFILECOMPRESSIONTYPE    = HResult(MAKE_DDHRESULT_D or 864);
  DXFILEERR_BADFILE                   = HResult(MAKE_DDHRESULT_D or 865);
  DXFILEERR_PARSEERROR                = HResult(MAKE_DDHRESULT_D or 866);
  DXFILEERR_NOTEMPLATE                = HResult(MAKE_DDHRESULT_D or 867);
  DXFILEERR_BADARRAYSIZE              = HResult(MAKE_DDHRESULT_D or 868);
  DXFILEERR_BADDATAREFERENCE          = HResult(MAKE_DDHRESULT_D or 869);
  DXFILEERR_INTERNALERROR             = HResult(MAKE_DDHRESULT_D or 870);
  DXFILEERR_NOMOREOBJECTS             = HResult(MAKE_DDHRESULT_D or 871);
  DXFILEERR_BADINTRINSICS             = HResult(MAKE_DDHRESULT_D or 872);
  DXFILEERR_NOMORESTREAMHANDLES       = HResult(MAKE_DDHRESULT_D or 873);
  DXFILEERR_NOMOREDATA                = HResult(MAKE_DDHRESULT_D or 874);
  DXFILEERR_BADCACHEFILE              = HResult(MAKE_DDHRESULT_D or 875);
  DXFILEERR_NOINTERNET                = HResult(MAKE_DDHRESULT_D or 876);

(*
 * API for creating IDirectXFile interface.
 *)

function DirectXFileCreate(out lplpDirectXFile : IDirectXFile) : HResult; stdcall;

implementation

//#define MAKE_D3DHRESULT( code )  MAKE_HRESULT( 1, _FACD3D, code )
function MAKE_DDHRESULT(Code: DWord): DWord;
begin
  Result:= DWord((1 shl 31) or (_FACD3D shl 16)) or Code;
end;

function DXFileErrorString(DXErrorCode : HResult) : String;
begin
  case DXErrorCode of
    HResult(DXFILE_OK)                        : Result := 'Command completed successfully.';
    HResult(DXFILEERR_BADOBJECT)              : Result := 'Object is invalid.';
    HResult(DXFILEERR_BADVALUE)               : Result := 'Parameter is invalid.';
    HResult(DXFILEERR_BADTYPE)                : Result := 'Object type is invalid.';
    HResult(DXFILEERR_BADSTREAMHANDLE)        : Result := 'Streamhandle is invalid.'; //Not in Docu.
    HResult(DXFILEERR_BADALLOC)               : Result := 'Memory allocation failed.';
    HResult(DXFILEERR_NOTFOUND)               : Result := 'Object could not be found.';
    HResult(DXFILEERR_NOTDONEYET)             : Result := 'Operation has not completed.';
    HResult(DXFILEERR_FILENOTFOUND)           : Result := 'File could not be found.';
    HResult(DXFILEERR_RESOURCENOTFOUND)       : Result := 'Resource could not be found.';
    HResult(DXFILEERR_URLNOTFOUND)            : Result := 'URL could not be found';
    HResult(DXFILEERR_BADRESOURCE)            : Result := 'Resource is invalid.';
    HResult(DXFILEERR_BADFILETYPE)            : Result := 'File is not a DirectX (.x) file.';
    HResult(DXFILEERR_BADFILEVERSION)         : Result := 'File version is not valid.';
    HResult(DXFILEERR_BADFILEFLOATSIZE)       : Result := 'Floating-point size is invalid.';
    HResult(DXFILEERR_BADFILECOMPRESSIONTYPE) : Result := 'File compression type is invalid.';
    HResult(DXFILEERR_BADFILE)                : Result := 'File is invalid.';
    HResult(DXFILEERR_PARSEERROR)             : Result := 'File could not be parsed.';
    HResult(DXFILEERR_NOTEMPLATE)             : Result := 'No template available.';
    HResult(DXFILEERR_BADARRAYSIZE)           : Result := 'Array size is invalid.';
    HResult(DXFILEERR_BADDATAREFERENCE)       : Result := 'Data reference is invalid.';
    HResult(DXFILEERR_INTERNALERROR)          : Result := 'Internal error occurred.';
    HResult(DXFILEERR_NOMOREOBJECTS)          : Result := 'All objects have been enumerated.';
    HResult(DXFILEERR_BADINTRINSICS)          : Result := 'Intrinsics are invalid.';
    HResult(DXFILEERR_NOMORESTREAMHANDLES)    : Result := 'No stream handles are available.';
    HResult(DXFILEERR_NOMOREDATA)             : Result := 'No further data is available.';
    HResult(DXFILEERR_BADCACHEFILE)           : Result := 'The cache file containing the .x file date is invalid. A cache file contains data retrieved from the network, cached on the hard disk, and retrieved in subsequent requests.';
    HResult(DXFILEERR_NOINTERNET)             : Result := 'Internet connection not found.';
    else Result := 'Unknown Error';
  end;
end;

(*
 * API for creating IDirectXFile interface.
 *)

const
  DXFileDLL = 'D3DXOF.DLL';

function DirectXFileCreate; external DXFileDLL;

end.